在 Visual Studio 中调用 mysql_real_connect() 函数连接 MySQL 过程中,当仅有连接 IP 错误时,会存在大概 20 秒的连接超时,最后连接失败;当有连接端口错误时,会存在大概 60 秒连接超时,最后连接失败。
通过在 mysql_real_connect() 前配置以下函数:
mysql_options(handle, MYSQL_OPT_CONNECT_TIMEOUT, timeOut)
但并不能成功在超时时间之后,结束连接请求。
这里提供一种线程解决方案,如下:
1 struct MySqlConnOpts_t
2 {
3 MYSQL* pConnHandle;
4 std::string strIp;
5 std::string strUserName;
6 std::string strPassWord;
7 int nPort;
8 int nErrNum;
9
10 MySqlConnOpts_t()
11 {
12 pConnHandle = NULL;
13 strIp = "";
14 strUserName = "";
15 strPassWord = "";
16 nPort = -1;
17 nErrNum = -1;
18 }
19 }
20
21 MySqlConnOpts_t* pConnectOptions = new MySqlConnOpts_t;
22 // pConnectOptions 中 pConnHandle、strIp、strUserName、strPassWord、nPort 的初始化;
23
24 DWORD WINAPI mysqlConnect(LPVOID lpParam)
25 {
26 DWORD ret = 0;
27 MySqlConnOpts_t* pConnOpts = static_cast(lpParam);
28
29 if(NULL == mysql_real_connect(pConnOpts->pConnHandle, pConnOpts->strIp , pConnOpts->strUserName, pConnOpts->strPassWord, pConnOpts->nPort, NULL, CLIENT_MULTI_STATEMENTS))
30 {
31 ret = -1;
32 }
33
34 pConnOpts->nErrNum = ret;
35
36 return ret;
37 }
38
39 const int nTimeOut = 1000; // 超时设置,单位为 ms;
40 HANDLE hThread = CreateThread(NULL, 0, mysqlConnect, pConnectOptions, 0, NULL);
41 DWORD dwRet = WaitForSingleObject(hThread, nTimeOut);
42 CloseHandle(hThread);
43
44 if(0 != dwRet)
45 {
46 // 处理超时逻辑;
47 }
48
49 if(0 != pConnectOptions->nErrNum)
50 {
51 // 处理错误连接逻辑
52 }
53
54 // 处理 pConnectOptions 指针;
1 struct MySqlConnOpts_t
2 {
3 MYSQL* pConnHandle;
4 std::string strIp;
5 std::string strUserName;
6 std::string strPassWord;
7 int nPort;
8 int nErrNum;
9 MySqlConnOpts_t()
10 {
11 pConnHandle = NULL;
12 strIp = "";
13 strUserName = "";
14 strPassWord = "";
15 nPort = -1;
16 nErrNum = -1;
17 }
18 }
19
20 MySqlConnOpts_t* pConnectOptions = new MySqlConnOpts_t;
21 // pConnectOptions 中 pConnHandle、strIp、strUserName、strPassWord、nPort 的初始化;
22
23 DWORD WINAPI mysqlConnect(LPVOID lpParam)
24 {
25 DWORD ret = 0;
26 MySqlConnOpts_t* pConnOpts = static_cast(lpParam);
27
28 if(NULL == mysql_real_connect(pConnOpts->pConnHandle, pConnOpts->strIp , pConnOpts->strUserName, pConnOpts->strPassWord, pConnOpts->nPort, NULL, CLIENT_MULTI_STATEMENTS))
29 {
30 ret = -1;
31 }
32
33 pConnOpts->nErrNum = ret;
34
35 return ret;
36 }
37
38 const int nTimeOut = 1000; // 超时设置,单位为 ms;
39 HANDLE hThread = CreateThread(NULL, 0, mysqlConnect, pConnectOptions, 0, NULL);
40 DWORD dwRet = WaitForSingleObject(hThread, nTimeOut);
41 CloseHandle(hThread);
42
43 if(0 != dwRet)
44 {
45 // 处理超时逻辑;
46 }
47
48 if(0 != pConnectOptions->nErrNum)
49 {
50 // 处理错误连接逻辑
51 }
52
53 // 处理 pConnectOptions 指针;
View Code
标签:pConnectOptions,IP,pConnOpts,ret,MySqlConnOpts,strUserName,MySQL,NULL,连接
来源: https://www.cnblogs.com/dishengAndziyu/p/12172795.html