第二次 recv 调用后,recv 始终读取 0 字节
recv is always reading 0 bytes after second recv call
我在平台上有一个 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.[=15= 的缓冲区内的适当位置]
我的问题是,在第一次迭代之后,所有后续迭代 return r 都为 0,这意味着套接字已根据文档关闭。同样奇怪的是,无论我使用什么大小的 buf
,它总是 return 是第一次迭代的全部字节数。例如,在上面的代码中 8192 字节将被 returned,如果我将大小更改为 65507,它将 return 65507,但如果我将其更改为 2_228_224,它将永远不会 return 完整缓冲区。
与此同时,当我这样做时:
while(1) {
r = recv(my_socket->sock, buffer, size, 0);
//some code dealing with manipulating the buffer with SDL
}
其中 size 是缓冲区的大小 (2_228_224)。 r 在调试时从不 returns 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
否定)。
我在平台上有一个 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.[=15= 的缓冲区内的适当位置]
我的问题是,在第一次迭代之后,所有后续迭代 return r 都为 0,这意味着套接字已根据文档关闭。同样奇怪的是,无论我使用什么大小的 buf
,它总是 return 是第一次迭代的全部字节数。例如,在上面的代码中 8192 字节将被 returned,如果我将大小更改为 65507,它将 return 65507,但如果我将其更改为 2_228_224,它将永远不会 return 完整缓冲区。
与此同时,当我这样做时:
while(1) {
r = recv(my_socket->sock, buffer, size, 0);
//some code dealing with manipulating the buffer with SDL
}
其中 size 是缓冲区的大小 (2_228_224)。 r 在调试时从不 returns 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
否定)。