網路超時檢測 setsockopt()

2021-07-23 05:53:42 字數 2682 閱讀 3254

setsockopt()函式

1、使用setsockopt()實現超時檢測時相比其他兩種方式的特點是:

只要呼叫setsockopt函式一次,函式下發所有阻塞函式均可使用,且永久有效。

阻塞函式在到達設定的時間時,會被系統認定為錯誤,使阻塞函式返回值小於0;

#include int setsockopt(int socket, int level, int option_name,

const void *option_value, socklen_t option_len);

引數: socket: 檔案描述符

level: 對應協議層

sol_socket 應用層

ipproto_tcp tcp層

ipproto_ip ip層

option_name:選項的名稱

so_broadcast 允許傳送廣播 int

so_reuseaddr 允許重複使用位址 int

so_sndbuf 獲取傳送緩衝器大小

so_rcvbuf 獲取接收緩衝區大小

so_rcvtimeo 設定接收超時時間

so_sndtimeo 設定傳送超時時間

option_value:對應選項的值

option_len:大小

返回值:

成功:0

失敗:-1

so_rcvtimeo 設定接收超時時間

+++++++++++++++++++++++++++++++++++++

struct timeval ;

+++++++++++++++++++++++++++++++++++++

//使用setsockopt實現網路超時檢測

//setsockopt函式只要呼叫一次,下方所有的阻塞函式都會使用,並永久有效

struct timeval out_time;

out_time.tv_sec = 5;

out_time.tv_usec = 0;

if(setsockopt(sockfd, sol_socket, so_rcvtimeo, &out_time, sizeof(out_time)) < 0)

下面上例項:

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#define n 128

#define errlog(errmsg) dowhile(0)

int main(int argc, const

char *argv)

; //建立套接字

if((sockfd = socket(af_inet, sock_stream, 0)) < 0)

//填充網路資訊結構體

//inet_addr 將點分十進位制轉化成網路位元組

//htons表示將主機位元組序轉化成網路位元組序

//atoi 將字串轉化成整型資料

serveraddr.sin_family = af_inet;

serveraddr.sin_addr.s_addr = inet_addr(argv[1]);

serveraddr.sin_port = htons(atoi(argv[2]));

//將套接字與ip位址和埠號繫結

if(bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)) < 0)

//將套接字設定為被動監聽狀態

if(listen(sockfd, 10) < 0)

//使用setsockopt實現網路超時檢測

//setsockopt函式只要呼叫一次,下方所有的阻塞函式都會使用,並永久有效

struct timeval out_time; // 結構體原型可以用「 vim -t timeval 」來檢視

out_time.tv_sec = 5; //設定超時檢測的時間為5秒

out_time.tv_usec = 0;

if(setsockopt(sockfd, sol_socket, so_rcvtimeo, &out_time, sizeof(out_time)) < 0)

//setsockopt函式在呼叫之後,所有的阻塞等待函式就上了乙個計時器,例如設定時間為5秒,在阻塞了4秒後,第5秒

//仍沒有接收到資料的話,系統會認定這個阻塞函式錯誤。此時,函式(以accept函式為例,其他函式暫未實驗)返回

//失敗 -1 ,在返回失敗後,進入if(errno == 11)函式內,列印timeout.

//驗證:把if(errno == 11)刪除後,呼叫函式,程式在阻塞4秒後,在第5秒時,

//執行了errlog("fail to accept"),在終端列印了錯誤資訊後,退出了程式。

while(1)

else

}else

else

}else

else}}

}}

}close(sockfd);

close(acceptfd);

return

0;}

網路超時檢測

getsockopt setsockopt 網路超時檢測 必要性 避免程序在沒有資料時無限制的阻塞 當設定的時間到,程序從原操作返回繼續執行 3種方式可以 1.設定socket的屬性 so rcvtimeo 接收超時 so sndtimeo 傳送超時 struct timeval tv tv.tv ...

網路程式設計中的超時檢測

華清遠見嵌入式學院 講師。一 設定套接字接收超時 setsockopt可以設定套接字的屬性,其中包括接收超時時間。參考 如下 struct timeval tv 描述時間的結構體變數 tv.tv sec 8 tv.tv usec 0 setsockopt sockfd,sol socket,so r...

網路程式設計中的超時檢測

華清遠見嵌入式學院 講師。一 設定套接字接收超時 setsockopt可以設定套接字的屬性,其中包括接收超時時間。參考 如下 struct timeval tv 描述時間的結構體變數 tv.tv sec 8 tv.tv usec 0 setsockopt sockfd,sol socket,so r...