我有一个用于交换消息的TCP流连接。这在Linux内核中。使用者线程继续处理传入的消息。使用完一条消息后,我要检查是否还有更多待处理的消息;在这种情况下,我也会处理它们。我实现此目的的代码如下所示。 krecv是sock_recvmsg()的包装器,无需修改即可传递标志的值(来自ksocket kernel模块的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 bytesAv = 0;
ioctl(m_Socket,FIONREAD,&bytesAv); //m_Socket is the socket client's fd
如果其中有数据,则不应阻止MSG_PEEK的recv,
如果根本没有数据,则不需要MSG_PEEK,
那可能就是你想要做的。