未验证 提交 11157d5a 编写于 作者: D dapan1121 提交者: GitHub

Merge pull request #18066 from taosdata/fix/TS-2020

fix: set connect socket to unblocking call with timeout 
......@@ -71,6 +71,10 @@ int32_t taosSetSockOpt(SOCKET socketfd, int32_t level, int32_t optname, void *op
return setsockopt(socketfd, level, optname, optval, (socklen_t)optlen);
}
#endif
#if !defined(_TD_DARWIN_32)
int32_t taosGetSockOpt(SOCKET socketfd, int32_t level, int32_t optname, void *optval, int32_t* optlen) {
return getsockopt(socketfd, level, optname, optval, (socklen_t *)optlen);
}
......
......@@ -352,7 +352,7 @@ SOCKET taosOpenTcpClientSocket(uint32_t destIp, uint16_t destPort, uint32_t clie
serverAddr.sin_addr.s_addr = destIp;
serverAddr.sin_port = (uint16_t)htons((uint16_t)destPort);
#ifdef _TD_LINUX
#if defined(_TD_LINUX)
taosSetNonblocking(sockFd, 1);
ret = connect(sockFd, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
if (ret == -1) {
......@@ -386,7 +386,34 @@ SOCKET taosOpenTcpClientSocket(uint32_t destIp, uint16_t destPort, uint32_t clie
}
}
taosSetNonblocking(sockFd, 0);
#elif defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
taosSetNonblocking(sockFd, 1);
ret = connect(sockFd, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
if (ret == -1) {
struct timeval timeout;
fd_set set;
timeout.tv_sec = 0;
timeout.tv_usec = tsTcpConnTimeout * 1000;
FD_ZERO(&set);
FD_SET(sockFd, &set);
if (select(sockFd + 1, NULL, &set, NULL, &timeout) <= 0) {
uError("failed to connect socket, ip:0x%x, port:%hu(select error/conn timeout)", destIp, destPort);
taosCloseSocket(sockFd); //
return -1;
}
int optVal = -1, optLen = sizeof(int);
if ((0 != taosGetSockOpt(sockFd, SOL_SOCKET, SO_ERROR, &optVal, &optLen)) || (optVal != 0)) {
uError("failed to connect socket, ip:0x%x, port:%hu(connect host error)", destIp, destPort);
taosCloseSocket(sockFd); //
return -1;
}
ret = 0;
}
taosSetNonblocking(sockFd, 0);
#else
ret = connect(sockFd, (struct sockaddr *)&serverAddr, sizeof(serverAddr));
#endif
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册