Подтвердить что ты не робот

Создание базового сценария сокета TCP/С++

Ниже приведен следующий базовый код сокета:

//General includes:
#include <iostream>
#include <stdio.h>
#include <string>

//Network related includes:
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>

//Target host details:
#define PORT 1234
#define HOST "74.74.74.74"

using namespace std;

//Function prototypes:
string MessageFormat(int, char**);
void MessageSend(string);

int main(int argc, char *argv[])
{
    //Parse arguments and format message:
    string message = MessageFormat(argc, argv);

    //Send the message out: 
    MessageSend(message);

    return 0;
}

string MessageFormat(int argc, char *argv[])
{
    //Massage the command line parameters
    // into my desired payload format.

    return message;
}

void MessageSend(string message)
{
    int sd, ret;
    struct sockaddr_in server;
    struct in_addr ipv4addr;
    struct hostent *hp;

    sd = socket(AF_INET,SOCK_DGRAM,0);
    server.sin_family = AF_INET;

    inet_pton(AF_INET, HOST, &ipv4addr);
    hp = gethostbyaddr(&ipv4addr, sizeof ipv4addr, AF_INET);
    //hp = gethostbyname(HOST);

    bcopy(hp->h_addr, &(server.sin_addr.s_addr), hp->h_length);
    server.sin_port = htons(PORT);

    connect(sd, (const sockaddr *)&server, sizeof(server));
    send(sd, (char *)message.c_str(), strlen((char *)message.c_str()), 0);
}

Это довольно основательно и на самом деле работает. ОДНАКО, он отправляет UDP-пакеты вместо TCP-пакетов, поэтому целевой хост ожидает, что TCP отклонит их. Кроме того, проверяя значения connect/send и просматривая мои интерфейсы с помощью ngrep, я могу на 100% проверить, что пакет выходит, так что это не проблема.

Меня интересует только то, что у меня есть, а не создание полнофункционального сервера с boost asio. Как я могу настроить его так, чтобы он работал в терминах TCP вместо UDP?

4b9b3361

Ответ 1

Ниже перечислены изменения, которые необходимо выполнить для передачи данных через TCP

  • При создании правильных параметров доступа сокета. В приведенном выше примере вы передали SOCK_DGRAM вместо этого SOCK_STREAM.

  • После того, как сервер привязки должен перейти в режим прослушивания (проверьте ручную страницу прослушивания) в то время как клиентская сторона должна подключаться после создания сокета.

  • Затем примите на стороне сервера после прослушивания.

  • Заключительные Чтение и запись для передачи данных

Приведенная диаграмма даст вам четкое представление о подключении TCP

TCP Socket programming

Вы можете проверить страницы руководства для получения подробной информации обо всех функциях или справочника beej reeer для программирования сокетов (используйте эту ссылку)