使用SDL_Net查找UDP广播源IP

时间:2011-03-19 14:35:16

标签: c udp sdl broadcast

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

然后我的客户,无论他们在哪里,都会在1234上收听传入的数据包。数据包到达很好,但我无法得到谁请求广播(192.168.0.4)。我作为“发送者”收到的唯一IP是路由器192.168.0.1。我认为这是有道理的,但由于我真正需要的是服务器的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 :(得分:0)

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

祝你好运。

答案 1 :(得分:0)

只需将服务器地址包含在您正在广播的数据包中,可能只是为了确保它不是某个其他服务器使用相同的端口。