linux網絡編程中的超時設置


1 下面是在網上找到的資料,先非常的感謝。

用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()會立即返回,並收到多少數據返回多少數據。

 

2 項目問題描述

客戶端需要每分鍾去服務器拉去日志,文件大小不定,為了服務端數據庫的備份,當服務端數據庫崩潰以后需要修換路徑,所以服務端需要重啟,那么問題來了,如果正是客戶端發送線程的時候服務端斷了,怎么辦?

現象----->客戶端不在繼續發送線程,只是下載線程。猜想可能是因為沒有收到服務端的確認信息,經過調試發現不是。后來定位到recv這個函數上面。嘗試設置超時3秒,出現了新的問題,就是這個文件的發送成無限發送,最終知道勒問題的原因就是:設置的時間太短,以至於文件太大沒有發送完,備份數據庫就沒有清除這個文件編號,導致循環發送。設置為一分鍾就好了。

加油騷年。。。。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM