gpt4 book ai didi

c - 当连接打开但没有数据发送时,send() 和 recv() 返回什么?

转载 作者:太空宇宙 更新时间:2023-11-04 06:46:12 24 4
gpt4 key购买 nike

我想接收一个以多个 block 发送的请求。为此,我使用了带有 recv 的 TCP 套接字。我按如下方式循环接收 recv:

while ((total_recv < MAX_HEADER) && (received = recv(client, req_buffer, CHUNK, 0)) > 0) {
total_recv += received;
if (strstr(req_buffer, delimiter) != NULL)
break;
}

我的目标是在收到以定界符结尾的 header 时停止接收。我不能保证分隔符存在,所以如果 total_recv 大于或等于最大已知 header 大小,我会中断循环。

我不喜欢这样。困扰我的是我可以收到一个没有定界符的数据包,该数据包小于最大 header 大小。在这种情况下,我必须假设 recv 将继续增加 total_recv 直到循环中断。通过阅读套接字 API,我知道 recv 将返回读入缓冲区的字节数,错误时返回 -1,如果连接已关闭则返回 0。

有没有更好的方法在不依赖超时的情况下循环接收 recv?当连接打开但发送方或接收方未传输数据时,send() 和 recv() 究竟返回什么?

最佳答案

如果套接字处于阻塞模式(默认),recv() 将等待直到有可用数据返回。处理这个问题的唯一方法是超时。最简单的方法是使用 select()epoll()

如果套接字处于非阻塞模式,recv() 将在没有可用的情况下立即返回 -1,并且 errno 将设置为 EWOULDBLOCK。您仍然需要使用某种超时,因为这可能只是因为您调用 recv() 太早,在收到所有已发送的数据之前。

超时是一种非常脆弱的机制,因为总是可能存在持续时间超过超时时间的临时网络错误,并且您会错误地将中断前的数据视为完整数据。

也许您可以重新设计协议(protocol)来更好地处理这个问题。让发件人发送一个带有消息中字节数的前缀,而不是读取到分隔符,然后调用 recv() 直到获得那么多字节。

关于c - 当连接打开但没有数据发送时,send() 和 recv() 返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57777398/

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