Hvordan å rense en mottaksbuffer Socket i C

Når du mottar data fra en stikkontakt i en buffer, er det viktig å oppdage når kontakten lukker, slik at du ikke venter for flere pakker på ubestemt tid. The Windows Sockets API (winsock) gir et grensesnitt for C-program for å samhandle med den underliggende TCP / IP-protokollstakken. Samle vertsserveren informasjon, skape en stikkontakt, kobler du den til verten og deretter motta data med "recv" funksjon i en buffer til du får en feilmelding eller melding "TCP FIN".

Bruksanvisning

1 Åpne C-filen i et redigeringsprogram, for eksempel Microsoft Visual Studio Express.

2 Ta med overskrifter som er nødvendige for å arbeide med uttak og filer ved å legge til følgende kode på toppen av filen:

inkluderer <winsock2.h> inkluder <ws2tcpip.h> inkludere <stdio.h>

3 Hente inn vertsinformasjonen med "getaddrinfo" -funksjonen ved å legge til følgende kode i funksjon:

struct addrinfo hint, * res;

int SFD;

char buffer [512];

int nrecv;

memset (og hint, 0, sizeof hint);

hints.ai_socktype = SOCK_STREAM;

hints.ai_family = AF_UNSPEC;

getaddrinfo ( "www.server.com", "3500", og hint, og res);

Bytt vertsadressen for "www.server.com" og havnen i "3500" med informasjonen for serveren du kobler til. Den "SOCK_STREAM" verdi angir at kontakten skal bruke TCP, som er en pålitelig to-veis forbindelse.

4 Lag en stikkontakt med vertsinformasjonen ved å legge til følgende kode:

SFD = socket (De-> ai_family, De-> ai_socktype, res-> ai_protocol);

5 Koble kontakten med "connect" funksjon, bruk av filen descriptor fra "socket" funksjon, ved å legge til følgende kode:

koble (SFD, De-> ai_addr, res-> ai_addrlen);

6 Åpne en fil for å skrive til med "fopen" funksjonen ved å legge til følgende kode:

FIL * fp;

fp = fopen ( "file.rar", "wb");

7 Motta informasjon i buffer med "recv" -funksjonen ved å legge til følgende kode:

int num_written = 0;

while ((nrecv = recv (SFD, buffer, sizeof buffer, 0))> 0) {

char * pbuf = buffer;

while (nrecv> 0) {

num_written = fwrite(pbuf, sizeof(char), nrecv, fp);

pbuf + = num_written;

nrecv - = num_written;

}

}

Sløyfen vil fortsette å motta informasjon til en feil, som returnerer en negativ verdi, eller til den mottar en melding "TCP FIN", som har en verdi på 0.

8 Lagre C-filen, kompilere og kjøre programmet for å motta informasjon fra socket-tilkobling.