在 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()
阻塞,直到任何 数据可读。但是您事先并不知道尺寸。
在您的场景中,您可以执行以下操作:
- 调用
select()
并将要读取的套接字放入READ FD集 - 当
select()
返回正数时,您的套接字已准备好读取数据 - 然后,检查您是否可以从套接字接收到
length
个字节:
recv(recvfd, buf, MAX_BYTES-1, MSG_PEEK)
,参见man recv(2)
对于MSG_PEEK
参数或查看 MSDN,他们也有它 - 现在您知道有多少数据可用了
- 如果可用的长度少于
length
,则返回并且什么也不做 - 如果至少有
length
可用,读取length
并返回(如果有超过length
可用,我们将继续第 2 步因为新的 READ 事件将由select()
发出信号
关于c - C 套接字编程中的 recv() 不是阻塞的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16990746/