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

标签 c sockets recv

在 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/

相关文章:

c - 在 Linux 中无限期休眠一个线程

c++ - 如何区分客户端是从服务器端使用 TCP 还是 UDP

c - 套接字服务器写回客户端

python - socket 。如何使用 socket.recv() 接收所有数据?

c - send - recv 无法按预期使用命令行参数

sockets - 使用UDP套接字接收数据

c - 解释指针和 sizeof 结构的不同值

c - 为什么我的计数器不工作?

c - 生成文件错误 : make: *** No rule to make target `omp.h' ; with OpenMP

python - 为什么套接字行为依赖于打印语句?