使用SDL_Net查找UDP广播源IP

3
我正在实现一种非常基本的“服务器发现”:偶尔我的服务器(假设在192.168.0.4)向255.255.255.255:1234广播一个非常简单的UDP数据包。然后,我的客户端在任何地方都会监听1234以接收传入的数据包。数据包到达很好,但我无法获取请求广播的IP(192.168.0.4)。我收到的唯一IP是“发送者”的192.168.0.1路由器。我认为这是有道理的,但它是无用的,因为我真正需要的是服务器的IP;即启动广播的那个IP。
顺便说一下,我不能在广播包中存储服务器IP,因为我真的不知道服务器用于在某个网络上到达某个客户端的IP(可能是任何接口上的任何本地网络),而且毕竟没有可移植的了解接口和分配给它们的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);
2个回答

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

0

只需在广播的数据包中包含服务器地址,可能还要加上某种哈希值以确保它不是使用相同端口的其他服务器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接