客戶端網路socket判定超時(TCP)

2021-08-20 02:33:54 字數 853 閱讀 2069

網路socket是整個傳輸層的基礎,幾乎所有的應用層協議都要經過該層來傳輸。下面以基於tcp的客戶端在阻塞與非阻塞兩個模式下的超時判斷。

一、阻塞socket

採用setsockopt。

so_sndtimeo:限制send超時。

so_rcvtimeo:限制recv超時

對於connect的超時控制,還需要首先將socket轉為非阻塞模型,處理完畢後(見下面二),再轉換為阻塞socket,進行傳送與接收的超時控制。

二、非阻塞socket

1、採用自定義計算時間的方案:

在while迴圈以前計算起始時間;在迴圈中,connect、send、recv每進行一次,計算經過了多長時間。最終,可以確定超時。

在實際中,非阻塞的socket採用自定義時間的方案時候,應該再while迴圈中,除了有需要的傳輸函式(connect、send、recv),還要sleep一下。sleep時間長了,會導致接收不及時;sleep時間長了,會導致cpu資源浪費!所以,應該變被動輪詢為主動通知,這就要用select模型!

2、採用select模型:

首先,通過fd系列函式(fd_zero、fd_set、fd_isset 、fd_clr)來建立socket集合。

其次,在while中,執行select函式,該函式需要設定讀取、寫入、異常的時間。在該事件內,如果沒有接收、傳送、異常等事件發生,則進入下一輪處理;否則,判定事件是在哪個socket發生的,並做出相應處理。

三、總結

客戶端socket模型超時方案中,最好的就是阻塞用setsockopt,非阻塞用select!實際客戶端中,非阻塞socket比阻塞socket應用更廣泛。進一步拓展,客戶端socket最優方案就是非阻塞+執行緒+select!

webservice客戶端超時

使用axis2生成webserice客戶端時,在引用的jar包axis2 kernel下的org.apache.axis2.client.options類中預設設定通訊超時時間為30s,jar包原始碼如下,可以看到預設時間為final常量 package org.apache.axis2.clien...

SOCKET客戶端程式設計

1.建立socket物件 socket建構函式有4個引數,第乙個是family,代表位址家族af net,af net6等,第二個是type,套接字型別sock stream 流套接字 和sock dgram 資料報套接字 import socket s socket.socket socket.a...

xfire 客戶端 超時異常

今天碰到個問題,xfire客戶端呼叫遠端的webservice伺服器,在異常日誌stdout中打了些read timeout 後,從jconsole觀察到resin的執行緒數量直線上公升,直到把所有執行緒都佔滿,後來看到是xfire的xfireclientfactorybean的 getclient...