2012-04-03 76 views
0

我需要創建一個服務器套接字,它應該拒絕連接請求,如果它在accept調用時沒有被阻塞。使連接失敗如果服務器沒有在等待接受呼叫

服務器的行爲將是

a。等待客戶端連接
b。等到客戶端關閉連接
c。轉到步驟

如果服務器正在等待客戶端連接關閉,它應該立即拒絕客戶端連接調用。獲得客戶端連接後,我們無法關閉服務器套接字。

這可能嗎?

+0

您發佈的步驟似乎相對簡單。客戶端連接後,不要再次調用accept()函數,直到客戶端斷開連接。 – Chad 2012-04-03 16:24:48

+0

@Chad:客戶端連接調用塊一段時間,然後只有它失敗。我想讓它立即失敗。 – Maanu 2012-04-03 16:29:47

+0

客戶端連接失敗,出現什麼錯誤? 10061應該使它立即返回。 – Chad 2012-04-03 16:31:25

回答

1

你要求什麼,根本不可能在服務器端。當它仍在隊列中等待被接受時,根本沒有辦法拒絕掛起的連接。在調用listen()時,您可以(也應該)將積壓值設置爲1,但這意味着您正在與另一客戶端進行通信時,隊列中最多隻能有一個連接。您必須撥打accept()才能從隊列中刪除掛起的連接,如果您當時不想與該客戶端通話,請立即致電closesocket()

你可以做的反而是呼籲0​​代替accept(),所以你可以指定返回CF_REJECT或需要CF_ACCEPT作爲一個回調函數,然後你需要不斷地打電話WSAAccept(),無論是在一個線程或重疊I/O,從隊列中刪除掛起的連接,並在與正在接受的連接進行通信時拒絕它們,直至關閉它爲止。