在 Linux 中,recv() 有效,但 recvmsg() 不起作用

In Linux, recv() works but recvmsg() doesn't

本文关键字:recvmsg 不起作用 有效 Linux recv      更新时间:2023-10-16

我在函数中有此代码,在Raspberry Pi上运行:

struct sockaddr_in addr_buffer;
struct cmsghdr control_buffer;
struct msghdr msghdr;
struct iovec iov[1];
char msg_buffer[1458];
memset(&msg_buffer, 0, sizeof(msg_buffer));
memset(iov, 0, sizeof(iov));
memset(&msghdr, 0, sizeof(msghdr));
iov[0].iov_base = msg_buffer;
iov[0].iov_len = sizeof(msg_buffer);
msg.msg_iov = iov;
msg.msg_iovlen = 1;
msghdr.msg_name = &addr_buffer;
msghdr.msg_namelen = sizeof(addr_buffer);
msghdr.msg_control = &control_buffer;
msghdr.msg_controllen = sizeof(control_buffer);
msghdr.msg_flags = 0;
//int msgsize = recv(udpsocket_fd, &msg_buffer, 4, 0);
int msgs_received = recvmsg(udpsocket_fd, &msghdr, 0);

根据我阅读的内容,recvMsg()系统调用应一次返回到MSGHDR一条消息指向的IOVEC(因为IOVEC数组长1个单位长)。但是,它行不通:我可以正确地收到标题,因为我可以使用IP发送的调试器阅读,但MSG_Buffer仍然空了。该功能还返回0,这很奇怪,因为这意味着没有发生任何错误(将返回-1),但也意味着未收到任何消息(尽管已更新了标题)

如果我取消recv()行,则所有这些都可以按预期工作,并且该消息在msg_buffer中。但是,显然,未收到额外的信息。我已经挠头了两个小时,看不到代码出了什么问题。非常感谢您的帮助!

根据您所显示的内容,您只是不正确地初始化msghdr。尝试在recvmsg呼叫之前添加此信息:

mhdr.msg_iov = iov;
mhdr.msg_iovlen = 1;