UDPブロードキャストを受信する必要があります(Ubuntuで違いがある場合)。Wireshark を使用すると、パケットがサーバー マシンから送信され、クライアント マシンで受信されるのを確認できますが、プログラムは完全に無視されます。これは私が持っているものです:
sockaddr_in si_me, si_other;
int s;
assert((s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))!=-1);
int port=6000;
int broadcast=1;
setsockopt(s, SOL_SOCKET, SO_BROADCAST,
&broadcast, sizeof broadcast);
memset(&si_me, 0, sizeof(si_me));
si_me.sin_family = AF_INET;
si_me.sin_port = htons(port);
si_me.sin_addr.s_addr = INADDR_ANY;
assert(::bind(s, (sockaddr *)&si_me, sizeof(sockaddr))!=-1);
while(1)
{
char buf[10000];
unsigned slen=sizeof(sockaddr);
recvfrom(s, buf, sizeof(buf)-1, 0, (sockaddr *)&si_other, &slen);
printf("recv: %s\n", buf);
}
デバッグモードでコンパイルされ、コンパイル中にアサートが消去されず、私のプログラムは単にブロックされrecvfrom
ます.
対象外の UDP ブロードキャストを受信するためにジャンプしなければならないフープは他にありますか?
編集:もう少し情報があります。2台のコンピューターを専用スイッチに接続しており、外部からの干渉はありません。また、クライアント コンピュータには、会社のネットワークに接続する 2 番目のネットワーク カードがありますが、これも機能します。
外部 (インターネットが機能している) と自分のサーバー マシン (さらに Wireshark で実際のパケットを確認できます) の両方に ping を実行できますが、この問題の原因が何であるかはわかりません。