生活随笔
收集整理的這篇文章主要介紹了
windows下设置socket的connect超时
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
變相的實現connect的超時,我要講的就是這個方法,原理上是這樣的:
1.建立socket
2.將該socket設置為非阻塞模式
3.調用connect()
4.使用select()檢查該socket描述符是否可寫(注意,是可寫)
5.根據select()返回的結果判斷connect()結果
6.將socket設置為阻塞模式(如果你的程序不需要用阻塞模式的,這步就省了,不過一般情況下都是用阻塞模式的,這樣也容易管理)
//?widonws:?默認設置socket?TCP?client?connect為阻塞模式
void?TcpConnect(char*?strIP,?UINT?nPort)
{struct?sockaddr_in?serverAddress;SOCKET?hSocket?=?NULL;hSocket?=?socket(AF_INET,?SOCK_STREAM,?IPPROTO_TCP);if(?hSocket==INVALID_SOCKET){return;}memset(&serverAddress,?0,?sizeof(serverAddress));?????serverAddress.sin_family??????=?AF_INET;serverAddress.sin_addr.s_addr?=?inet_addr(strIP);???serverAddress.sin_port????????=?htons((short)nPort);??????int?iTimeOut?=?3000;setsockopt(hSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&iTimeOut,sizeof(iTimeOut));setsockopt(hSocket,SOL_SOCKET,SO_SNDTIMEO,(char*)&iTimeOut,sizeof(iTimeOut));????if(?SOCKET_ERROR==connect(hSocket,?(sockaddr*)&serverAddress,?sizeof(serverAddress))?){????????closesocket(hSocket);DWORD?gle?=?WSAGetLastError();return;}char?buff[]?=?"hello";int?sl=::send(hSocket,(char*)buff,?sizeof(buff),?0);if(?sl<0?){closesocket(hSocket);return?;}closesocket(hSocket);
}//?widonws:?設置socket?TCP?client?connect非阻塞模式
void?SockSelect(char*?strIP,?UINT?nPort)
{SOCKET/*int*/?sockfd?=?socket(AF_INET,?SOCK_STREAM,?IPPROTO_TCP);if(sockfd?<?0)?{return;}struct?sockaddr_in?serv_addr;//以服務器地址填充結構serv_addrserv_addr.sin_family?=?AF_INET;serv_addr.sin_addr.s_addr?=?inet_addr(strIP);serv_addr.sin_port?=?htons(nPort);int?error?=?-1;int?len?=?sizeof(int);timeval?tm;fd_set?set;unsigned?long?ul?=?1;ioctlsocket(sockfd,?FIONBIO,?&ul);?//設置為非阻塞模式bool?ret?=?false;if(?connect(sockfd,?(struct?sockaddr?*)&serv_addr,?sizeof(serv_addr))?==?-1){tm.tv_sec??=?3;tm.tv_usec?=?0;FD_ZERO(&set);FD_SET(sockfd,?&set);if(?select(sockfd+1,?NULL,?&set,?NULL,?&tm)?>?0){getsockopt(sockfd,?SOL_SOCKET,?SO_ERROR,?(char?*)&error,?/*(socklen_t?*)*/&len);if(error?==?0)?ret?=?true;else?ret?=?false;}?else?ret?=?false;}else?ret?=?true;ul?=?0;ioctlsocket(sockfd,?FIONBIO,?&ul);?//設置為阻塞模式if(!ret)?{closesocket(?sockfd?);fprintf(stderr?,?"Cannot?Connect?the?server!/n");return;}fprintf(?stderr?,?"Connected!/n");char?buff[]?=?"hello";int?sl=::send(sockfd,(char*)buff,?sizeof(buff),?0);closesocket(?sockfd?);
}
轉載于:https://blog.51cto.com/webrobot/1669545
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的windows下设置socket的connect超时的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。