2011-10-27 29 views
2

如何響應從不同ip範圍發送的多播udp消息?
我有一個場景,我在PC上的一個小設備和一個簡單的SLP客戶端上實現了一個簡單的SLP服務器(http://www.openslp.org/doc/rfc/rfc2608.txt)。

該設備有一個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和設備共享10.0.0.x範圍。)
它應該通過嗎? (我已經用Wireshark驗證過這個消息沒有到達PC上,而且我用我的jtag驗證過設備發出了一條消息。)

爲了解決這個問題,我可以讓PC枚舉所有ips併發送幾個udp消息。但是這樣做的性能有些不好,並且可能會導致糟糕的設備氾濫。 (該設備將接收所有的消息並作出相應的響應,這是沒有收到響應的PC。)

是我的設備(這是一個小的RTOS btw),有一個有缺陷的傳輸?
或者有沒有辦法來解決這個問題,而不會淹沒我的小設備?

+0

我沒有看到您的設備加入多播組。您是否從片段中刪除了該部分? – Artefacto

+0

是的,該片段只是一個很好的自包含樣本。真正的代碼還加入了多播組(並且有很多編碼/解碼)。 – Illishar

+0

請從RTOS設備上發佈'netstat -rn'和'ifconfig'(或其等價物) –

回答

0

如果您希望設備能夠發送到不在直接連接的子網上的IP地址,則必須爲這些IP地址提供路由。

您可能可以簡單地給它一個通過PC的默認路由(即一個默認路由,網關爲10.0.0.70)。

+0

假設我可以更改網關目前由DHCP提供),但「什麼」仍存在問題。設備(recvfrom)只會將PC看作例如。 192.168.1.70。它不知道它實際上是10.0.0.70還是它應該將網關更改爲此? – Illishar

+1

@Illi您不需要更改網關。你只需要說「192.168.1.70/32的數據包通過10.0.0.70路由」('ip ra 192.168.1.70/32通過10.0.0.70') – Artefacto

+0

@Illi當然,最好的解決方案是改變。 net應用程序只使用正確的接口或將套接字綁定到正確的源地址。 – Artefacto