2013-10-29 66 views
0

可我們有一個小的網絡上工作的幾個嵌入式系統,而這些運行一些物理顯示器,其中一部分顯示了每個嵌入式系統的網絡狀態。我們不再能夠得到我們已經使用了無線網橋到現在爲止,並切換到新的,不再與用於檢測網絡中的其他設備/無線網橋的舊代碼工作。舊的代碼執行以下操作:找到所有的機器在我的本地子網

char broadcast[27] = { 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 10, 10, 60, 213, 69, 120, 1, 0, 192, 1, 1, 0, 1, 0, 1, 0, 1 }; 
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); 
addr.sin_addr.s_addr = htonl(-1); 
addr.sin_port = htons(PORT); 
addr.sin_family = AF_INET; 
status = setsockopt(sock, SOL_SOCKET, SO_BROADCAST, &yes, sizeof(int)); 
status = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)); 
status = bind(sock, (struct sockaddr *) &addr, sinlen); // bind socket 
status = getsockname(sock, (struct sockaddr *) &addr, &sinlen); 
status = sendto(sock, broadcast, sizeof(broadcast), 0, (struct sockaddr *) &addr, sinlen); 

fd_set fds; 
struct timeval timeout; 

timeout.tv_sec = sec; 
timeout.tv_usec = usec; 

FD_ZERO(&fds); 
FD_SET(socket, &fds); 

select(socket+1, &fds, 0, 0, &timeout); 

status = recvfrom(sock, buffer, buflen, 0, (struct sockaddr *) &addr, &sinlen); 
some_addr = inet_ntoa(addr.sin_addr); 

據我所知,它發送一個UDP廣播包,廣播地址,子網,但我不明白的是F#$ @是什麼神奇的有效載荷,進行了這是爲了工作,爲什麼它不適用於我們的新設備?

要替換此代碼,我期待基本上實現ping 192.168.1.0 -b命令ping使用ICMP數據包廣播地址。我已經試過了在this question掛代碼,但它並不適用於廣播地址的工作(大概是因爲它沒有配置爲這樣做)。那麼我的問題是,我該如何配置爲sendto從上面的問題鏈接的代碼廣播地址,並從每臺機器在網絡上得到的結果嗎?

+0

之前有人指出出來,上面的代碼已經被嚴重剪斷的清晰度和簡潔,所有錯誤檢查已被刪除。 –

+0

可以肯定,'ping -b'確實可行嗎?否則,這可能是網絡(設備)的問題,而不是代碼。也許有些網橋阻止/忽略廣播消息? – Kninnug

+0

那麼PORT是什麼? –

回答

0

它可能是acksys使用的專有協議 - 他們在其documentation中提到了此端口(大多數其他命中與Logitech squeezebox相關,但我認爲這不是相關的)。

[我意識到我並沒有直接回答你的問題,但我認爲,這意味着上面的代碼將只與ACKSYS硬件工作]

相關問題