使用TCP套接字時,當無網絡連接時,還會繼續send,繼續recv阻塞,知道TCP自己協議機制判斷斷開連接時才會停止發送和接收,時間需要幾分鐘之久。
解決的辦法是,自己設置接收超時時間,當超時后重新發送,或者從新初始化socket然后在重新創建socket重新connect。
代碼如下: ?
但是編譯會出錯,perror顯示參數錯誤(Invalid argument? ),看了下內核中的實現,參數確實錯了,其中最后一個參數是sizeof(struct timeval) 類型的,而非其他類型
改正為:
struct timeval tv; ? 然后最后個參數寫為:
iRet2=setsockopt(iClientSock, SOL_SOCKET, SO_SNDTIMEO, &iSendTimeout,? sizeof(tv));
iRet2=setsockopt(iClientSock, SOL_SOCKET, SO_SNDTIMEO, &iSendTimeout,?
參數解析:
? 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)