1. 程式人生 > >socket I/O上設定超時的三種方法及其比較

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

        在socket I/O上設定超時, 一般有三種方法, 下面我們來聊聊。

       1.  select/poll

        這是最好的方法, 也是最為推薦的, 對於send/sendto和recv/recvfrom, 都可以用select和poll來設定超時時間, 這種情況下, 一般要把socket先設定為臨時的非阻塞socket.  在某次面試中, 面試官還讓我現場寫select函式的相關程式碼, 最終順利完成。 我首先推薦select/poll.

        當然, 以我寫程式碼的實際經驗來看, poll比select更簡潔, select中那些fdset的設定和清除, 怪煩人的。

        2. alarm

        用alarm函式終端I/O操作, 雖然可行, 但我認為是比較雞肋的。 在多執行緒中, 會有不少隱患。 雖然在Stevens的書中也介紹了這種用法, 但作為吃瓜群眾, 我們只需要瞭解alarm實現超時的原理即可, 大可不必在實際中用這種雞肋的東西。 至少, 我在實際程式碼中, 是沒有看到過的。

        不過, alarm函式至少有一個用途, 那就是如果你去參加筆試或者面試, 你至少比別人多瞭解了一種方式, 這種雞肋的東西, 雖然並無實際用途, 但可以增加人逼格。

        雞肋雞肋, 食之無味, 棄之可惜。

        3.  SO_SNDTIMEO和SO_RCVTIMEO

          這連個東西, 是針對某一socket整體生效的, 我在實際程式碼中沒有見過這個東西用法, 也用的少。 同上面的alarm, 多瞭解一點, 也許所謂的逼格就更高一點。

        還有個問題, 如上只是說了基本的I/O,  也就是讀和寫, 那麼對於connect操作, 會怎樣呢?

        1.  當然可以用select/poll為connect設定超時, 這裡就要求臨時轉為非阻塞socket了。 我在某公司技術終面的時候, 被問到這個題, 順利答出。 不過那時主要實在Windows上玩。

        2.  alarm用於connect的連線? 雖然可以, 但不推薦, 實際也很少見。

        3.  SO_SNDTIMEO和SO_RCVTIMEO ?  oh my god,  這兩個東西是為寫和讀設計的, 跟connect有毛關係呢?

         好了, 不多說。 超時設定, 首推select/poll

相關推薦

socket I/O設定超時方法及其比較

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

檔案的壓縮,日誌管理,ip地址設定方法

tar                                  ##歸檔檔案(把多個檔案變成一個檔案)   &

檔案傳的方法 1servlet方式

今天突然想起來檔案上傳,竟然不會了,趕緊拿出來學習總結下。 **1.原始的servlet檔案上傳下載 2.Struts2框架的檔案上傳 3.Spring-Mvc框架的檔案上傳** 1.原始的servlet檔案上傳下載 簡單說下流程 1. 開發f

linux環境變數設定方法

login shell 和 no-login shell“login shell” 代表使用者登入, 比如使用 “su -“ 命令, 或者用 ssh 連線到某一個伺服器上, 都會使用該使用者預設 shell 啟動 login shell 模式.該模式下的 shell 會去自動

【PHP興趣部落-08】PHP中時區設定方法(timezone)

一 、三種方法 php中時區預設是格林尼治時間,和中國時差八個小時。現在根據需要將時間設定為中國時間,下面整理了三種方法。 方法1: 最好的方法在php.ini里加上找到 date.timezone 項,設定date.timezone = “Asia

PHP中時區設定方法(timezone)

方法1:(最好的方法)在php.ini里加上找到date.timezone項,設定date.timezone = "Asia/Shanghai",重啟環境就ok了。方法2:在需要用到這些時間函式的時候,在頁面新增date_default_timezone_set("PRC")

