【发布时间】:2011-07-18 18:38:51
【问题描述】:
我正在实现一种非常基本的“服务器发现”:有时我的服务器(比如说在 192.168.0.4)向 255.255.255.255:1234 广播一个非常简单的 UDP 数据包
然后我的客户,无论他们在哪里,都会在 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);
【问题讨论】: