2012-04-03 28 views
0

私は、着信接続を受信すると、接続を受け入れてソケット記述子をリストに追加するTCPサーバーアプリケーションを持っています。サーバーはリストを必要とするので、リストを反復して、接続されているすべてのクライアントに定期的にデータを送信できます。poll()からソケット記述子を追加/削除する

いずれかのクライアントが接続を閉じると、対応するソケットディスクリプタをリストから削除する必要があります。

私はPOLLHUPである可能性のある閉じられた接続を検出できるようにpoll()の記述子を追加しようとしましたが、ポーリングを中断して新しい接続が入るたびに記述子を動的に追加する方法がわかりません。

サーバーは、データを送信したいときはいつでも、開いているすべての接続のディスクリプタのリストを必要とします。

どうすればよいですか?助言がありますか?

編集:これは私がやったことです:私は各クライアントのスレッドを作成し、ポーリングにfdを追加しました。サーバー上の 擬似コード:

sockfd = accept the conn. 
pthread_create 

// Inside the thread, add sockfd to poll 
struct pollfd fds[1]; 
fds[0].fd = sockfd; 
poll(fds, 1, 500000); 
Check for POLLHUP returned event and see which client(fd) closed the connection. 

これは、すべての記述子をポーリングするようだが、私の問題は、今、私がテストしたときに、2つclients..only 1の記述子のとの接続を閉じるとPOLLHUPを返すということです。

+0

複数のクライアントでテストした結果、POLLHUPは、サーバーに接続されている最初のクライアントを除くすべてのソケットを閉じることによってトリガーされることがわかりました。 – ddd

答えて

3

私は動的にあなたが活動のためのリスニングソケットを監視する必要があるすべての着信新しい接続

にそのセットに 記述子を追加するために世論調査を中断する方法を見つけ出すことはできません。 pollが最初にチェックを外すと、「私のリスニングソケットは面白くなっていますか?その場合は、受け入れてpollと自分のリストに追加してください。

関連する問題