Note that there are some explanatory texts on larger screens.

plurals
  1. POC WINAPI recv() returns 0 before all data is recieved
    text
    copied!<p>I'm using the code from <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121%28v=vs.85%29.aspx" rel="nofollow">MSDN's recv() page</a>, but I changed the data being sent and destination port and IP address to send a HTTP GET request to get google.com/index.php. Every time I run it, recv() returns 0 after getting most of the page, but not all. I verified with wireshark that the entire page is received, but it stops after <code>&lt;a href=//google.co</code>, followed by a non-ASCII symbol.</p> <p>Here's the code I'm using, I took out most of the comments and error checking but otherwise it's the same as the link above:</p> <pre><code>#include &lt;winsock2.h&gt; #include &lt;ws2tcpip.h&gt; #include &lt;stdio.h&gt; int main() { WSADATA wsaData; int iResult; SOCKET ConnectSocket = INVALID_SOCKET; struct sockaddr_in clientService; char *sendbuf = "GET /index.php\r\nHost: www.google.com\r\n\r\n"; char recvbuf[512]; int recvbuflen = 512; iResult = WSAStartup(MAKEWORD(2,2), &amp;wsaData); ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); clientService.sin_family = AF_INET; clientService.sin_addr.s_addr = inet_addr( "74.125.224.180" ); clientService.sin_port = htons( 80 ); iResult = connect( ConnectSocket, (SOCKADDR*) &amp;clientService, sizeof(clientService) ); iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 ); printf("Bytes Sent: %ld\n", iResult); // shutdown the connection since no more data will be sent iResult = shutdown(ConnectSocket, SD_SEND); if (iResult == SOCKET_ERROR) { printf("shutdown failed: %d\n", WSAGetLastError()); closesocket(ConnectSocket); WSACleanup(); return 1; } // Receive until the peer closes the connection do { iResult = recv(ConnectSocket, recvbuf, recvbuflen, 0); if ( iResult &gt; 0 ){ printf("%512s", recvbuf); //printf("recv returned %d... got %d bytes\n", iResult, recvbuflen); } else if ( iResult == 0 ) printf("\n\nConnection closed\n"); else printf("\n\nrecv failed: %d\n", WSAGetLastError()); } while( iResult &gt; 0 ); // cleanup closesocket(ConnectSocket); WSACleanup(); return 0; } </code></pre> <p>I'm compiling on linux with mingw32 version 4.2.1.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload