2013-05-16 59 views
12

如果我想接受連接,我打電話accept,但我怎麼拒絕連接?如何拒絕C中的套接字連接?

在一個工作套接字回聲客戶端我有這個if語句。在echo服務器中,我怎樣才能讓echo客戶端達到這個printf聲明?

... 
if (connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) { 
    printf("Connecting failed\n"); 
    return 1; 
} 
... 
+1

接受並立即關閉 –

+0

@BartFriederichs:這就是我目前正在做的,但有沒有一種方法可以更明確地拒絕它? – c00kiemonster

+2

根據你會拒絕什麼?我想說你想要的是防火牆的工作。我知道的大多數應用程序都與黑名單一起工作,或者會接受並關閉。 –

回答

7

據我所知,這不是TCP如何工作。呼叫將始終與客戶端詳細信息一起返回。有沒有辦法peek在連接和有選擇地拒絕。

你現在這樣做的方式實際上是正確的方法:接受然後關閉。如果您在此圖層上方還有其他消息結構,則可以創建自定義的「拒絕消息」。這個選項完全取決於你的用例。

如果您正在尋找基於IP地址的拒絕,它不在您的應用程序域中。它是你防火牆的工作(正如@Bart Friederichs所說)。這樣,請求甚至不會觸及TCP堆棧。


其實我想只有在這個特定端口嚴格的一個連接。理想情況下,任何其他連接都應以非常明顯的方式失敗。

不要讓控制流中的接受呼叫。只有當您在accept上等待時,您的程序纔會等待套接字連接,否則永遠不會。

2

可能會有所幫助

  1. 在成功accept()荷蘭國際集團的客戶端連接後關閉監聽服務器套接字
  2. 重新建立它的客戶端連接已經出於各種原因後。
9

要獲得您想要的行爲(一次只接受一個連接,其他客戶端嘗試應該失敗),有兩種選擇。

  • 您可以在接受連接後關閉收聽套接字。在接受的連接關閉後重新創建您的監聽套接字。

  • 如果已經有連接正在進行,您可以關閉新建連接。如果你想在客戶端看到TCP重置,大多數TCP協議棧都會觸發一個,如果你能夠用0

    struct linger lo = { 1, 0 };
    setsockopt(s, SOL_SOCKET, SO_LINGER, &lo, sizeof(lo));
    close(s);

+0

實際上是第一個選項嗎?保持監聽套接字打開狀態可能會更好,以確保只要程序運行,資源就被程序「擁有」。 –

+0

@CraigMcQueen:我假設服務器端口已經配置,如果使用這個選項。 – jxh

4

超時在標準插座流連忘返選項在大多數平臺上的API,沒有辦法拒絕連接。您必須連接accept(),然後如果不需要立即關閉它。

此規則的例外是Winsock特定的WSAAccept()函數。它提供了一個回調,它允許應用程序根據每個連接來決定應該接受,拒絕還是保留在積壓隊列中的連接。

相關問題