accept與connect的超時設定

2021-08-06 03:56:30 字數 1535 閱讀 6261

connect超時:

我們都知道,connect對應與三次握手中的第一次傳送syn,而對待伺服器的ack,如果伺服器沒有啟動伺服器,有些機器會立刻返回乙個rst表示伺服器拒絕,從而connect失敗,但又些伺服器為了防止攻擊,什麼也不傳送,直至客戶端connect超時,而這一時間又75s,對於客戶端來說是不能接收的。所以需要設定connect的超時時間。

[cpp]view plain

copy

"white-space:pre"

>    uint32_t ul = 1;  

ioctl(sock, fionbio, &ul);//設定成非阻塞

printf("start time: %u\n"

, time(0));  

bool

success = 

false

;  if

(connect(sock, (sockaddr *)&srv_addr, 

sizeof

srv_addr ) == -1)  

else

}  ul = 0;  

ioctl(sock, fionbio, &ul); //設定成阻塞

accept超時:

一半來說伺服器應該都是在accept狀態,也就無需設定accept超時時間,但一些特殊情況還是需要的。對於accept我們可以使用select多路復用來實現超時設定,但那個**較多。那有沒有別的辦法呢?我們指定,accept對應三次握手中中伺服器接收syn,那麼我們能不能通過設定recv超時來實現accept超時呢?答案是肯定的。

[cpp]view plain

copy

struct

timeval timeout = ;  

if(setsockopt(proxy_sock, sol_socket, so_rcvtimeo, (

char

*)&timeout, 

sizeof

(struct

timeval)) != 0)  

sock = ::accept(proxy_sock, (sockaddr *)null, null);  

既然可以用recv超時來設定accept超時,那對於connect能不能通過設定send超時來實現connect超時呢?答案是肯定的!!!

[cpp]view plain

copy

setsockopt(sock, sol_socket, so_sndtimeo, (

char

*)&timeout, 

sizeof

(struct

timeval));  

只要將connect和accept對應到三次握手過程中就不難理解這些了。

綜上:我們可以通過設定so_recvtimeo和so_sendtimeo來設定accept超時和connect超時。

accept與connect的超時設定

connect超時 我們都知道,connect對應與三次握手中的第一次傳送syn,而對待伺服器的ack,如果伺服器沒有啟動伺服器,有些機器會立刻返回乙個rst表示伺服器拒絕,從而connect失敗,但又些伺服器為了防止攻擊,什麼也不傳送,直至客戶端connect超時,而這一時間又75s,對於客戶端來...

accept與connect的超時設定

connect超時 我們都知道,connect對應與三次握手中的第一次傳送syn,而對待伺服器的ack,如果伺服器沒有啟動伺服器,有些機器會立刻返回乙個rst表示伺服器拒絕,從而connect失敗,但又些伺服器為了防止攻擊,什麼也不傳送,直至客戶端connect超時,而這一時間又75s,對於客戶端來...

事件的accept 與ignore 的傳遞

事件是qt中比較難理解的概念,需要花費大量時間鑽研。下面簡單講解 accept 與 ignore 在程式中的傳遞邏輯 1 存在基類 a,其子類 b,層次部件 mainwindow,分別建立類的例項 testa testb mainwindow 2 testb收到 事件c,若選擇 accept 則由t...