select 設定傳送超時傳送注意事項

2022-03-13 13:03:29 字數 1340 閱讀 8473

//設定傳送超時

你只傳送, 並傳送足夠多的資料以填滿傳送緩衝區, 接收端一直不接收.

傳送端一量滿傳送緩衝區就會阻塞, 如果你設定了傳送超時, 超時到了它就會返回傳送超時了.

在send(),recv()過程中有時由於網路狀況等原因,收發不能預期進行,而設定收發超時控制:

這樣做在linux環境下是不會產生效果的,須如下定義:struct timeval timeout = ; 

//設定傳送超時

setsockopt(socket,sol_socket,so_sndtimeo,(char *)&timeout,sizeof(struct timeval));

//設定接收超時

setsockopt(socket,sol_socket,so_rcvtimeo,(char *)&timeout,sizeof(struct timeval));

有兩點注意就是:

1)recv ()的第四個引數需為msg_waitall,在阻塞模式下不等到指定數目的資料不會返回,除非超時時間到。還要注意的是只要設定了接收超時,在沒有msg_waitall時也是有效的。說到底超時就是不讓你的程式老在那兒等,到一定時間進行一次返回而已。

2)即使等待超時時間值未到,但對方已經關閉了socket, 則此時recv()會立即返回,並收到多少資料返回多少資料。

在進行程式開發時,有時候需要阻塞,但同時又需要有超時功能,這時候select()函式就能很好的滿足我們的要求:

但用這進行測試時有乙個地方是需要注意的,即select()的第五個引數timeval *timeout的問題。設定好timeout的始值後,如果只對select()呼叫一次,是沒有任何問題的,但一旦多次呼叫,你就會發現怎麼好像我設定的timeout值只有第一次有用呢,以後select()總是一刻也不等就返回了呢?

通過檢視man和自己測試,原來select()函式內部是會不斷更新timeout的值的,以檢視超時時間還剩多少。那麼第一次呼叫之後,timeout的值就被更新至0了,以後不管你再呼叫它多少次,select()都會立即返回了,這就是為什麼會出現在多次呼叫時,select()只有第一次時湊效的緣由了,哈哈,以後再使用它時,要尤其注意這一點了。但它的兄弟函式pselect()沒有它的這個問題,它不會在內部在時間值進行更新的。

socket在每次執行select的時候都得要重新對time進行賦值 防止select修改了time引數 對下一次的判斷造成干擾

for (i = 0 ; i < waittimeout ; i++)

else

if (iret > 0

)

}

select 設定傳送超時傳送注意事項

設定傳送超時 你只傳送,並傳送足夠多的資料以填滿傳送緩衝區,接收端一直不接收.傳送端一量滿傳送緩衝區就會阻塞,如果你設定了傳送超時,超時到了它就會返回傳送超時了.在send recv 過程中有時由於網路狀況等原因,收發不能預期進行,而設定收發超時控制 這樣做在linux環境下是不會產生效果的,須如下...

Tcp設定傳送和接收超時

linux和windows下用setsockopt設定so sndtimeo,so rcvtimeo的引數的一點區別 udp的socket在某些情況 如對方關閉時,本地可能sendto不出去資料,然後recvfrom就會被阻塞,這時就需要設定 這兩個引數的值提高程式質量。linux struct t...

CXF傳送 接收訊息超時設定

在使用webservice時,我們通常都會在客戶端中設定請求超時的限制,以避免長時間的去連線不可用的伺服器。在cxf的環境下,客戶端可通過兩個屬性配置超時限制 http.setclient httpclientpolicy spring cxf配置方式 這裡需要注意的有幾個地方 1 需要指定http...