gpt4 book ai didi

c++ - 获取UDP数据包的目的地址

转载 作者:太空宇宙 更新时间:2023-11-04 03:37:26 26 4
gpt4 key购买 nike

我一直在使用以下example发布在同一个网站上。这是我的版本。 (请原谅我缺乏 C 套接字编程经验:)

在构造函数中:

    server::server(io_service& io_service, const int port) : 
udpsocket_(io_service, udp::endpoint(udp::v4(), port))) {

int sock = udpsocket_.native();
fd_set fdset;
FD_ZERO(&fdset);
FD_SET(sock, &fdset);
int opt = 1;
setsockopt(sock, IPPROTO_IP, IP_PKTINFO, &opt, sizeof(opt));
}

其中“udpsocket_”实际上是一个boost asio udp套接字。这非常方便,因为一方面我可以拥有一个从传入 UDP 消息获取目标 IP 的函数,而无需使用原始套接字:

void get_destination_IP() {

int sock = udpsocket_.native();
char cmbuf[0x100];
struct sockaddr_in peeraddr;
struct msghdr mh;
mh.msg_name = &peeraddr;
mh.msg_namelen = sizeof(peeraddr);
mh.msg_control = cmbuf;
mh.msg_controllen = sizeof(cmbuf);
int received = recvmsg(sock, &mh, 0);
for ( // iterate through all the control headers
struct cmsghdr *cmsg = CMSG_FIRSTHDR(&mh);
cmsg != NULL;
cmsg = CMSG_NXTHDR(&mh, cmsg))
{
if (cmsg->cmsg_level != IPPROTO_IP ||
cmsg->cmsg_type != IP_PKTINFO)
{
continue;
}
struct in_pktinfo *pi = (struct in_pktinfo*) CMSG_DATA(cmsg);
char* destAddr = (char*) calloc(4, sizeof(char));
destAddr = inet_ntoa(pi->ipi_spec_dst);

stored_UDP_dest_ip_ = ip::address::from_string(destAddr);
}
}

现在问题来了:

  • 我可以像调用“async_receive_from”一样以非阻塞方式异步调用此“get_destination_IP”吗?

如:

  udpsocket_.async_receive_from(
boost::asio::buffer(msg_),
udp_endpoint_,
boost::bind(&server::UDP_recv_handler,
this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred,
handler
)
);
  • 函数“recvmsg”存储正确的目标IP信息,但返回0。理论上,根据手册页,“size_t numbytes”会返回那里。我还能用“recvmsg”读取数据报吗?

  • 构造函数中是否需要 FD_ZERO?

  • 每次调用“get_destination_IP”时都需要 FD_ZERO 吗?

预先感谢您的帮助

最佳答案

请参阅 boost:asio::null_buffers() 功能。如果您将 boost::asio::null_buffers() 传递给 boost::asio async_*() 函数,则当数据可用并且您可以(需要)自己接收它时调用处理程序(例如,在您的情况下通过 recvmsg() )。

fdset 在那里没有被使用并且毫无用处。套接字池由 boost::asio 为您完成。

关于c++ - 获取UDP数据包的目的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31101047/

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