我在运行在树莓派上的函数中有以下代码:
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个单位)。但是,它不起作用:我正确地收到了 header ,因为可以使用调试器读取哪个IP发送了数据包,但是msg_buffer保持为空。该函数还返回0,这很奇怪,因为这意味着未发生任何错误(将返回-1),但也意味着未接收到任何消息(尽管 header 已更新)
但是,如果取消对recv()行的注释,则它们都可以按预期运行,并且消息位于msg_buffer中。但是,显然,没有收到额外的信息。我已经挠头了两个小时,看不到代码有什么问题。非常感谢您的帮助!
最佳答案
根据显示的内容,您只是不正确地初始化msghdr
。尝试在recvmsg
调用之前添加以下内容:
mhdr.msg_iov = iov;
mhdr.msg_iovlen = 1;
关于c++ - 在Linux中,recv()有效,但recvmsg()无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55124179/