我正在使用MSDN's recv() page中的代码,但是我更改了要发送的数据以及目标端口和IP地址,以发送HTTP GET请求以获取google.com/index.php。每次运行它时,recv()在获取大部分页面(但不是全部)后都返回0。我用wireshark验证了已接收到整个页面,但是它在<a href=//google.co
之后停止,后跟一个非ASCII符号。
这是我正在使用的代码,我删除了大多数注释和错误检查,但与上面的链接相同:
#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;
}
我正在使用mingw32 4.2.1版在Linux上进行编译。
最佳答案
我只看了一眼,但是最明显的错误是:
if ( iResult > 0 ){
printf("%512s", recvbuf);
没有人会为您编写使C字符串正常工作的NUL字符。特别是,由于打印字符串意味着要搜索NUL字符,并且没有通过网络发送任何字符,因此,在
printf
之后的最后一个recv
也可能会吐出前一次循环迭代中缓冲区中的一些垃圾。 。您可以尝试如下操作:if (iResult > 0)
{
char *p = recvbuf;
while (iResult--)
fputc(*p++, stdout);
}
这样,您仅打印
recv
告诉您在缓冲区中的字符。关于c - C WINAPI recv()在收到所有数据之前返回0,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8462293/