10

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 を実行できますが、この問題の原因が何であるかはわかりません。

4

2 に答える 2

4

結局のところ、私のコードは、私が思っていたように完全に問題ありません。ネットワーク設定自体に問題がありました。

後世のために、サーバー マシンの組み込み DHCP サーバーを使用して他のコンピューターに IP アドレスを割り当てる代わりに、2 台の静的 IP コンピューターをそれぞれのハブにセットアップしました。私の問題のためにかなりローカライズされていますが、あなたは決して知りません..

于 2012-09-21T13:55:30.853 に答える
-1

ブロードキャストを送受信するには

  1. ネットマスクが正しいことを確認してください。ブロードキャスト パケットの Windows マスクは重要ではありませんが、Linux では重要ではありません。

  2. ソケットを INADDR_ANY にバインドします

  3. ブロードキャストにsetsockopt

  4. sendto を sendaddr.sin_addr.s_addr = inet_addr("your_interface_broadcast_address") で呼び出します。または - ブロードキャスト IP アドレスを使用して、インターフェイスごとに sendo を数回呼び出します。

  5. recvfrom を呼び出します。recvfrom を呼び出す前の任意の時点で、長さパラメーターを設定します。

于 2013-03-13T10:28:41.380 に答える