gpt4 book ai didi

c - 使用 select 和 recv 通过套接字从 Web 服务器获取文件

转载 作者:太空宇宙 更新时间:2023-11-04 01:38:11 25 4
gpt4 key购买 nike

我在使用 C 套接字从 Web 服务器接收“大”文件时遇到问题;即当这些文件(或者我怀疑)大于我用来接收它们的缓冲区的大小时。如果我尝试(通过 GET 请求)询问一个不超过几个字节的简单 index.html,我没问题,但其他任何事情都失败了。我假设我对 select()recv() 缺乏了解是我失败的原因。看这里:

fd_set read_fd_set;
FD_ZERO(&read_fd_set);
FD_SET((unsigned int)socketId, &read_fd_set);

/* Initialize the timeout data structure. */
struct timeval timeout;
timeout.tv_sec = 2;
timeout.tv_usec = 0;

// Receives reply from the server
int headerReceived = 0;
do {
select(socketId+1, &read_fd_set, NULL, NULL, &timeout);

if (!(FD_ISSET(socketId, &read_fd_set))) {
break;
}

byteSize = recv(socketId, buffer, sizeof buffer, 0);

if (byteSize == 0 || (byteSize < BUFFER_SIZE && headerReceived)) {
break;
}

headerReceived = 1;

} while(1);

没错,在向网络服务器发送 GET 请求后,我很确定服务器运行良好,并且来自任何其他客户端(如任何网络浏览器)的 GET 请求都按预期工作。

提前致谢,非常感谢任何帮助。

最佳答案

if (byteSize == 0 || (byteSize < BUFFER_SIZE && headerReceived))
{
break;
}

headerReceived 在第一次读取后设置为 true。这完全有可能并且很可能后续的 recv() 将小于 BUFFER_SIZE。此时您已退出读取循环。 Recv() 将返回要读取的任意字节数,而不一定是您请求的字节数。

也可以坚持使用 BUFFER_SIZEsizeof(buffer)。混合和匹配只是在某个地方寻找错误。

关于c - 使用 select 和 recv 通过套接字从 Web 服务器获取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10678230/

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