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によって使用される独自のプロトコルである可能性があります- 彼らはドキュメントでこのポートについて言及しています(他のほとんどのヒットは logitech スクイーズボックスに関連していますが、私はそれが関連しているとは思いません)。

[私はあなたの質問に直接答えていないことを認識していますが、これは上記のコードが acksys ハードウェアでのみ動作することを意味すると思います]

于 2013-10-30T19:09:08.647 に答える