2013-05-10 3 views
11

Ниже следующие основные сокет код, который я придумал:Создание базового C/C++ 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% пакет, так что это не проблема.

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

+3

Изменить 'SOCK_DGRAM' на' SOCK_STREAM '. (Clue: UDP = User ** Datagram ** Protocol). – BoBTFish

+1

Конечно. Благодарю. – kmarks2

ответ

22

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

  1. При создании сокета пасс правильных параметров .в выше примера вы прошли SOCK_DGRAM вместо пройти SOCK_STREAM.

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

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

  4. Final Чтение и запись для передачи данных

Схема прилагается даст вам четкое представление о связи TCP

TCP Socket programming

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

Смежные вопросы