64,674
社区成员
发帖
与我相关
我的任务
分享
bool SocketEngine::Connect(const char* ip, int port)
{
m_strServerIp = ip;
std::thread t([this, ip, port] {
m_pITcp->Connect(ip, port, 5, 0);
});
t.detach();
return true;
}
bool XTcp::Connect(const char *ip, _word port,int second, int timeoutms)
{
if(_socket == INVALID_SOCKET) CreateSocket();
sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port);
saddr.sin_addr.s_addr = inet_addr(ip);
_status = enSocketStatus_Wait;
SetBlock(false);
int ret = ::connect(_socket,(sockaddr*)&saddr,sizeof(saddr));
if (ret == 0) {
//连接成功
_status = enSocketStatus_Connect;
} else {
fd_set set;
FD_ZERO(&set);
FD_SET(_socket,&set);
timeval tm;
tm.tv_sec = second;
tm.tv_usec = timeoutms * 1000;
switch (select(_socket+1,0,&set,0,&tm)) {
case -1:
//连接失败
_status = enSocketStatus_Failture;
break;
case 0:
_status = enSocketStatus_Timeout;
break;
default:
if (FD_ISSET(_socket, &set)) {
int error = 0;
socklen_t len = sizeof(error);
#ifdef WIN32
//(win32)If no error occurs, this function returns zero. If an error occurs, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.
if (getsockopt(_socket, SOL_SOCKET, SO_ERROR, (char*)&error, &len) == SOCKET_ERROR)
#else
//(linux)On success, zero is returned. On error, -1 is returned, and errno is set appropriately.
if (getsockopt(_socket, SOL_SOCKET, SO_ERROR, &error, &len) == SOCKET_ERROR)
#endif // WIN32
{
_status = enSocketStatus_Failture;
break;
}
if (error != 0) {
//连接失败
_status = enSocketStatus_Failture;
break;
} else {
//连接成功
_status = enSocketStatus_Connect;
break;
}
}
break;
}
}
if (_pISocketEventSink)
_pISocketEventSink->OnEventTcpLink(_status);
return true;
}