c ++ - Send andre datatyper i winsock2

Indlæg af Hanne Mølgaard Plasc

Problem



Send-funktionen i winsock2 accepterer kun char pointers.
Hvordan sender jeg også heltal eller objekter gennem det?

Bedste reference


const char *buf som du skal overføre til send() funktion som et argument er blot en pointer til array af bytes. Du skal konvertere heltal til byte:


const int MAX\_BUF\_SIZE = 1024;
int int\_data = 4;
const char *str\_data = "test";

char *buf = (char*) malloc(MAX\_BUF\_SIZE);
char *p = buf;

memcpy(&int\_data, p, sizeof(int\_data));
p += sizeof(int\_data);

strcpy(p, str\_data);
p += strlen(str\_data) + 1;

send(sock, buf, p - buf, 0);

free(buf);


og læsekode:


const int MAX\_BUF\_SIZE = 1024;
int int\_data = 0;
const char *str\_data = NULL;

char *buf = (char*) malloc(MAX\_BUF\_SIZE);
char *p = buf;

recv(sock, buf, MAX\_BUF\_SIZE, 0);

memcpy(p, &int\_data, sizeof(int\_data));
p += sizeof(int\_data);

str\_data = malloc(strlen(p) + 1);
strcpy(str\_data, p);
p += strlen(p) + 1;

free(buf);


og komplekse objekter skal serialiseres til strøm af bytes.


Note 1: Kodeprøven er gyldig, hvis både server og klient bruger de samme platforme (x32/x64/...), som betyder int, har samme antal byte og byteordre er de samme.


Note 2: Skrivekoden skal kontrollere, at der ikke er nogen buffer (MAX\_BUF\_SIZE) overløb på hvert trin.

Andre referencer 1


Gem kun værdien i en variabel, og skriv derefter variablen til char*. Funktionerne send() og recv() virker på binære data, på trods af at man tager char* parametre.


Sender:


int int\_data = 4;
send(sock, (char*) &int\_data, sizeof(int), 0);


Læsning:


int int\_data;
recv(sock, (char*) &int\_data, sizeof(int), 0);

Andre referencer 2


Generelt er den nemmeste måde at udskrive heltalet eller objektet på en streng og sende den pågældende streng. Tekstrepræsentationer er mere bærbare og lettere at debugere.


std::stringstream kan være en nyttig klasse både for at skabe strengen og parse den i den anden ende.