gpt4 book ai didi

c - 第二次 recv 调用后,recv 始终读取 0 字节

转载 作者:太空宇宙 更新时间:2023-11-04 08:04:36 26 4
gpt4 key购买 nike

我有一个在平台上运行的 TCP 服务器,它从缓冲区读取字节并在一个发送调用中通过网络发送所有字节:

send(sSocket.client_sock, base, frb_size, 0);

frb_size 的大小为 2_228_224 字节。

在接收端我试图缓冲数据:

while(1) {
while(total != size) {
r = recv(my_socket->sock, buf, 8192-total, 0);
memcpy(buffer+total, buf, r);
total += r;
}
//some code dealing with manipulating the buffer with SDL
}

我有一个较小的缓冲区 buf,大小为 8192。读取时,它使用 memcpy 将其放入大小为 2_228_224 的缓冲区内的适当位置。

我的问题是,在第一次迭代之后,所有进行中的迭代都返回 r 为 0,这意味着套接字已根据文档关闭。同样奇怪的是,无论我使用什么大小的 buf,它总是在第一次迭代时返回完整的字节数。例如,上面的代码将返回 8192 字节,如果我将大小更改为 65507,它将返回 65507,但如果我将其更改为 2_228_224,它将永远不会返回完整的缓冲区。

与此同时,当我这样做时:

while(1) {
r = recv(my_socket->sock, buffer, size, 0);
//some code dealing with manipulating the buffer with SDL
}

其中 size 是缓冲区的大小 (2_228_224)。 r 在调试时从不返回 0,但它也从不具有构成已发送输入的完整字节数。

Windows 上的套接字 API 是不是我做错了什么?有没有办法让 Winsock 套接字阻塞,直到接收到所有字节数?

谢谢。

最佳答案

如评论中所述,使用 8192-total是不对的。最多阅读 size字节,使用这样的东西:

while(total < size) {
int bytes = size - total;
if (bytes > 8192) bytes = 8192;
r = recv(my_socket->sock, buf, bytes, 0);
if (r <= 0) {
/* handle this! */
break;
}
memcpy(buffer+total, buf, r);
total += r;
}

在每次迭代中,它都会尝试读取总数中剩余的字节数,但上限为输入缓冲区的大小。

处理r <= 0很重要和 break跳出循环以避免无限循环(如果 r == 0 重复)或段错误(如果 r == -1 重复将 total 推负)。

关于c - 第二次 recv 调用后,recv 始终读取 0 字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43708598/

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