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

4

1 回答 1

0

它可能是acksys使用的专有协议——他们在文档中提到了这个端口(大多数其他点击都与罗技挤压箱有关,但我认为这无关紧要)。

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

于 2013-10-30T19:09:08.647 回答