Как ответить на многоадресное сообщение udp, отправленное из другого диапазона IP-адресов?
У меня есть сценарий, в котором я реализовал простой сервер SLP (http://www.openslp.org/doc/rfc/rfc2608.txt) на небольшом устройстве и простой клиент SLP на ПК.
Устройство имеет ip. Например. 10.0.0.50
ПК, однако, имеет несколько ips. Например. 10.0.0.70, 192.168.1.70, 172.19.1.70
У ПК также есть несколько сетевых адаптеров, каждый из которых имеет несколько ips. (Не берите в голову.)
С ПК я отправляю сообщение udp в группу многоадресной рассылки slp:
System.Net.Sockets.UdpClient client = new System.Net.Sockets.UdpClient(new System.Net.IPEndPoint(System.Net.IPAddress.Any, 0));
client.Send(m_tx_buffer, encoded, SLPMULTICASTGROUP, SLPPORT);
.Net UdpClient выберет случайный ip для присоединения к сообщению udp.
Устройство получит сообщение UDP и отправит обратно одноадресное сообщение данному IP-адресу отправителя. Вот так:
int mysock;
struct sockaddr_in myaddr, cliaddr;
char msgbuf[MAXLEN];
socklen_t clilen;
int msglen;
mysock = socket(PF_INET,SOCK_DGRAM,0);
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons( S_PORT );
myaddr.sin_addr = htonl( INADDR_ANY );
bind(mysock, &myaddr, sizeof(myaddr));
while (1) {
len=sizeof(cliaddr);
msglen=recvfrom(mysock,msgbuf,MAXLEN,0,cliaddr,&clilen);
sendto(mysock,msgbuf,msglen,0,cliaddr,clilen);
}
Проблема в том, если .net выбирает, например. ip 192.168.1.70. Устройство ответит на это. И это, кажется, не доходит до ПК. (ПК и устройство имеют общий диапазон 10.0.0.x)
Это должно пройти? (Я проверил с помощью Wireshark, что сообщение не приходит на ПК. И я проверил с помощью jtag, что устройство отправляет сообщение.)
Чтобы решить эту проблему, я могу заставить компьютер перечислять все ips и отправлять несколько сообщений udp. Но это имеет несколько плохую производительность и может привести к затоплению плохих устройств. (Устройство получит все сообщения и ответит соответственно. Это ПК, который не получает ответы.)
Это мое устройство (между прочим, это небольшая ОСРВ) с ошибочной передачей?
Или есть какой-нибудь способ решить эту проблему, не заливая мои маленькие устройства?