[Winsock] Problem z ustaleniem końca transmisji
Ostatnio zmodyfikowano 2012-03-14 18:18
xevuel Temat założony przez niniejszego użytkownika |
[Winsock] Problem z ustaleniem końca transmisji » 2012-03-14 18:09:15 Próbuję napisać pętlę odbierającą dane przy użyciu HTTP. Do odebrania mam różną liczbę bajtów. Na MSDN-ie znalazłem taki kod: do { iResult = recv( ConnectSocket, recvbuf, recvbuflen, 0 ); if( iResult > 0 ) printf( "Bytes received: %d\n", iResult ); else if( iResult == 0 ) printf( "Connection closed\n" ); else printf( "recv failed: %d\n", WSAGetLastError() ); } while( iResult > 0 );
Z tym, że jeśli np. recv odbierze 10 końcowych bajtów, przejdzie do następnego przebiegu pętli. I tutaj pętla się zawiesi, bo będzie czekać na następne dane, które nigdy nie zostaną wysłane. Dlatego w swojej pętli dorobiłem coś takiego: while( iResult > 0 || iResult == recvbuflen );
Mimo że jako recvbuflen ustawiam bardzo niskie wartości (od 2 do 8), czasami zdarza się mi stracić kawałek HTML-a właśnie z powodu tego co dopisałem ( iResult == recvbuflen ). I tutaj jest moje pytanie: Jak zoptymalizować tą pętlę, aby się nie zawieszała i jednocześnie odbierała wszystkie dane? Jest to w ogóle możliwe beż użycia gniazd nieblokujących? |
|
DejaVu |
» 2012-03-14 18:11:42 Poczytaj jak prawidłowo kończy się komunikację TCP (lub zobacz źródła biblioteki CURL). |
|
xevuel Temat założony przez niniejszego użytkownika |
» 2012-03-14 18:18:24 Wiesz.. Jakoś nigdy nie lubiałem grzebać w kodzie mającym kilka tysięcy linijek :)
Co do kończenia komunikacji, to serwer nie kończy połączenia, tylko przeglądarka (przynajmniej ja miałem w programie sprawdzanie flagi WSAECONNRESET i nic to nie zmieniało). A jak ja mogę zakończyć połączenie, jak nie odebrałem danych?
|
|
« 1 » |