標籤:
http://www.cnblogs.com/khler/archive/2010/10/27/1863005.html
網上到處流傳著“妙用select函數”實現逾時等待的文章,雖然不失為一種可選做法,但總有些不符合業務需要的前提條件,比如必須為非阻塞模式,select的檔案描述符必須小於系統限制(一般是32)等等。但實際使用中,往往使用阻塞模式進行通訊,但又不想一直被阻塞,比如recv函數,如果等待指定時間接收不到資訊,就認為逾時。
使用setsockopt函數就可以達到此效果,下面一段文字來自csnd的討論帖,大家不妨參考參考,我這裡就不重複了。
http://topic.csdn.net/u/20100626/21/7e234d09-76a9-4c0e-94a9-25d524087d87.html?seed=40930018&r=69402126#r_69402126
實際是出自:http://blog.csdn.net/newger/archive%20/2008/05/19/2459113.aspx,我這裡也轉寄一下,為表示對原作者的尊重,建議大家去讀原帖。
—— 用setsockopt()來控制recv()與send()的逾時
在send(),recv()過程中有時由於網路狀況等原因,收發不能預期進行,而設定收發逾時控制:在Linux下需要注意的是時間的控制結構是struct timeval而並不是某一整型數,以下是來自於網上一篇文章中的摘錄,它是這樣寫的:
int nNetTimeout=1000;//1秒,
//設定發送逾時
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//設定接收逾時
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));這樣做在Linux環境下是不會產生效果的,須如下定義:struct timeval timeout = {3,0};
//設定發送逾時
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()會立即返回,並收到多少資料返回多少資料。
【轉】阻塞模式下的逾時等待