Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Winsock] Problem z ustaleniem końca transmisji

Ostatnio zmodyfikowano 2012-03-14 18:18
Autor Wiadomość
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:
C/C++
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:
C/C++
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?
P-52600
DejaVu
» 2012-03-14 18:11:42
Poczytaj jak prawidłowo kończy się komunikację TCP (lub zobacz źródła biblioteki CURL).
P-52601
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?
P-52602
« 1 »
  Strona 1 z 1