gpt4 book ai didi

C WINAPI recv() 在接收到所有数据之前返回 0

转载 作者:行者123 更新时间:2023-11-30 18:03:25 25 4
gpt4 key购买 nike

我正在使用 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;
}

我正在 Linux 上使用 mingw32 版本 4.2.1 进行编译。

最佳答案

我只看了一眼,但最明显的错误是:

    if ( iResult > 0 ){
printf("%512s", recvbuf);

没有人会为您编写使 C 字符串起作用的 NUL 字符。特别是,由于打印字符串意味着搜索 NUL 字符,并且没有通过网络发送任何字符,因此在 recv 之后的最后一个 printf 也可能会吐出一些垃圾它位于上一次循环迭代的缓冲区中。你可以尝试这样的事情:

if (iResult > 0)
{
char *p = recvbuf;
while (iResult--)
fputc(*p++, stdout);
}

这样你就只打印 recv 告诉你在缓冲区中的字符。

关于C WINAPI recv() 在接收到所有数据之前返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8462293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com