1. 程式人生 > >socket通訊阻塞模式下,設定傳送和接受函式超時

socket通訊阻塞模式下,設定傳送和接受函式超時

今天公司專案上遇到了一個問題,就是用到socket與伺服器通訊時,接收資料會突然有一次接收不到資料。但是專案程式碼使用阻塞程式寫的,所以程式就一直卡在接收函式不能動。開始為了解決這個問題可以說是費勁周折。先是用了定時器,但是專案程式碼用的是多程序,要涉及到程序間通訊的問題。

後面從網上搜到了下面這一段文字,幫助了我的大忙,真是太感謝了。在阻塞狀態下,接收和傳送函式同樣可以設定接受傳送超時時間,而只要是程序不被阻塞,就有辦法解決為什麼就收不到資料的問題。

用setsockopt()來控制recv()與send()的超時

在send(),recv()過程中有時由於網路狀況等原因,收發不能預期進行,而設定收發超時控制: 
在Linux下需要注意的是時間的控制結構是struct timeval而並不是某一整型數,
int nNetTimeout=1000;//1秒, 
//設定傳送超時 
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int)); 
//設定接收超時 
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int)); 
這樣做在Linux環境下是不會產生效果的,須如下定義:struct timeval timeout = {3,0}; 
//設定傳送超時 
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval)); 
//設定接收超時 
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval)); 
有兩點注意就是: 
1)recv ()的第四個引數需為MSG_WAITALL,在阻塞模式下不等到指定數目的資料不會返回,除非超時時間到。還要注意的是隻要設定了接收超時,在沒有 MSG_WAITALL時也是有效的。說到底超時就是不讓你的程式老在那兒等,到一定時間進行一次返回而已。 
2)即使等待超時時間值未到,但對方已經關閉了socket, 則此時recv()會立即返回,並收到多少資料返回多少資料。

相關推薦

socket通訊阻塞模式設定傳送接受函式超時

今天公司專案上遇到了一個問題,就是用到socket與伺服器通訊時,接收資料會突然有一次接收不到資料。但是專案程式碼使用阻塞程式寫的,所以程式就一直卡在接收函式不能動。開始為了解決這個問題可以說是費勁周折。先是用了定時器,但是專案程式碼用的是多程序,要涉及到程序間通訊的問題

阻塞模式雖然connect出錯但是getsockopt取得的錯誤卻是0的問題

    除錯專案程式碼時,發現了一個奇怪問題,記錄如下:     非阻塞模式下,connect發起建鏈,返回-1(這在非阻塞模式下是很正常的現象)。然後將該socket的寫事件進行監聽,在寫事件觸發後

STM32F10在iapapp模式除錯模式串列埠可以通訊下載後卻不能通訊的問題

開發環境:iar for arm ,開發晶片是STM32F103, 問題點:在除錯模式下,usart1可以接受和傳送資料,但是下載到晶片內部時,或者使用iap升級之後就出現資料無法接受的問題。 第一就像想到的啟動檔案和中斷向量表沒有配置好: 如圖所示:ICF配置 對比之

VM虛擬機網絡在Bridge模式本機不能連接SSH問題的解決

機器 checksum 模式 load iptable off pos disable ssh設置 今天遇到了一個很奇怪的問題。 VM虛擬機網絡連接原先在NAT模式下,本機通過SSH訪問沒有任何問題,但切換到Bridge模式後,SSH死活都連接不上。以為是自己SSH設

SQL Server SQL性能優化之--數據庫在“簡單”參數化模式自動參數化SQL帶來的問題

參考 itl stat 數據行 img tro while 第一次 line 數據庫參數化的模式 數據庫的參數化有兩種方式,簡單(simple)和強制(forced),默認的參數化默認是“簡單”,簡單模式下,如果每次發過來的SQL,除非完全一樣

flask的debug模式網頁輸入pin碼進行調試

lsp png 資源文件 post 上下文 .com highlight lai target 網站後端Python+Flask .FLASK調試模式之開啟DEBUG與PIN使用? 自動加載: # 方式一 1 2 if __nam

新零售模式企業該怎麽運作起來?

人臉識別 play src 財富 協同 lock 大數據 隨著 傳統企業   遠豐電商最近了解到:自馬雲爸爸的新零售一出,全世界都開始了自己的新零售之路,新零售是未來發展的必要趨勢,今天小編給大家簡單的解析一下新零售的重要因素有哪些哦!  線上線下融合建立以大數據為核心的系

前後端分離模式如何跟蹤使用者狀態?

在前後端分離開發模式下,前端採用Vue等MVVM框架,後端負責提供RESTful風格的介面。區別於傳統開發模式下使用session來跟蹤使用者登入狀態,前後端分離模式可採用讀取cookie的方式來驗證使用者登入,每次使用者訪問任意URL,都會對cookie進行驗證。 這種方式的好處是保

使用Chrome-headless模式截圖不全屏的問題