ArcMap地圖檢視放大縮小反向設定方法及詳細步驟

   每個GIS軟體都有自己的檢視放大縮小方式,例如南方CASS軟體滾輪向前滾動是檢視放大,滾輪向後滾動是檢視縮小。ArcMap檢視放大縮小方式正好相反。習慣使用南方CASS的朋友開始使用ArcMap

python字符串連接的方法及其效率、適用場景詳解

通過 lists bash clear 必須 內存 連接 utf-8 site python字符串連接的方法,一般有以下三種:方法1:直接通過加號(+)操作符連接website=& 39;python& 39;+& 39;tab&

spring注入靜態變數的方法及其注意事項

Spring靜態注入的三種方式:(說明:MongoFileOperationUtil是自己封裝的一個Mongodb檔案讀寫工具類,裡面需要依賴AdvancedDatastore物件例項,dsForRW用來獲取Mongodb資料來源)在springframework裡,我們不能

Python中列表元素刪除的方法比較

1.remove 從左往右刪除第一個符合條件的元素,返回值是None,()中填要刪除的值 list1=[1,2,3,4,5,6,7,1,2,3,4,4] print(list1.remove(2))

《Java多執行緒面試題》系列-建立執行緒的方法及其區別

1. 建立執行緒的三種方法及其區別 1.1 繼承Thread類 首先,定義Thread類的子類並重寫run()方法: package com.zwwhnly.springbootaction.javabase.thread; public class MyFirstThread extends Thread

Java中設定session超時(失效)的方法

<!-- ==================== Default Session Configuration ================= -->     <!-- You can set the default session timeout (in minutes) for

前端傳圖片的方法

container ID ali multipart spl body KS 上傳 實現ajax 前端上傳圖片的三種方法 Django框架下,在前端上傳文件,保存在數據庫,並在前端不刷新頁面顯示上傳圖片。 利用XMLHttpRequest 對象和FormData對象上傳

PHP設定指令碼最大執行時間的方法

PHP設定指令碼最大執行時間的三種方法 php.ini 中預設的最長執行時間是 30 秒,這是由 php.ini 中的 max_execution_time 變數指定,如果指令碼需要跑很長時間 這種情況就要更改php指令碼

計算機視覺中upsampling(取樣)的方式

版權宣告:新建了專注於語義分割的QQ群704803384,歡迎交流!!!    https://blog.csdn.net/u014451076/article/details/79156967 bilinear 雙線性插值是目前在語義分割中用的比較多的一種方式,比如F

在CentOS安裝Python3的方法

Centos7預設自帶了Python2.7版本,但是因為專案需要使用Python3.x你可以按照此文的三個方法進行安裝. 注:本文示例安裝版本為Python3.5, 一、Python原始碼編譯安裝 安裝必要工具 yum-utils ,它的功能是管理repository及擴充套件包的工具 (主要是針對re

安卓手機投屏到電腦方法

  現在幾乎是人手一個智慧手機,首先屬安卓手機的佔大多數其次才是蘋果手機。雖然很多人吐槽安卓系統不如IOS但是由於蘋果手機價格實在太昂貴,人們只能接受安卓手機。比如有了這些智慧手機後在手機看視訊,已經是我們現在最主流的娛樂方式。不過,長時間看小螢幕對眼睛可受不了,而且一些4K、1080P的大片還是在

JavaScript返回到一頁的方法

window.history.go(-1); //返回上一頁 window.history.back(); //返回上一頁 window.location.go(-1); //重新整理上一頁 window.history.back();loc

socket I/O機制學習

socket 多路I/O 機制學習 socket是不同程序間通訊的一種方法,在作業系統看來是一種I/O的介面。之前在計算機網路的課程中學習過socket的基本使用,但是對於其中的細節並不是完全瞭解,特別是除了同步阻塞模式,對其他I/O模式並不瞭解。這裡簡單總結一

SpringMVC傳檔案的方法

直接上程式碼吧,大夥一看便知 這時:commonsmultipartresolver 的原始碼,可以研究一下 http://www.verysource.com/code/2337329_1/commonsmultipartresolver.java.html 前臺: