1. 程式人生 > >connect設定超時的方法

connect設定超時的方法

在使用TCP的connect連線伺服器時,在預設情況下系統使用的是阻塞式socket,如果伺服器當前不可用,則connect會等待知道超時時間到達,而這個超時時間是系統核心規定的,並不能使用setSocketOpt來設定,這個函式只能設定send和recv的超時,為了能夠隨意控制connect的超時時間,可以使用select。大致的過程就是先將socket設定成非阻塞,使用select去輪詢套介面,再根據套介面去判斷連線狀態。

int connectServer(int sock_fd,unsigned int port,char* ip)
{
    struct sockaddr_in servaddr;
    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(port);
    inet_aton(ip, &servaddr.sin_addr );

    fcntl(sock_fd,F_SETFL,fcntl(sock_fd,F_GETFL,0)|O_NONBLOCK);
    int connected = connect(sock_fd, (struct sockaddr*)&servaddr, sizeof(struct sockaddr_in));
    int ret = -1;
    if (connected != 0 )
	{
		if(errno != EINPROGRESS)
			printf("connect error :%s\n",strerror(errno));
		else
		{
			struct timeval tm = {2, 0};
			fd_set wset,rset;
			FD_ZERO(&wset);
			FD_ZERO(&rset);
			FD_SET(sock_fd,&wset);
			FD_SET(sock_fd,&rset);
			long t1 = time(NULL);
			int res = select(sock_fd+1,&rset,&wset,NULL,&tm);
			long t2 = time(NULL);
			printf("interval time: %ld\n", t2 - t1);
			if(res < 0)
			{
				printf("network error in connect\n");
			}
			else if(res == 0)
			{
				printf("connect time out\n");
			}
			else if (1 == res)
			{
				if(FD_ISSET(sock_fd,&wset))
				{
					printf("connect succeed.\n");
					fcntl(sock_fd,F_SETFL,fcntl(sock_fd,F_GETFL,0) & ~O_NONBLOCK);
					ret = 0;
				}
				else
				{
					printf("other error when select:%s\n",strerror(errno));
				}
			}
		}
	}

    return ret;
}

程式先把socket設定成非阻塞,connect在非阻塞模式下會立刻返回,如果沒有其他錯誤,返回值等於0。當connect不能立刻建立連線時,會返回一個EINPROGRESS,表示連線正在建立的過程中,這時我們可以使用select去輪詢套介面,而select的輪詢超時時間可以根據自己的需要去設定,最主要的是輪詢的集合一定要是讀和寫的集合,即select的第二和第三個引數要賦值,待select返回就可以去判斷返回值來確定connect的程序狀態了。如果返回值小於0,說明connect的程序出現了錯誤,如果是等於0則說明connect超時,如果等於1,並且套介面此時的狀態是可寫,則說明了connect已經成功建立(關於這點大概是因為伺服器接收了連線後,不會立刻想socket寫資料,這是客戶端就只能輪詢到可寫的socket,我覺得如果伺服器接受連線並立刻寫資料,在客戶端就可能是返回2,這時學要同時判斷socket的可讀和可寫了);其他情況的話就算是其他錯誤吧,至此,我們只需要設定select的超時值就可以隨心所欲地實現自己想要的connect連線超時了。

最後,別忘了把套介面設定會阻塞狀態,畢竟阻塞狀態加執行緒方便控制。

相關推薦

connect設定超時方法

在使用TCP的connect連線伺服器時,在預設情況下系統使用的是阻塞式socket,如果伺服器當前不可用,則connect會等待知道超時時間到達,而這個超時時間是系統核心規定的,並不能使用setSocketOpt來設定,這個函式只能設定send和recv的超時,為了能夠隨

Socket connect() 設定超時時間

Socket connect() 設定超時時間 1,linux或者win32控制檯程式中connect函式預設是阻塞的,成功則返回0,失敗返回-1,錯誤碼可以用函式GetLastError獲得。如果連線一個開啟的伺服器一般回立即返回並且成功連線socket連線,如果連線一個存在但是沒有開

C# 給TcpClient的Connect方法設定超時時間

var client = new TcpClient(); var result = client.BeginConnect("remotehost", this.Port, null, null); var success = result.AsyncWaitHandle.WaitOne(TimeS

遞迴方法設定超時時間

public static String getCheckCode(String token,String number,int timeout){ try { Thread.sleep(3000); } catch (InterruptedException e

C語言socket設定超時的幾種方法

1.建立socket2.將該socket設定為非阻塞模式3.呼叫connect()4.使用select()檢查該socket描述符是否可寫(注意,是可寫)5.根據select()返回的結果判斷connect()結果6.將socket設定為阻塞模式(如果你的程式不需要用阻塞模式

accept與connect超時設定

connect超時: 我們都知道,connect對應與三次握手中的第一次傳送SYN,而對待伺服器的ACK,如果伺服器沒有啟動伺服器,有些機器會立刻返回一個RST表示伺服器拒絕,從而connect失敗,

Dynamics 365執行操作報SQL Server已超時,更改這個超時設定方法

本人微信公眾號:微軟動態CRM專家羅勇 ,回覆291或者20190110可方便獲取本文,同時可以在第一間得到我釋出的最新博文資訊,follow me!我的網站是 www.luoyong.me 。 當執行的SQL耗時太久容易出現下面的錯誤:SQL Server 錯誤。 SQL Server 已超時。 &

socket I/O上設定超時的三種方法及其比較

        在socket I/O上設定超時, 一般有三種方法, 下面我們來聊聊。       1.  select/poll        這是最好的方法, 也是最為推薦的, 對於send/sendto和recv/recvfrom, 都可以用select和poll來設定

jQuery ajax $.get或$.post 實現timeout超時設定方法

var timeout=setTimeout(function(){ //超時啦,乾點什麼 }, 5000 //超時時間,考慮到網路問題,5秒還是比較合理的 ); $.post(url,function(data){ if(timeout){ //清除定時

執行緒池中多執行緒設定超時退出監控

前言 在寫多執行緒程式時,大多數情況下會先excutor建立執行緒池,然後再建立執行緒,但是對一些讀資料庫或者其他IO操作,容易堵住執行緒,此時就需要給執行緒設定超時時間,幹掉超時的執行緒再重新拉起一個執行緒來,但是java執行緒建立並沒有預留超時引數,研究了一下網上也沒找到

C# 中使用TCP連線設定超時問題

在使用C#中用TCP連線去掃描IP的過程中,發現,TCP連線沒有可以設定連線超時的方法,如果掃描到空的IP或連線失敗,那要等20多秒,甚至更長, 我們可以重新去用Thread的join這個帶引數的執行緒,來解決這個問題,下面的這個類就是但連線超時引數的TCPCliento類 the TcpC

celery給每個任務設定超時時間

關於celery任務超時處理的坑,我先說下我之前遇到的問題: 這是我之前的任務超時配置: 專案中需要執行兩個任務,但是兩個任務執行的週期和執行的耗時都不一樣,這個配置是影響全域性的, 我現在的需求是把兩個任務分別設定耗時時間,找了很多資料,看了官網,都沒有淺顯易懂的答案,下面

設定超時時間真的很重要

概述 在一條慢SQL導致購物車服務無法使用一文中,提到了客戶端呼叫購物車服務的時候,超時了。如果當時客戶端沒有設定超時時間的話,會在客戶端中產生級聯故障。先用一張圖來說明一下。 聚合層除了呼叫購物車微服務,還呼叫了營銷系統微服務。如果購物車服務的介面響應時間很慢,而客

雙十一大促淘寶主圖設定優化方法

  我們都知道,主圖是開啟客戶心門的一扇窗。有些賣家會問雙十一是那種主圖風格呢,我們要從哪些方面入手進行主圖優化呢?下面小編就帶大家瞭解一下,雙十一主圖優化需要做到那幾點。     一、瞭解流行趨勢。   每年的淘寶雙十一玩法不同,流行趨勢也千變萬化。因為今年的雙十一預售已

Python視覺化中Matplotlib(4.三種設定樣式方法設定座標刻度以及標籤、設定顯示出特殊字元)

1.三種設定方式   (1)向方法傳入關鍵字引數 上一節已經總結過,一直在使用   (2)對例項使用一系列的setter方法           具體的方法直接看程式碼  import matplotli

Go基礎系列:為select設定超時時間

After() 誰也無法保證某些情況下的select是否會永久阻塞。很多時候都需要設定一下select的超時時間,可以藉助time包的After()實現。 time.After()的定義如下: func After(d Duration) <-chan Time After()函式接受一個時長d

筆記-iOS設定圓角方法以及指定位置設圓角

第一種方法:通過設定layer的屬性 程式碼: UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"TestImage"]]; // 只需設定layer層的兩個屬性 // 設定圓角 imageVi

SpringBoot Rest Api 設定超時時間

專案有一對外開放api,外網訪問經常出現超時,剛接觸spring boot不久,內建的tomcat不像原先那樣在server.xml中設定request超時時間。 後來查了些資料,在配置檔案application.properties中加了spring.mvc.async.request

centos 服務開機啟動、關閉設定方法

centos 6 與 centos 7 服務開機啟動、關閉設定的方法: centos 6 :使用chkconfig命令即可。 我們以apache服務為例: #chkconfig --add apache 新增apache 服務 #chkconfig apache on 開機

express 4.X.X版本 npm版本3.X.X版本以上 沒有layout.js檔案的解決方法 頁面佈局設定方法

這是我所使用的版本 因為看的書是<<node js程式設計指南>> 此書版本過於陳舊,所以上面的步驟無法進行下去,例如書上所寫 "app.set('view.option',layout:false)";可以關掉頁面佈局.但是我發現用view.option