2013-05-10 9 views
11

Poniżej jest następujący podstawowy kod gniazdo wymyśliłem:Tworzenie podstawowego C/C++ gniazda TCP pisarza

//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); 
} 

Jest to dość proste, a nie w rzeczywistości pracy. JEDNAK, wysyła pakiety UDP zamiast pakietów TCP, więc host docelowy oczekujący, że TCP je odrzuci. Ponadto, sprawdzając wartości connect/send i oglądając moje interfejsy z ngrep, mogę w 100% zweryfikować, czy pakiet wychodzi, więc to nie jest problem.

Interesuje mnie tylko modyfikowanie tego, co mam, a nie tworzenie w pełni funkcjonalnego serwera z doładowaniem asio. Jak mogę zmienić to tak, aby działało pod kątem TCP zamiast UDP?

+3

Zmień "SOCK_DGRAM" na "SOCK_STREAM" '. (Clue: UDP = User ** Datagram ** Protocol). – BoBTFish

+1

Oczywiście. Dzięki. – kmarks2

Odpowiedz

22

Poniżej przedstawiono zmiany, które trzeba wprowadzić do przesyłania danych za pośrednictwem protokołu TCP

  1. Tworząc gniazdo przejścia prawidłowych parametrów .in powyżej przykład pan przeszedł SOCK_DGRAM zamiast przechodzić SOCK_STREAM.

  2. Po podłączeniu serwer powinien przejść do trybu nasłuchiwania (sprawdź stronę podręcznika nasłuchiwania) , a strona klienta powinna się połączyć po utworzeniu gniazda.

  3. Następnie zaakceptuj po stronie serwera po odsłuchaniu.

  4. Finał odczytu i zapisu do przesyłania danych

Schemat dołączony daje jasny obraz tego połączenia TCP

TCP Socket programming

Można sprawdzić strony podręcznika do szczegółowych informacji na temat wszystkich funkcji lub odejmij instrukcję beej'a dotyczącą programowania gniazd (użyj linku this)

Powiązane problemy