【问题标题】:Finding all of the machines available on my local subnet查找本地子网上所有可用的机器
【发布时间】:2013-10-29 23:11:15
【问题描述】:

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

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 广播地址的代码并从网络上的每台机器接收结果?

【问题讨论】:

  • 在任何人指出之前,为了清晰和简洁,上面的代码已经被严格剪掉,所有的错误检查都被删除了。
  • 只是为了确定,ping -b 有效吗?如果不是,那很可能是网络(设备)的问题,而不是代码的问题。也许某些网桥会阻止/忽略广播消息?
  • 是的,ping -b 确实有效,在我们所有具有不同无线网桥的不同网络上。
  • PORT 定义为 17784

标签: c linux networking ping icmp


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2016-09-12
    • 1970-01-01
    • 2015-07-06
    • 2015-12-06
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    相关资源
    最近更新 更多