在 Linux 中,recv() 有效,但 recvmsg() 不起作用
In Linux, recv() works but recvmsg() doesn't
我在函数中有此代码,在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;
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么这段代码不起作用,我该如何解决?
- 在 Linux 中,recv() 有效,但 recvmsg() 不起作用