Windows 设置connect超时

 1 //tcpclient.h
 2 #ifndef TCPCLIENT_H
 3 #define TCPCLIENT_H
 4 #include <winsock2.h>
 5 #include <ws2tcpip.h>
 6 #include <iostream>
 7 #include <cstdio>
 8 
 9 
10 extern SOCKET ConnectSocket;
11 int ConnectSer();
12 
13 #endif // TCPCLIENT_H
 1 //tcpclient.c
 2 #include "tcpclient.h"
 3 
 4 using namespace std;
 5 
 6 // Need to link with Ws2_32.lib
 7 //#pragma comment(lib, "ws2_32.lib")
 8 SOCKET ConnectSocket;                       //定义连接Socket,在发送接收时使用
 9 /*******************************************************
10 ** 函数名称 : ConnectSer
11 ** 函数功能 : 连接服务器
12 ** 输   入 : 无
13 ** 输    出: 无
14 ** 备    注: 服务器IP:192.168.5.1      PORT:8010     超时连接:1s
15 ********************************************************/
16 int ConnectSer()
17 {
18     //----------------------
19     // Initialize Winsock
20     bool ret = false;
21     int error = -1;
22     int len = sizeof(int);
23     WSADATA wsaData;
24     int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
25     if (iResult != NO_ERROR) {
26         ret = false;
27         return ret;
28     }
29     //----------------------
30     // Create a SOCKET for connecting to server
31     ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
32     if (ConnectSocket == INVALID_SOCKET) {
33         WSACleanup();
34         ret = false;
35         return ret;
36     }
37     //----------------------
38     // The sockaddr_in structure specifies the address family,
39     // IP address, and port of the server to be connected to.
40     sockaddr_in clientService;
41     clientService.sin_family = AF_INET;
42     clientService.sin_addr.s_addr = inet_addr("192.168.5.1");
43     clientService.sin_port = htons(8010);
44 
45     //连接超时1秒
46     struct timeval timeout ;
47     fd_set r;
48     unsigned long ul = 1;
49     ioctlsocket(ConnectSocket, FIONBIO,&ul);   //设置为非阻塞模式
50     //如果连接失败,则设置超时
51     if(-1 == connect(ConnectSocket, (SOCKADDR *) &clientService, sizeof(clientService) )){
52         FD_ZERO(&r);
53         FD_SET(ConnectSocket, &r);
54         timeout.tv_sec = 1; //连接超时1秒
55         timeout.tv_usec =0;
56         if( select(0, NULL, &r, NULL, &timeout) > 0 ){
57             getsockopt(ConnectSocket, SOL_SOCKET, SO_ERROR, (char *)&error, /*(socklen_t *)*/&len);
58             if(error == 0)
59                 ret = true;
60             else
61                 ret = false;
62         }
63         else
64             ret = false;
65     }
66     //如果连接成功,返回ret置1
67     else
68         ret = true;
69     ul = 0;
70     ioctlsocket(ConnectSocket, FIONBIO, &ul); //设置为阻塞模式 阻塞时间为timeout时间
71     return ret;
72 }
原文地址:https://www.cnblogs.com/be-m/p/4582625.html