【问题标题】:Responding to out-of-scope multicast响应范围外的多播
【发布时间】:2011-12-16 10:20:52
【问题描述】:

如何响应从不同 ip 范围发送的多播 udp 消息?
我有一个场景,我在小型设备上实现了一个简单的 SLP 服务器 (http://www.openslp.org/doc/rfc/rfc2608.txt),在 PC 上实现了一个简单的 SLP 客户端。

该设备有一个IP。例如。 10.0.0.50
然而,PC 有几个 ip。例如。 10.0.0.70、192.168.1.70、172.19.1.70
PC 也有几个网络适配器,每个都有几个 ip。 (不要管那个。)
从 PC 我向 slp 多播组发送一条 udp 消息:

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。设备将对此作出响应。而且它似乎没有通过PC。 (PC 和设备共享 10.0.0.x 范围。)
它应该通过吗? (我已经用 Wireshark 验证了消息没有到达 PC。我已经用我的 jtag 验证了设备发送了一条消息。)

为了解决这个问题,我可以让 PC 枚举所有 ips 并发送几个 udp 消息。但这有一些糟糕的性能,并且有可能淹没糟糕的设备。 (设备将收到所有消息并做出相应的响应。是 PC 没有收到响应。)

是我的设备(顺便说一句,它是一个小型 RTOS。)传输有缺陷吗?
或者有什么方法可以解决这个问题,而不会淹没我的小型设备?

【问题讨论】:

  • 我没有看到您的设备加入了多播组。你有没有从 sn-p 中省略那部分?
  • 是的,sn-p 只是一个很好的独立样本。真正的代码还加入了一个多播组(并且有很多编码/解码。)
  • 请在您的 RTOS 设备上发布 netstat -rnifconfig(或其等效项)

标签: .net c sockets ip multicast


【解决方案1】:

如果您希望您的设备能够发送到不在直接连接子网上的 IP 地址,您必须为其提供这些 IP 地址的路由。

您也许可以简单地给它一个通过 PC 的默认路由(即默认路由,网关为 10.0.0.70)。

【讨论】:

  • 假设我可以更改网关(目前由 DHCP 提供),“什么”仍然存在问题。设备(recvfrom)只会将 PC 视为例如。 192.168.1.70。它不知道它实际上是 10.0.0.70 还是它应该将网关更改为这个?
  • @Illi 您不需要更改网关。您只需说“到 192.168.1.70/32 的数据包通过 10.0.0.70 路由”(ip r a 192.168.1.70/32 via 10.0.0.70
  • @Illi 当然,最好的解决方案是将 .net 应用程序更改为仅使用正确的接口或将套接字绑定到正确的源地址。
  • @Illishar:回复192.168.1.70就可以了,因为那电脑的IP地址之一。唯一的问题是设备上的 IP 堆栈需要知道要到达 192.168.1.70,它必须通过 10.0.0.70,这就是路由的用途(如果它已经有一个通过不同的机器)。
  • 设备不会知道它应该路由到 10.0.0.70。但是假设我通过 10.0.0.1 路由 192.168.1.70/32? (这实际上是网关。)我认为它已经像那样工作了,但我可以试一试。
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 2016-05-26
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
相关资源
最近更新 更多