_AFXSOCK_INLINE BOOL CAsyncSocket::Connect(const SOCKADDR* lpSockAddr, int nSockAddrLen)
{ return ConnectHelper(lpSockAddr, nSockAddrLen); }BOOL CAsyncSocket::ConnectHelper(const SOCKADDR* lpSockAddr, int nSockAddrLen)
{
return connect(m_hSocket, lpSockAddr, nSockAddrLen) != SOCKET_ERROR;
}BOOL CAsyncSocket::Connect(LPCTSTR lpszHostAddress, UINT nHostPort)
{
USES_CONVERSION_EX;
ASSERT(lpszHostAddress != NULL);
if (lpszHostAddress == NULL)
{
WSASetLastError (WSAEINVAL);
return FALSE;
}
SOCKADDR_IN sockAddr;
memset(&sockAddr,0,sizeof(sockAddr));
LPSTR lpszAscii = T2A_EX((LPTSTR)lpszHostAddress, _ATL_SAFE_ALLOCA_DEF_THRESHOLD);
if (lpszAscii == NULL)
{
WSASetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.s_addr = inet_addr(lpszAscii);
if (sockAddr.sin_addr.s_addr == INADDR_NONE)
{
LPHOSTENT lphost;
lphost = gethostbyname(lpszAscii);
if (lphost != NULL)
sockAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
else
{
WSASetLastError(WSAEINVAL);
return FALSE;
}
}
sockAddr.sin_port = htons((u_short)nHostPort);
return Connect((SOCKADDR*)&sockAddr, sizeof(sockAddr));
}BOOL CSocket::ConnectHelper(const SOCKADDR* lpSockAddr, int nSockAddrLen)
{
if (m_pbBlocking != NULL)
{
WSASetLastError(WSAEINPROGRESS);
return FALSE;
}
m_nConnectError = -1;
if (!CAsyncSocket::ConnectHelper(lpSockAddr, nSockAddrLen))
{
if (GetLastError() == WSAEWOULDBLOCK)
{
while (PumpMessages(FD_CONNECT))
{
if (m_nConnectError != -1)
{
WSASetLastError(m_nConnectError);
return (m_nConnectError == 0);
}
}
}
return FALSE;
}
return TRUE;
}只要在派生类重载ConnectHelper 和 OnConnect
声明
virtual BOOL ConnectHelper(const SOCKADDR* lpSockAddr,int nSockAddrLen);
virtual void OnConnect(int nErrorCode);
实现
BOOL 派生类::ConnectHelper(const SOCKADDR* lpSockAddr,int nSockAddrLen)
{
return connect(m_hSocket, lpSockAddr, nSockAddrLen) != SOCKET_ERROR;
}
void 派生类::OnConnect(int nErrorCode)
{
}原文:http://blog.csdn.net/flyfish1986/article/details/43339863