如果我想接受連接,我打電話accept
,但我怎麼拒絕連接?如何拒絕C中的套接字連接?
在一個工作套接字回聲客戶端我有這個if語句。在echo服務器中,我怎樣才能讓echo客戶端達到這個printf
聲明?
...
if (connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) {
printf("Connecting failed\n");
return 1;
}
...
如果我想接受連接,我打電話accept
,但我怎麼拒絕連接?如何拒絕C中的套接字連接?
在一個工作套接字回聲客戶端我有這個if語句。在echo服務器中,我怎樣才能讓echo客戶端達到這個printf
聲明?
...
if (connect(sock, (struct sockaddr *) &server, sizeof(server)) < 0) {
printf("Connecting failed\n");
return 1;
}
...
據我所知,這不是TCP如何工作。呼叫將始終與客戶端詳細信息一起返回。有沒有辦法peek在連接和有選擇地拒絕。
你現在這樣做的方式實際上是正確的方法:接受然後關閉。如果您在此圖層上方還有其他消息結構,則可以創建自定義的「拒絕消息」。這個選項完全取決於你的用例。
如果您正在尋找基於IP地址的拒絕,它不在您的應用程序域中。它是你防火牆的工作(正如@Bart Friederichs所說)。這樣,請求甚至不會觸及TCP堆棧。
其實我想只有在這個特定端口嚴格的一個連接。理想情況下,任何其他連接都應以非常明顯的方式失敗。
不要讓控制流中的接受呼叫。只有當您在accept
上等待時,您的程序纔會等待套接字連接,否則永遠不會。
可能會有所幫助
accept()
荷蘭國際集團的客戶端連接後關閉監聽服務器套接字要獲得您想要的行爲(一次只接受一個連接,其他客戶端嘗試應該失敗),有兩種選擇。
您可以在接受連接後關閉收聽套接字。在接受的連接關閉後重新創建您的監聽套接字。
如果已經有連接正在進行,您可以關閉新建連接。如果你想在客戶端看到TCP重置,大多數TCP協議棧都會觸發一個,如果你能夠用0
struct linger lo = { 1, 0 };
setsockopt(s, SOL_SOCKET, SO_LINGER, &lo, sizeof(lo));
close(s);
實際上是第一個選項嗎?保持監聽套接字打開狀態可能會更好,以確保只要程序運行,資源就被程序「擁有」。 –
@CraigMcQueen:我假設服務器端口已經配置,如果使用這個選項。 – jxh
超時在標準插座流連忘返選項在大多數平臺上的API,沒有辦法拒絕連接。您必須連接accept()
,然後如果不需要立即關閉它。
此規則的例外是Winsock特定的WSAAccept()
函數。它提供了一個回調,它允許應用程序根據每個連接來決定應該接受,拒絕還是保留在積壓隊列中的連接。
接受並立即關閉 –
@BartFriederichs:這就是我目前正在做的,但有沒有一種方法可以更明確地拒絕它? – c00kiemonster
根據你會拒絕什麼?我想說你想要的是防火牆的工作。我知道的大多數應用程序都與黑名單一起工作,或者會接受並關閉。 –