在headless模式下,是沒有開啟瀏覽器視窗的,那麼driver.maximize_window(),找不到目標也打不開。 我們可以換一種方式,去在無頭模式下,指定瀏覽器的視窗大小執行即可。 __options = Options() __options.add_argum

【Linux】橋接模式主機可以ping通Ubuntu虛擬機器但Ubuntu虛擬機器ping不通主機解決方案

使用的Windows10的主機,Ubuntu16.04的虛擬機器 使用橋接模式,可以從主機ping通虛擬機器,但是反過來的時候不可以ping通,所以猜測是防火牆的問題,但是關閉防火牆這個辦法,有點因噎廢食。 在網上查資料發現是Windows10的防火牆沒有開啟ICMPv4-In這個規則。所以

Qt:Qt實現Winsock網路程式設計—非阻塞模式的簡單遠端控制的開發(WSAAsyncSelect)

Qt實現Winsock網路程式設計—非阻塞模式下的簡單遠端控制的開發(WSAAsyncSelect) 前言 這邊部落格應該是 Qt實現Winsock網路程式設計—TCP服務端和客戶端通訊(多執行緒) 的姐妹篇,上篇部落格中的socket通訊中所用的Windows api函式 都是

Safari無痕模式storage被禁用問題

前言 Safari開啟無痕模式後,localStorage和sessionStorage為空,對其進行set操作也會報錯,也就是說這種情況下,storage是被禁止使用了。接下來說一下解決方法。 解決方案 我們專案框架上的解決方法是對storage進行一層封裝,遇到這種開啟無痕模式的情況,會定義一個wi

python網路程式設計中非阻塞模式的多客戶端請求處理

在預設認的情況下,TCP套節字處於阻塞模式中。換句話說,如果沒有完成操作,就不把控制權交給程式。例如呼叫connect( )API之後,連線操作會阻止程式繼續往下執行,直到連線成功為止。很多情況下,你並不想讓程式等待伺服器響應或者有異常終止操作。這裡舉個例子,如

JMeter命令模式動態設定執行緒組持續時間等動態傳參

背景: 1.當通過JMeter的影象化介面執行效能壓測或者場景時候,JMeter介面很容易導致介面卡死或者無響應的情況(20個執行緒數就會卡死) 現象如下: 解決方案: jmeter -n -t D:\apache-jmeter-3.0\bin\log.j

STM32 休眠模式難道 看門狗低功耗模式沒法同時使用?

0 在STM32開發中經常會用到獨立看門狗(IWDG)和低功耗模式,看門狗是為了檢測和解決由軟體錯誤引起的故障,低功耗模式是為了在CPU不需要繼續執行時進入到休眠模式用以節省電能。其中獨立看門狗的時鐘由獨立的RC振盪器(STM32F10x一般為40kHz)提供,即使在主時鐘出現故障時,

vmware橋接模式配置centos的ip地址閘道器等搭建區域網伺服器

1.安裝vmware軟體,以及centos 2.設定網路介面卡模式為:“橋接模式” 3.進入虛擬網路編輯器,配置橋接模式的相關配置, 、 4.進入虛擬機器所在的電腦主機的dos命令列頁面,輸入ipconfig/all命令 獲取主機的網路詳情資訊,虛擬機器配置需要依據主

新零售多平臺庫存共享模式中央庫存系統的設計思路

「 以下故事情節及人物均為作者杜撰,若有雷同,純屬巧合: 小Q:某醫藥網際網路公司後臺產品經理,著手規劃重構公司的供應鏈及電商後臺相關係統」   一、中央庫存概述 今天開始,小Q開始梳理中央庫存系統需求,開始設計之前,必須先了解一下公司現狀: (1)多個銷售平臺和渠道同時銷售,

Socket阻塞模式阻塞模式

來源:http://blog.csdn.net/VCSockets/阻塞模式   Windows套接字在阻塞和非阻塞兩種模式下執行I/O操作。在阻塞模式下,在I/O操作完成前,執行的操作函式一直等候而不會立即返回,該函式所在的執行緒會阻塞在這裡。相反,在非阻塞模式下,套接字函式會立即返回,而不管I/O是否完

關於:“無法序列化會話狀態。在“StateServer”或“SQLServer”模式下,ASP.NET 將序列化會話狀態物件因此不允許使用無法序列化的物件或 MarshalByRef 物件。如果自定義會話狀態儲存在“Custom”模式下執行了類似的序列化

錯誤描述: 無法序列化會話狀態。在“StateServer”或“SQLServer”模式下,ASP.NET 將序列化會話狀態物件,因此不允許使用無法序列化的物件或 MarshalByRef 物件。如果

Elasticsearch-6.5.3 在Centos7,Linux 虛擬機器環境設定繫結的IP地址

問題背景: Elasticsearch在Linux環境下安裝很簡單,只需要在官網下載相應的tar.gz壓縮包,並使用 Linux下的解壓命令,即可。解壓完成後,可以進入該目錄下,使用./bin/elasticsearch 命令來檢測是否成功啟動elasticsearch服務。這個很簡單,具體