2016-11-04 104 views
1

我想停止接受來自主線程的連接..我在這裏複製了原始代碼。在這臺服務器上。它爲每個連接產生一個新的線程。有一個單獨的線程來清理連接池,另一個用於用戶命令處理的線程完全可以正常工作。我只是想停止接受基於用戶命令的新連接。 accept方法我用下面的邏輯停止接受停止接受新的連接

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

主線程內,但設置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

有多種方式來解決這個問題,其中A部分是「最好「將取決於你的具體情況。正如一位評論者所建議的,在您第一次接聽電話之前,您必須將套接字設置爲非阻塞狀態。

+0

鏈接中的註釋明確指出,更改阻塞模式不會影響已在進行中的accept()。 – EJP

+0

@EJP正確;在調用它之前,您必須將其設置爲非阻塞。然後,你必須編寫額外的代碼,一旦bListening錯誤就停止調用它。該鏈接解釋瞭如何使accept()非阻塞,然後可以修改調用代碼以執行提交者想要的內容。 – Andrew