Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux TCP套接字上带有标志MSG|u DONTWAIT | MSG|u PEEK的recv_Linux_Sockets_Network Programming_Linux Kernel - Fatal编程技术网

Linux TCP套接字上带有标志MSG|u DONTWAIT | MSG|u PEEK的recv

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,如果没有要读取的数据,它应该只返回零。这种理解正确吗?有没有更好的方法来实现我在这里所需要的?我猜这应该是一个

我有一个用于交换消息的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它不应该被阻止。