//設置發送超時
你只發送, 併發送足夠多的數據以填滿發送緩衝區, 接收端一直不接收.
發送端一量滿發送緩衝區就會阻塞, 若是你設置了發送超時, 超時到了它就會返回發送超時了.網絡
在進行程序開發時,有時候須要阻塞,但同時又須要有超時功能,這時候select()函數就能很好的知足咱們的要求:併發
但用這進行測試時有一個地方是須要注意的,即select()的第五個參數timeval *timeout的問題。設置好timeout的始值後,若是隻對select()調用一次,是沒有任何問題的,但一旦屢次調用,你就會發現怎麼好像我設置的timeout值只有第一次有用呢,之後select()老是一刻也不等就返回了呢?socket
經過查看man和本身測試,原來select()函數內部是會不斷更新timeout的值的,以查看超時時間還剩多少。那麼第一次調用以後,timeout的值就被更新至0了,之後無論你再調用它多少次,select()都會當即返回了,這就是爲何會出如今屢次調用時,select()只有第一次時湊效的原因了,哈哈,之後再使用它時,要尤爲注意這一點了。但它的兄弟函數pselect()沒有它的這個問題,它不會在內部在時間值進行更新的。函數
socket在每次執行select的時候都得要從新對time進行賦值 防止select修改了time參數 對下一次的判斷形成干擾 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 ; } }