主要有三種方案:
(1)呼叫alarm,它在指定超時期滿時產生sigalrm訊號,此方法涉及訊號處理,而訊號處理在不同的實現上存在差異,而且可能干擾程序中現有的alarm呼叫。
(2)在select,即多路復用中阻塞等待io,因為select有內建的時間限制,以此代替直接阻塞在read或write上的呼叫。
(3)使用較新的so_rcvtimeo和so_sndtimeo套接字選項,這個方法的問題在於並非所有的實現都支援這兩個套接字選項。
一、首先看乙個如何呼叫alarm,它主要是通過對慢系統呼叫產生中斷訊號來完成。
int connect_timeo(int sockfd, const sa *saptr, socklen_t salen, int nsec)alarm(0);
signal(sigalrm, sigfunc);
return n;}
static void connect_alarm(int signo)
二、再來看一select多路復用是如何做到這一點的,它主要是通過第五個引數來設定所阻塞的描述符超時情況。
int readable_timeo(int fd, int sec)
這樣,在每次呼叫read之前就可以先呼叫此函式來設定超時秒數。如下:
int readable_timeo(int fd, int sec)
三、使用so_rcvtimeo套接字選項為recvfrom設定超時
本選項一旦設定到某個描述符上,其超時設定將應用於該描述符上的所有讀操作,本方法的優勢在於一次設定,一直生效,而前面兩種方法需要在每個操作發生之前設定。另外,本套接字選項僅用於讀操作,類似so_sndtimeo僅用於寫操作,但兩者均不能用於為connect設定超時,從名字就可以看出,乙個是接收,乙個是傳送。
struct timeval tv;tv.tv_sec = 5;
tv.tv_usec = 0;
setsockopt(sockfd, sol_socket, so_rcvtimeo, &tv, sizeof(tv)); //設定超時,通過設定套接字選項
while(fgets(sendline, maxline, stdin) != null)
else
err_sys("recvfrom error!");
}recvline[n] = 0;
fputs(recvline, stdout);
}
Unix網路程式設計 高階IO套接字設定超時
我們知道。對於乙個套接字的讀寫 read write 操作預設是堵塞的。假設當前套接字還不可讀 寫,那麼這個操作會一直堵塞下去,這樣對於乙個須要高效能的server來說,是不能接受的。所以,我們能夠在進行讀寫操作的時候能夠指定超時值,這樣就讀寫操作就不至於一直堵塞下去。在涉及套接字的i o操作上設定...
給套接字設定超時檢測
在涉及套接字i o操作上設定超時的方法有以下3種。呼叫alarm,它在指定超時期滿時產生sigalrm訊號。這個方法涉及訊號處理,而訊號處理在不同的實現上存在差異,而且可能干擾程序中現有的alarm呼叫。在select中阻塞等待i o select有內建的時間限制 以此代替直接阻塞在read或wri...
給套接字設定超時檢測
在涉及套接字i o操作上設定超時的方法有以下3種。呼叫alarm,它在指定超時期滿時產生sigalrm訊號。這個方法涉及訊號處理,而訊號處理在不同的實現上存在差異,而且可能干擾程序中現有的alarm呼叫。在select中阻塞等待i o select有內建的時間限制 以此代替直接阻塞在read或wri...