recv
-
Hallo,
wie macht man es mit "int recv(socket,buffer,length,flag)" wenn man Daten empfangen will, aber nicht weiss wie groß?
PS: 1) recv ist eine blocking Methode=>keine Daten: blocked
2) recv bekommt max. buffer-groß DatenGrüße
-
ich habe es mit select probiert, und hier sind Abschnitte(ich lese von siteSocket)
recv(siteSocket,recvData,MAX_DATA_SIZE-1, 0); fd_set readfds; FD_ZERO(&readfds); FD_SET(siteSocket, &readfds); struct timeval tv = {4, 0}; int fdselect = select(siteSocket+1,&readfds,NULL,NULL,&tv); int isset = FD_ISSET(siteSocket, &readfds); while(isset) { recvBytesRemPro = recv(siteSocket,recvData,MAX_DATA_SIZE-1, 0); Console::WriteLine(S"I am in the if! {0}", fdselect.ToString()); FD_ZERO(&readfds); FD_SET(siteSocket, &readfds); select(0,&readfds,NULL,NULL,&tv); isset = FD_ISSET(siteSocket, &readfds); } Console::WriteLine(S"I am outside the if!");
dadrin ist keine Funktionalität, das ist nur zum Testen, aber er loopt bis unendlich, obwohl ich sicher bin, dass es soviel Data zum Empfang nicht gibt.
Stimmt etwas denn nicht??
-
int rc=0; while( (rc = recv(siteSocket,recvData,sizeof(recvData)-1,0)) > 0) { recvData[rc] = '\0'; cout << recvData; };
So ungefähr sollte es aussehen... wenn nichts mehr kommt ists zuende sonst empfängt das Programm einfach weiter...
-
Original erstellt von particle:
**```cpp
int rc=0;
while( (rc = recv(siteSocket,recvData,sizeof(recvData)-1,0)) > 0)
{
recvData[rc] = '\0';
cout << recvData;
};aber recv ist blockierend, und wenn nichts zu empfangen ist, dann liefert sie nicht 0, sondern wartet solange, bis etwas neues ankommt, oder ?
-
Nein, bei Non-Blocking Sockets gibt es -1 zurück (=SOCKET_ERROR mit Erweiterung WSAEWOULDBLOCK) und ist somit kleiner als 0, was in der while()-Schleife ja abgefangen wird....