如何响应从不同IP范围发送的多播udp消息?
我有一个场景,我在小型设备上实现了一个简单的SLP服务器(http://www.openslp.org/doc/rfc/rfc2608.txt),在PC上实现了一个简单的SLP客户端。
该设备有一个IP。例如。 10.0.0.50
然而,PC有几个ips。例如。 10.0.0.70,192.168.1.70,172.19.1.70
PC还有几个网络适配器,每个都有几个ips。 (不要管那个。)
从PC发送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。设备将对此做出响应。它似乎没有通过PC。 (PC和设备共享10.0.0.x范围。)
它应该通过吗? (我已经通过Wireshark验证了该消息没有到达PC上。我已经用我的jtag验证了设备发出的消息。)
为了解决这个问题,我可以让PC枚举所有的ips并发送几个udp消息。但这有一些不好的性能,它可能会淹没糟糕的设备。 (设备将接收所有消息并做出相应的响应。这是PC没有收到响应。)
它是我的设备(这是一个小的RTOS btw。)有一个有缺陷的传输?
或者有没有办法解决这个问题,而不会淹没我的小设备?
答案 0 :(得分:0)
如果您希望您的设备能够发送到不在直接连接的子网上的IP地址,则必须为其提供这些IP地址的路由。
您可以简单地通过PC给它一个默认路由(即网关为10.0.0.70
的默认路由)。