I’m using the code from MSDN’s recv() page, 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 <a href=//google.co, followed by a non-ASCII symbol.
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:
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
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), &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*) &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 > 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 > 0 );
// cleanup
closesocket(ConnectSocket);
WSACleanup();
return 0;
}
I’m compiling on linux with mingw32 version 4.2.1.
I’ve only glanced, but the most glaring error is this:
Nobody will write that NUL character for you that makes C strings work. In particular, since printing strings means searching for NUL characters, and there aren’t any sent over the wire, your last
printfafter arecvwill likely also spit out some garbage that was in the buffer from the previous loop iteration. You can try something like this:This way you only print characters that
recvtold you were in the buffer.