【发布时间】: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 -rn和ifconfig(或其等效项)
标签: .net c sockets ip multicast