我使用以下命令通过套接字接收多条消息:
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 *'
答案 0 :(得分: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;