Linux TCP套接字上带有标志MSG|u DONTWAIT | MSG|u PEEK的recv
我有一个用于交换消息的TCP流连接。这是在Linux内核中。使用者线程继续处理传入消息。在消费了一条消息之后,我想检查是否还有更多待处理的消息;在这种情况下,我也会处理它们。我实现这一点的代码如下所示。krecv是sock_recvmsg()的包装器,在不修改的情况下传递标志值(来自模块的krecv) 对于MSG_DONTWAIT,我希望它不会阻塞,但显然它会阻塞。对于MSG_PEEK,如果没有要读取的数据,它应该只返回零。这种理解正确吗?有没有更好的方法来实现我在这里所需要的?我猜这应该是一个常见的需求,因为跨节点的消息传递被频繁使用Linux TCP套接字上带有标志MSG|u DONTWAIT | MSG|u PEEK的recv,linux,sockets,network-programming,linux-kernel,Linux,Sockets,Network Programming,Linux Kernel,我有一个用于交换消息的TCP流连接。这是在Linux内核中。使用者线程继续处理传入消息。在消费了一条消息之后,我想检查是否还有更多待处理的消息;在这种情况下,我也会处理它们。我实现这一点的代码如下所示。krecv是sock_recvmsg()的包装器,在不修改的情况下传递标志值(来自模块的krecv) 对于MSG_DONTWAIT,我希望它不会阻塞,但显然它会阻塞。对于MSG_PEEK,如果没有要读取的数据,它应该只返回零。这种理解正确吗?有没有更好的方法来实现我在这里所需要的?我猜这应该是一个
int recvd = 0;
do {
recvd += krecv(*sockp, (uchar*)msg + recvd, sizeof(my_msg) - recvd, 0);
printk("recvd = %d / %lu\n", recvd, sizeof(my_msg));
} while(recvd < sizeof(my_msg));
BUG_ON(recvd != sizeof(my_msg));
/* For some reason, below line _blocks_ even with no blocking flags */
recvd = krecv(*sockp, (uchar*)tempbuf, sizeof(tempbuf), MSG_PEEK | MSG_DONTWAIT);
if (recvd) {
printk("more data waiting to be read");
more_to_process = true;
} else {
printk("NO more data waiting to be read");
}
int recvd=0;
做{
recvd+=krecv(*sockp,(uchar*)msg+recvd,sizeof(my_msg)-recvd,0);
printk(“recvd=%d/%lu\n”,recvd,sizeof(my_msg));
}而(recvd
您可以先检查缓冲区的长度:
int bytesAv = 0;
ioctl(m_Socket,FIONREAD,&bytesAv); //m_Socket is the socket client's fd
如果其中有数据,则不应阻止带有MSG_PEEK的recv,
如果根本没有数据,那么就不需要查看,
这可能是你喜欢做的。这是一个非常古老的问题,但是
1.问题存在
2.我面对它 至少对我来说(Ubuntu19.04和Python2.7)这个消息没有效果,但是如果我将超时设置为零(使用settimeout函数),它工作得很好。
这可以在c语言中使用setsockopt函数来完成。我提到的上述情况下,哪一个合适?如果流中没有任何内容,我不希望我的线程被阻止。MSG\u dont它不应该被阻止。