2012-03-17 11 views
0

シンプルなネットワークプロジェクトの一環として、私は2台のコンピュータを接続して単純なデータパケットを送信しようとしています。クライアントはブロードキャストを使用してサーバーを検索し、サーバーはクライアントからこのブロードキャストを正常に検出します。ブロードキャストからサーバー応答を受信するにはどうすればいいですか?

サーバーは応答パケットを送信しますが、クライアントにパケットを受信させることができません。

問題はブロードキャスト方法にあると思われます。なぜなら、直接サーバー接続を使用すると、INADDR_BROADCASTの代わりにIPアドレス127.0.0.1または192.168.0.xを指定してからサーバーが接続し、クライアントはそれを受信します。

クライアントの聴取コード:

// Stop the client from waiting for packets if there are none. 
fd_set checksockets; 
checksockets.fd_count = 1; 
checksockets.fd_array[0]=m_listenSocket; 
struct timeval t; 
t.tv_sec=0; 
t.tv_usec=0; 
int waiting = select(NULL, &checksockets, NULL, NULL, &t); 

// If there is at least one packet receive it. 
if(waiting>0) { 
    std::cout << "Packet received.\n"; 
} 

私はのrecvfrom()メソッドを使用してサーバーのアドレスを見つけようと、この時点から。

私は、作成した直後にクライアントソケットでブロードキャストフラグを使用するようにしました。これによりエラーは返されません。

int value=true; 
int result = setsockopt(m_socket, SOL_SOCKET, SO_BROADCAST, (char*)&value, sizeof(value)); 

私は私が使用したと誰がエラーを返さないすべての可能なWINSOCK機能をチェックしました。

私は同じポートでリッスンするためだけに2番目のソケットを作成しようとしましたが、これはサーバーと競合し、したがって開くことができません。

本質的に、私が尋ねようとしているのは、クライアントがブロードキャストからの返信を聞くことができますか? - サーバーのアドレスは、最初は不明ですが、私は返信アドレスを使用して新しいソケットを作成しようとしていますが、サーバーはブロードキャストを受信して​​いて、返信を確実に送信していますが、

+0

ループで選択するように呼び出していますか?両側で受け取るコードはどう違うのですか? –

+0

私はこの時点で非常に奇妙な状況に陥っています。サーバーソケットはINADDR_BROADCASTにバインドされ、クライアントソケットは同じポート上で127.0.0.1にバインドされます。私はクライアントで受信することができますが、クライアントのバインドを解除(ソケットを閉じる)してから受信できない限り送信できません。あなたの質問に答えるために、はい私は選択/受信コードをループしています。このコードは、サーバーとクライアントの両方でほぼ同じです。 –

答えて

0

INADDR_BROADCASTにバインドされている場合、戻ってくることはありません。これは正常です:アドレスにバインドされている場合、そのアドレスからのパケットのみを受信します。ソケットをまったくアドレスにバインドする必要はありません。この操作は、通常、接続されたソケット(TCP)に必要です。受信ソケットが動作すれば、同じマシン上ですべてのテストを行っているからです。

特定のアドレスからパケットを受信する場合は、connectまたはsendtoreceivefromを使用してみます。

+0

興味深いことに、実際に私はクライアントとサーバーの間で送受信できるサーバーからバインディングコードを削除すると分かります。どうもありがとう。 –

関連する問題