2016-08-13 4 views
-1

の間、私は、サーバーとクライアント間のチャットプログラムを作成したい、私はクライアントまたはサーバは、例えば待たずにいつでももう一方の端にメッセージを送信できるようにしたい:チャットサーバとクライアント

Client: hi 
Server: hi 
Server: I'm the server. 
Server: How are you? 
Client: Good. 

この例では、サーバーはクライアントが応答するのを待機せず、いつでも別のメッセージを送信します。

機能selectを使用する必要がありますか?その場合、どのようにタイムアウトを決定する必要がありますか?タイムアウト値はビジー待機の解決策ですか?

selectはこの問題の最適な方法ですか?

ありがとうございました。

+0

言語?プラットフォーム?エラー?質問? – EJP

答えて

1

selectを使用すると、特にプログラムをWindowsで動作させたい場合には、適切なアプローチのようです。これにより、プロセスをブロックして複数のクライアントから同時にメッセージを待つことができます。

通常、タイムアウトをNULLに設定して、サーバーがクライアントからの要求に対して無期限にブロックするようにしてください。タイムアウトは、他の理由で定期的にサーバーを起床させる場合にのみ有効です。

Unices(Linuxなど)をターゲティングする場合は、pollを使用する方が簡単で効率的です。これは基本的に同じことですが、インターフェイスは使いやすくなっています。 selectは、ファイルディスクリプタの数値が1024よりも大きくなった場合にはかなり扱いにくくなります。これは、サーバーが多数のクライアントを処理することが予想される場合には問題になります。

Linuxを特に対象としており、移植性を気にしない場合でも、パフォーマンスの点ではさらに優れており、おそらく使いやすくなるepollを使用することもできます。

Windowsのみをターゲットにしている場合は、ソケットごとにcreate event objectsを入力し、WaitForMultipleObjectsExを使用して、いずれかのデータを待つことができます。これはpollと同様の機能を提供しますが、APIはかなり複雑です。

関連する問題