2016-12-07 27 views
0

サーバーが指定されたポートでリッスンし、クライアントがそのサーバーで受信するブロードキャストパケットを送信する単純なソケット設定をテストしています。UDP WinSock - ブロードキャストパケットを受信しません

この設定は、メッセージを直接送信する場合(ブロードキャストではない場合)には有効ですが、ブロードキャストをサーバーで受信することはありません。

コード(簡単にするために、エラーチェックを取り除いてトリムダウン)のいくつか:

// Client (broadcast sender) 

// Create and bind the client socket 
clientSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 

sockaddr_in sockAddr; 
sockAddr.sin_family = AF_INET; 
sockAddr.sin_port = htons(5678); 
sockAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 

bind(clientSocket, (sockaddr*)(&sockAddr), sizeof(sockAddr)); 

u_long uMode = 1; 
ioctlsocket(clientSocket, FIONBIO, &uMode); 

char broadcast = 1; 
setsockopt(clientSocket, SOL_SOCKET, SO_BROADCAST, &broadcast, sizeof(broadcast)); 

// ... 

// Send the packet 
sockaddr_in sockAddress; 
sockAddress.sin_family = AF_INET; 
sockAddress.sin_addr.S_un.S_addr = htonl(INADDR_BROADCAST); 
sockAddress.sin_port = htons(5679); 

char const* pPacket = "Test"; 
size_t uPacketSize = strlen(pPacket) + 1; 

sendto(clientSocket, pPacket, (int)uPacketSize, 0, (sockaddr*)&sockAddress, sizeof(sockAddress)); 

-

// Server (listener) 

// Create and bind the server socket 
serverSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); 

sockaddr_in sockAddr; 
sockAddr.sin_family = AF_INET; 
sockAddr.sin_port = htons(5679); 
sockAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 

bind(serverSocket, (sockaddr*)(&sockAddr), sizeof(sockAddr)); 

u_long uMode = 1; 
ioctlsocket(serverSocket, FIONBIO, &uMode); 

// ... 

char pBuffer[1024]; 
while (true) 
{ 
    int iRecvSize = recv(serverSocket, pBuffer, 1024, 0); 
    if (iRecvSize) 
    { 
     printf("Received packet\n"); 
    } 
} 
+0

たとえば、 'setsockopt'呼び出しのような、より多くの関数のエラーチェックを追加することができます。 –

+0

あなたはまた*ブロードキャストを受信する*ソケットに 'SO_BROADCAST'オプションを設定する必要があります。 –

+0

@Someprogrammerdude私は実際のコードでエラーチェックをしていますが、私はこの質問のためにそれを削除しました。どの関数もエラーを返す関数はありません(WSAEWOULDBLOCKは非ブロッキングソケットに必要です)。 私は受信側でSO_BROADCASTを設定しようとしたと思いますが、もう一度試してみましょう。 – yothsoggoth

答えて

0

(コメントすることが、私の評判が十分に高くないはずです)

これはあなたに当てはまるかどうかわかりませんが、最近のバージョンのWindowsではブロードキャストで直感的な動作があります。 https://github.com/dechamps/WinIPBroadcast

:あなたは複数の物理イーサネットアダプタを持っている場合、ブロードキャストは唯一の「好ましい」インターフェイス上で受信されます

を説明し、潜在的な修正については、以下を参照してください(ここで、「好み」Windowsのルーティングテーブルによって決定されます)

もう1つの一時的な修正は、他のすべてのネットワークアダプタを無効にして、ブロードキャストが正しいものであることを確認することです(コントロールパネル/ネットワークと共有センター/アダプタの設定を変更します)。

+0

1つのネットワークアダプタを除いてすべてを無効にしようとしましたが、結果は同じでした。パケットは受信されませんでした。この問題はローカルでのテスト(クライアントとサーバーが同じプロセスの別々のスレッドで実行されている状態)にも影響しますか? – yothsoggoth

+0

@yothsoggoth私はローカルに問題があるとは思わないが、私は2つの異なるプロセスでテストしていた。同じアプリケーションの2つのスレッドの動作がどうなるか分かりません。あなたがまだデバッグするのに使っていないのであれば、Wiresharkを提案することができます。 – user1243123

関連する問題