Я реализую очень простой вид «обнаружения сервера»: время от времени мой сервер (скажем, на 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);