Ответ на многоадресную рассылку вне области - PullRequest
2 голосов
/ 27 октября 2011

Как ответить на многоадресное сообщение 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. Но это имеет несколько плохую производительность и может привести к затоплению плохих устройств. (Устройство получит все сообщения и ответит соответственно. Это ПК, который не получает ответы.)

Это мое устройство (между прочим, это небольшая ОСРВ) с ошибочной передачей?
Или есть какой-нибудь способ решить эту проблему, не заливая мои маленькие устройства?

1 Ответ

0 голосов
/ 27 октября 2011

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

Вы можете просто указать ему маршрут по умолчанию через ПК (т. Е. Маршрут по умолчанию со шлюзом 10.0.0.70).

...