在recvmmsg UDP套接字中检索源地址

时间:2016-05-12 08:39:17

标签: sockets

我使用以下命令通过套接字接收多条消息:

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 *'

1 个答案:

答案 0 :(得分:1)

recvmmsg系统调用是recvmsg的扩展。如recvmsgThe 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;