gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:04:16 26 4
gpt4 key购买 nike

我正在使用以下方式通过套接字接收多个消息:

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 *”的无效转换

最佳答案

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;

关于sockets - 在recvmmsg UDP套接字中检索源地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37181568/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com