可我們有一個小的網絡上工作的幾個嵌入式系統,而這些運行一些物理顯示器,其中一部分顯示了每個嵌入式系統的網絡狀態。我們不再能夠得到我們已經使用了無線網橋到現在爲止,並切換到新的,不再與用於檢測網絡中的其他設備/無線網橋的舊代碼工作。舊的代碼執行以下操作:找到所有的機器在我的本地子網
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
從上面的問題鏈接的代碼廣播地址,並從每臺機器在網絡上得到的結果嗎?
之前有人指出出來,上面的代碼已經被嚴重剪斷的清晰度和簡潔,所有錯誤檢查已被刪除。 –
可以肯定,'ping -b'確實可行嗎?否則,這可能是網絡(設備)的問題,而不是代碼。也許有些網橋阻止/忽略廣播消息? – Kninnug
那麼PORT是什麼? –