用setsockopt()来控制recv()与send()的超时
用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()會立即返回,并收到多少數據返回多少數據。
分享到:
轉載于:https://www.cnblogs.com/westfly/archive/2011/09/08/2171212.html
總結
以上是生活随笔為你收集整理的用setsockopt()来控制recv()与send()的超时的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 移动开发的分辨率问题
- 下一篇: win7下.NET 2.0未在web服务