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.