小規模なネットワークで動作するいくつかの組み込みシステムがあり、これらはいくつかの物理ディスプレイを実行し、その一部には各組み込みシステムのネットワーク ステータスが表示されます。これまで使用していたワイヤレス ブリッジを取得できなくなり、新しいものに切り替えました。これは、ネットワーク上の他のマシン/ワイヤレス ブリッジを検出するために使用される古いコードでは機能しなくなりました。古いコードは次のことを行います。
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
ブロードキャストアドレスにリンクされたコードを構成し、ネットワーク上の各マシンから結果を受け取るにはどうすればよいですか?