2016-11-04 5 views
1

メインスレッドからの接続の受け入れを停止したい。元のコードをここにコピーした。このサーバーで各接続ごとに新しいスレッドを生成します。接続プールをクリーニングするための別個のスレッドと、すべての作業を完全に処理するための別のスレッドがあります。私はちょうどユーザーコマンドに基づいて新しい接続を受け入れることをやめたいと思う。受け入れる方法は、iが新しい接続の受け入れを停止する

while (bListening && (sctCommSocket = accept(sctBaseSocket,(struct sockaddr *)&addrClient,&c)) != INVALID_SOCKET) 

の受け入れを停止するには、次のロジックを使用するが、trueに設定した後bListening ..ループは依然として1つの接続を受け入れる..しかし、これは予想されなかったメインスレッド内に存在します。説明してください

+0

これを修正しない方が簡単かもしれませんが、不要な接続を切断するだけです。 – MSalters

答えて

0

フラグを設定すると、ループはすでにaccept()でブロックされていたため、次の接続を受け入れました。

+0

私は論理的なトラップに言及しています。あなたは解決策を提案できますか?むしろこのようにしようとする一時停止メカニズムはありますか? – Hara

+1

受け入れを停止する場合は、リスニングソケットを閉じます。待機中のバックログ・キューのために他には何もしません。 – EJP

-1

これは、ここで尋ねた質問に非常に似ている:私はそれはあなたが使用しているオペレーティングシステムとマルチスレッドライブラリのコードスニペットから明らかではないが、それはあまりにもあなたの問題を解決すると思いますIs it possible (and safe) to make an accepting socket non-blocking?

編集:

ここでは、ネットワークプログラミングの良いガイドです:http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html

ブロッキングの問題は、特にこの問題に対処するために複数の方法がありますhttp://beej.us/guide/bgnet/output/html/singlepage/bgnet.html#Blocking

あるアドレスとセクションがあるが "最高 "はあなたの特定の場合に依存します。コメント欄が示唆しているように、最初にacceptを呼び出す前に、ソケットを非ブロッキングに設定する必要があります。

+0

あなたのリンクのコメントは、ブロッキングモードの変更が既に進行中の 'accept()'に影響しないことを明確に述べています。 – EJP

+0

@EJP;それを呼び出す前に非ブロックに設定する必要があります。それから、一度bListeningがfalseになると呼び出すことを止めるために、コードを書く必要があります。このリンクはaccept()ノンブロッキングを行う方法を説明していますので、呼び出し側のコードを変更してAskerが望むことをすることができます。 – Andrew

関連する問題