如何在套接字IO操作上設定超時機制

2022-07-08 04:15:09 字數 1269 閱讀 5708

主要有三種方案:

(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...