2017-07-28 10 views
0

私はソケットを学んでいます。私は小さなメッセージが送信される単純なUDPサーバーを作成しています。すべてのアクティブなクライアントは3分ごとに "キープアライブ"メッセージを送信し、サーバーがどのクライアントがオンラインであるかを確認できるようにします。С++ - 複数のクライアントを持つUDPサーバ

void keepAlive(SOCKET udp) 
{ 
int len=0; 
while(true) 
{ 
int len=recvfrom(udp,requestBuffer,maxMessage,0,(sockaddr*)&cliAddr,&cliAddrSize) 
// Actions with the received message 
} 
} 

しかし、実装する方法、例えば、すべてのクライアントまたは特定のものへのメッセージの送信は、ソケットがすでにある場合:

これらのメッセージは、

流れ関数は、ストリームで受信されています"忙しい"。メッセージを送信するために新しいソケットを作成する必要がありますか? (サーバーとクライアントで)?クライアントがNATの後ろにいる場合は?

同じ質問(キープアライブがスレッドに取り出されるが、この問題を解決する際に、他のはあまりにも解決されているため)、クライアントの側にもある

答えて

0

にサーバがキープアライブメッセージを受信した後、すでにcliAddrのクライアントアドレスを取得しました。 次にsendto関数を使って何かをクライアントに送ることができます。 他のソケットを使いたいなら、それを作ることができます。 クライアントがNATの後ろにいる場合は? 問題ではありません。サーバーにWANアドレスがある場合、ルーターはLANのIPアドレスとポートをWANアドレスとポートに変換します。サーバーにあるクライアントアドレスはWANアドレスとポートです。 WAN(アドレスとポート) - マップ - LAN(アドレスとポート)。

クライアントでは、メッセージを受信して​​処理することをお勧めします(キープアライブメッセージやその他のタイプを含める)。

+0

すぐに回答を送ってほしくないです。私はこれをいつでもやりたいですが、私のソケットはキープアライブを待って忙しいです。 –

+0

サーバーで、recvfromをブロックしない場合は、イベントを処理する別のスレッドを作成するか、recvメッセージを作成することができます。他のスレッドでは、いつでも送信することができます。 – user8380302