繁体   English   中英

在第二次recv调用后recv始终读取0字节

[英]recv is always reading 0 bytes after second recv call

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

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 <= 0break循环以避免避免无限循环(如果r == 0反复)或段错误(如果r == -1反复推动total负数)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM