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