【问题标题】:Retrieving source address in a recvmmsg UDP socket在 recvmmsg UDP 套接字中检索源地址
【发布时间】:2016-05-12 08:39:16
【问题描述】:

我通过一个套接字接收多条消息:

result = recvmmsg(socket_, &messages_[0], MAX_NUM_MSG, MSG_WAITFORONE, NULL);

我想获取源地址和端口,但是当我尝试时,结构分配中出现错误:

msg = &messages_[0];
***struct sockaddr *src = &msg->msg_hdr.msg_name;***

srcport = ntohs(src->sin_port);
srcaddr = ntohl(src->sin_addr.s_addr);

从“void**”到“sockaddr*”的无效转换

【问题讨论】:

  • 你考虑过演员吗?
  • 您好,感谢您的回答。是的,我做到了。深入研究我在调试中看到的问题,即 msg->msg_hdr.msg_name 为空,这真的让我很担心.....所以,当调试并通过那里时,会发生错误的终止。

标签: sockets


【解决方案1】:

recvmmsg 系统调用是recvmsg 的扩展。如recvmsg中所述:The msg_name field points to a caller-allocated buffer that is used to return the source address

也就是说你应该自己为msg_name分配内存空间,并且你应该指定msg_namelen,请尝试:

sockaddr_in addrs[MAX_NUM_MSG];
for (int i = 0; i < MAX_NUM_MSG; ++i) {
    messages_[i].msg_hdr.msg_name = &addrs[i];
    messages_[i].msg_hdr.msg_namelen = sizeof(sockaddr_in);
}

这样您就可以在至少有一条消息时访问地址(请记住使用sockaddr_in而不是sockaddr):

struct sockaddr_in *src = messages_[0].msg_hdr.msg_name;

【讨论】:

    猜你喜欢
    • 2019-03-24
    • 2015-05-23
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2016-09-22
    • 2021-05-21
    • 2014-05-27
    • 2023-02-12
    相关资源
    最近更新 更多