查找本地子网上的所有可用计算机

时间:2013-10-29 23:11:16

标签: c linux networking ping icmp

我们有几个可在小型网络上运行的嵌入式系统,它们运行一些物理显示,其中一部分显示每个嵌入式系统的网络状态。到目前为止,我们已经无法获得我们一直在使用的无线网桥,并且已经切换到新的无线网桥,这些网桥不再使用用于检测网络上其他计算机/无线网桥的旧代码。旧代码执行以下操作:

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命令来使用ICMP数据包ping广播地址。我已尝试链接到this question的代码,但它不适用于广播地址(可能是因为它没有配置为这样做)。那么我的问题是,如何将从上述问题链接的代码配置为sendto广播地址并从网络上的每台机器接收结果?

1 个答案:

答案 0 :(得分:0)

它可能是acksys使用的专有协议 - 他们在documentation中提到了这个端口(大多数其他命中都与罗技压缩盒有关,但我认为这并不相关)。 / p>

[我意识到我没有直接回答你的问题,但我认为这意味着上面的代码只适用于acksys硬件]