gpt4 book ai didi

c - 使用 SDL_Net 查找 UDP 广播源 IP

转载 作者:行者123 更新时间:2023-12-01 15:30:23 25 4
gpt4 key购买 nike

我正在实现一种非常基本的“服务器发现”:偶尔我的服务器(比如 192.168.0.4)向 255.255.255.255:1234 广播一个非常简单的 UDP 数据包

然后我的客户,无论他们身在何处,都在 1234 上监听传入的数据包。数据包顺利到达,但我无法获得请求广播的人 (192.168.0.4)。我作为“发件人”收到的唯一 IP 是路由器 192.168.0.1。我认为这是有道理的,但它没有用,因为我真正需要的是服务器的IP;开始广播的人。

作为旁注,我无法将服务器 IP 存储在广播数据包中,因为我真的不知道服务器使用什么 IP 来访问某个网络上的某个客户端(可以是任何接口(interface)上的任何本地网络)毕竟,没有可移植的方式来了解分配给它们的接口(interface)和 IP。

源代码非常简单:

/* packet */
struct my_packet_struct { int a,b,c };

客户端

UDPpacket* packet = SDLNet_AllocPacket (sizeof(my_packet_struct));
UDPsocket sock = SDLNet_UDP_Open (1234);
my_packet_struct data;

/* omitting the while/sleep loop here =) */
if (SDLNet_UDP_Recv(sock, packet))
{
memcpy (&data, packet->data, sizeof(my_packet_struct));
}

/* here I'm getting 192.168.0.1 as the source :( */
uint32_t ip = SDLNet_Read32 (&packet->address.host);

服务器

UDPpacket* packet = SDLNet_AllocPacket (sizeof(my_packet_struct));
UDPsocket sock = SDLNet_UDP_Open (0);
my_packet_struct data;

IPaddress addr;
SDLNet_ResolveHost (&addr, "255.255.255.255", 1234);

packet->address.host = addr.host;
packet->address.port = addr.port;
packet->len = sizeof(data);
memcpy (packet->data, &data, sizeof(data));

SDLNet_UDP_Send (sock, -1, packet);

最佳答案

PCap 库肯定可以做到这一点,唯一的问题在于最终用户需要安装 PCap(除非您愿意创建独立版本)。如果您真的需要避免这样的额外添加,您也可以为每个目标平台编写单独的案例。我知道这很麻烦,但有时这是不可避免的。

祝你好运。

关于c - 使用 SDL_Net 查找 UDP 广播源 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5362730/

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