Выяснение исходного IP-адреса широковещательной рассылки с помощью SDL_Net - PullRequest
3 голосов
/ 19 марта 2011

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

Просто включите адрес сервера в пакет, который вы транслируете, возможно, с каким-то хэшем, просто чтобы убедиться, что это не какой-то другой сервер, использующий тот же порт.

0 голосов
/ 28 марта 2011

Библиотека PCap могла бы сделать это наверняка, единственная проблема заключается в том, что конечному пользователю понадобится установить PCap (если вы не хотите создавать автономную версию).Если вам действительно нужно избегать таких дополнительных дополнений, вы также можете просто написать отдельные случаи для каждой целевой платформы.Я знаю, что это грязно, но иногда это неизбежно.

Удачи.

...