1、从CSocket派生一个类CTimeOutSocket
2、 修改XX.h文件,该写虚函数“ConnectHelper”
class
CTimeOutSocket :
public
CSocket
... {
// Attributes
public:
BOOL m_Kill;
// Operations
public:
CTimeOutSocket();
virtual ~CTimeOutSocket();
// Overrides
public:
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTimeOutSocket)
protected:
virtual BOOL ConnectHelper(const SOCKADDR* lpSockAddr, int nSockAddrLen);
//}}AFX_VIRTUAL
// Generated message map functions
//{{AFX_MSG(CTimeOutSocket)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
// Implementation
protected:
} ;
... {
// Attributes
public:
BOOL m_Kill;
// Operations
public:
CTimeOutSocket();
virtual ~CTimeOutSocket();
// Overrides
public:
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTimeOutSocket)
protected:
virtual BOOL ConnectHelper(const SOCKADDR* lpSockAddr, int nSockAddrLen);
//}}AFX_VIRTUAL
// Generated message map functions
//{{AFX_MSG(CTimeOutSocket)
// NOTE - the ClassWizard will add and remove member functions here.
//}}AFX_MSG
// Implementation
protected:
} ;
3、该写XX.cpp中的“ConnectHelper”函数的实现:
BOOL CTimeOutSocket::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)
...{
// Insert....
CTime curt, st;
CTimeSpan span(0, 0, 0, m_nTimeOut);
st = CTime().GetCurrentTime();
//DWORD curt = GetTickCount();
//.......
while (PumpMessages(FD_CONNECT))
...{
if (m_nConnectError != -1)
...{
WSASetLastError(m_nConnectError);
return (m_nConnectError == 0);
}
// Insert....
curt = CTime().GetCurrentTime();
if(curt > (st+span))
return FALSE;
//if( abs(GetTickCount()-curt)>m_nTimeOut )
//return FALSE;
//..............
}
}
return FALSE;
}
m_Kill = FALSE;
return TRUE;
}
... {
if (m_pbBlocking != NULL)
...{
WSASetLastError(WSAEINPROGRESS);
return FALSE;
}
m_nConnectError = -1;
if (!CAsyncSocket::ConnectHelper(lpSockAddr, nSockAddrLen))
...{
if (GetLastError() == WSAEWOULDBLOCK)
...{
// Insert....
CTime curt, st;
CTimeSpan span(0, 0, 0, m_nTimeOut);
st = CTime().GetCurrentTime();
//DWORD curt = GetTickCount();
//.......
while (PumpMessages(FD_CONNECT))
...{
if (m_nConnectError != -1)
...{
WSASetLastError(m_nConnectError);
return (m_nConnectError == 0);
}
// Insert....
curt = CTime().GetCurrentTime();
if(curt > (st+span))
return FALSE;
//if( abs(GetTickCount()-curt)>m_nTimeOut )
//return FALSE;
//..............
}
}
return FALSE;
}
m_Kill = FALSE;
return TRUE;
}
4、可通过在构造函数中修改“m_nTimeOut”的值,来实现TimeOut
CTimeOutSocket::CTimeOutSocket()
... {
m_nTimeOut = 1;
}
... {
m_nTimeOut = 1;
}