响应超出范围的多播

时间:2011-10-27 11:06:39

标签: .net c sockets ip multicast

如何响应从不同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。)有一个有缺陷的传输?
或者有没有办法解决这个问题,而不会淹没我的小设备?

1 个答案:

答案 0 :(得分:0)

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

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