gpt4 book ai didi

c - C 套接字编程中的 recv() 不是阻塞的吗?

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

在 Receiver 中,我有

recvfd=accept(sockfd,&other_side,&len);
while(1)
{
recv(recvfd,buf,MAX_BYTES-1,0);
buf[MAX_BYTES]='\0';
printf("\n Number %d contents :%s\n",counter,buf);
counter++;
}

在发件人中,我有

send(sockfd,mesg,(size_t)length,0);
send(sockfd,mesg,(size_t)length,0);
send(sockfd,mesg,(size_t)length,0);

MAX_BYTES 为 1024,mesg 长度为 15。目前,它只调用一次 recv。我希望为每个相应的发送调用 recv 函数三次。如何实现?

最佳答案

简而言之:,就是阻塞。但不是你想的那样。

recv() 阻塞,直到任何 数据可读。但是您事先并不知道尺寸。

在您的场景中,您可以执行以下操作:

  1. 调用select()并将要读取的套接字放入READ FD集
  2. select() 返回正数时,您的套接字已准备好读取数据
  3. 然后,检查您是否可以从套接字接收到 length 个字节:
    recv(recvfd, buf, MAX_BYTES-1, MSG_PEEK),参见 man recv(2)对于 MSG_PEEK 参数或查看 MSDN,他们也有它
  4. 现在您知道有多少数据可用了
  5. 如果可用的长度少于length,则返回并且什么也不做
  6. 如果至少有 length 可用,读取 length 并返回(如果有超过 length 可用,我们将继续第 2 步因为新的 READ 事件将由 select()
  7. 发出信号

关于c - C 套接字编程中的 recv() 不是阻塞的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16990746/

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