日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

select 设置发送超时发送注意事项

發(fā)布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 select 设置发送超时发送注意事项 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

//設置發(fā)送超時
你只發(fā)送, 并發(fā)送足夠多的數(shù)據(jù)以填滿發(fā)送緩沖區(qū), 接收端一直不接收.
發(fā)送端一量滿發(fā)送緩沖區(qū)就會阻塞, 如果你設置了發(fā)送超時, 超時到了它就會返回發(fā)送超時了.

在send(),recv()過程中有時由于網(wǎng)絡狀況等原因,收發(fā)不能預期進行,而設置收發(fā)超時控制: 在Linux下需要注意的是時間的控制結構是struct timeval而并不是某一整型數(shù),以下是來自于網(wǎng)上一篇文章中的摘錄,它是這樣寫的:
int nNetTimeout=1000;//1秒,
//設置發(fā)送超時
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//設置接收超時
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int)); 這樣做在Linux環(huán)境下是不會產(chǎn)生效果的,須如下定義:struct timeval timeout = {3,0};?
//設置發(fā)送超時
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval)); //設置接收超時
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval)); 有兩點注意就是: 1)recv ()的第四個參數(shù)需為MSG_WAITALL,在阻塞模式下不等到指定數(shù)目的數(shù)據(jù)不會返回,除非超時時間到。還要注意的是只要設置了接收超時,在沒有MSG_WAITALL時也是有效的。說到底超時就是不讓你的程序老在那兒等,到一定時間進行一次返回而已。 2)即使等待超時時間值未到,但對方已經(jīng)關閉了socket, 則此時recv()會立即返回,并收到多少數(shù)據(jù)返回多少數(shù)據(jù)。

在進行程序開發(fā)時,有時候需要阻塞,但同時又需要有超時功能,這時候select()函數(shù)就能很好的滿足我們的要求:

但用這進行測試時有一個地方是需要注意的,即select()的第五個參數(shù)timeval *timeout的問題。設置好timeout的始值后,如果只對select()調(diào)用一次,是沒有任何問題的,但一旦多次調(diào)用,你就會發(fā)現(xiàn)怎么好像我設置的timeout值只有第一次有用呢,以后select()總是一刻也不等就返回了呢?

通過查看man和自己測試,原來select()函數(shù)內(nèi)部是會不斷更新timeout的值的,以查看超時時間還剩多少。那么第一次調(diào)用之后,timeout的值就被更新至0了,以后不管你再調(diào)用它多少次,select()都會立即返回了,這就是為什么會出現(xiàn)在多次調(diào)用時,select()只有第一次時湊效的緣由了,哈哈,以后再使用它時,要尤其注意這一點了。但它的兄弟函數(shù)pselect()沒有它的這個問題,它不會在內(nèi)部在時間值進行更新的。

socket在每次執(zhí)行select的時候都得要重新對time進行賦值 防止select修改了time參數(shù) 對下一次的判斷造成干擾 for (i = 0 ; i < waittimeout ; i++){FD_SET(fd , &fdr);sTime.tv_sec = 1;sTime.tv_usec = 0; iRet = select(iMax , &fdr , NULL , NULL , &sTime);if (iRet == -1){LOG_TRACE(&gLogger, "select -1");return -1;}else if (iRet > 0){LOG_TRACE(&gLogger, "wait %ds sock readalbe, select=%d", i, iRet);return 0 ;}}

?

轉載于:https://www.cnblogs.com/zhangmo/p/7487542.html

總結

以上是生活随笔為你收集整理的select 设置发送超时发送注意事项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。