使用setsockopt()接口,设置TCP的接收与发送超时,Invalid argument错误问题
生活随笔
收集整理的這篇文章主要介紹了
使用setsockopt()接口,设置TCP的接收与发送超时,Invalid argument错误问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用TCP套接字時,當無網絡連接時,還會繼續send,繼續recv阻塞,知道TCP自己協議機制判斷斷開連接時才會停止發送和接收,時間需要幾分鐘之久。
解決的辦法是,自己設置接收超時時間,當超時后重新發送,或者從新初始化socket然后在重新創建socket重新connect。
代碼如下: ?
?????int iSendTimeout, iRecvTimeOut;
???????iClientSock = socket(AF_INET, SOCK_STREAM, 0);
???????if(iClientSock < 0)
???????{
???????????????printf("[%s:%d]client init error\r\n", __FILE__, __LINE__);
???????????????return ERROR;
???????}
???????iRecvTimeOut = 3000; ??????? ???????iRet1 =?setsockopt(iClientSock, SOL_SOCKET, SO_RCVTIMEO, &iRecvTimeOut, sizeof(int)); ???????printf("%s\r\n", strerror(errno)); ???????iSendTimeout = 3000; ??????? ???????iRet2 =?setsockopt(iClientSock, SOL_SOCKET, SO_SNDTIMEO, (char *)&iSendTimeout, sizeof(int)); ???????printf("%s\r\n", strerror(errno));
但是編譯會出錯,perror顯示參數錯誤(Invalid argument?),看了下內核中的實現,參數確實錯了,其中最后一個參數是sizeof(struct timeval) 類型的,而非其他類型 改正為: struct timeval tv; ???//聲明一個?struct timeval?類型的變量 然后最后個參數寫為:
iRet2=setsockopt(iClientSock, SOL_SOCKET, SO_SNDTIMEO, &iSendTimeout,?sizeof(tv));
參數解析: ?int setsockopt(int s, int level, int optname,const void *optval, socklen_t optlen); 1)int s :sockfd,即socket文件描述符 2)int level :?SOL_SOCKET(通用套接字) ,IPPROTO_TCP,等 3)?int optname??:SO_SNDTIMEO(發送超時時間)|SO_RSVTIMEO(接收超時時間)等,設置選項, 4)?const void *optval :自定義的超時時間的地址 5)?struct timeval的大小,即sizeof(struct timecal)
???????iRecvTimeOut = 3000; ??????? ???????iRet1 =?setsockopt(iClientSock, SOL_SOCKET, SO_RCVTIMEO, &iRecvTimeOut, sizeof(int)); ???????printf("%s\r\n", strerror(errno)); ???????iSendTimeout = 3000; ??????? ???????iRet2 =?setsockopt(iClientSock, SOL_SOCKET, SO_SNDTIMEO, (char *)&iSendTimeout, sizeof(int)); ???????printf("%s\r\n", strerror(errno));
但是編譯會出錯,perror顯示參數錯誤(Invalid argument?),看了下內核中的實現,參數確實錯了,其中最后一個參數是sizeof(struct timeval) 類型的,而非其他類型 改正為: struct timeval tv; ???//聲明一個?struct timeval?類型的變量 然后最后個參數寫為:
iRet2=setsockopt(iClientSock, SOL_SOCKET, SO_SNDTIMEO, &iSendTimeout,?sizeof(tv));
參數解析: ?int setsockopt(int s, int level, int optname,const void *optval, socklen_t optlen); 1)int s :sockfd,即socket文件描述符 2)int level :?SOL_SOCKET(通用套接字) ,IPPROTO_TCP,等 3)?int optname??:SO_SNDTIMEO(發送超時時間)|SO_RSVTIMEO(接收超時時間)等,設置選項, 4)?const void *optval :自定義的超時時間的地址 5)?struct timeval的大小,即sizeof(struct timecal)
總結
以上是生活随笔為你收集整理的使用setsockopt()接口,设置TCP的接收与发送超时,Invalid argument错误问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: svn分支和主干的同步操作
- 下一篇: Python开发之--前端 HTML基