我在一个activex控件里面使用casyncsocket
我继承了casyncsocket类,并且重载了onreceive函数 使用的时候,我先new 一个对象,然后调用create
接着调用connect,连接
调用send发送数据
对方有数据返回(如果调用receive就能收到数据)
但,onconnect onsend,onreceive都没有反应
请问这是什么问题啊?
我继承了casyncsocket类,并且重载了onreceive函数 使用的时候,我先new 一个对象,然后调用create
接着调用connect,连接
调用send发送数据
对方有数据返回(如果调用receive就能收到数据)
但,onconnect onsend,onreceive都没有反应
请问这是什么问题啊?
ms-help://MS.VSCC.2003/MS.MSDNQTR.2006JAN.1033/vcsample/html/_sample_mfc_CHATSRVR.htm
{
// Attributes
public:// Operations
public:
CClientSocket();
virtual ~CClientSocket();public:
long GetData(char* pBuf,int nLen);
void SetUDP(); long GetConnect();
void SetSocketWnd();
// Overrides
public:
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CClientSocket)
//}}AFX_VIRTUAL // Generated message map functions
//{{AFX_MSG(CClientSocket)
//}}AFX_MSG// Implementation
protected:
virtual void OnReceive(int nErrorCode);
virtual void OnSend(int nErrorCode);
virtual void OnAccept(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnClose(int nErrorCode);
private:
CDataList m_DataList;
BOOL m_bTCPSocket; BOOL m_bClosed;
WORD m_wConnect;
};
#define _afxSockThreadState AfxGetModuleThreadState()
#define _AFX_SOCK_THREAD_STATE AFX_MODULE_THREAD_STATE
#define WM_SOCKET_NOTIFY 0x0373/////////////////////////////////////////////////////////////////////////////
// CClientSocketCClientSocket::CClientSocket()
{
m_bTCPSocket = TRUE;
m_bClosed = FALSE;
m_wConnect = 0;
}CClientSocket::~CClientSocket()
{
}
// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CClientSocket, CAsyncSocket)
//{{AFX_MSG_MAP(CClientSocket)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif // 0/////////////////////////////////////////////////////////////////////////////
// CClientSocket member functions
void CClientSocket::OnSend(int nErrorCode)
{
CAsyncSocket::OnSend(nErrorCode);
}
void CClientSocket::OnAccept(int nErrorCode)
{
CAsyncSocket::OnAccept(nErrorCode);
}void CClientSocket::OnReceive(int nErrorCode)
{
CAsyncSocket::OnReceive(nErrorCode);
char szTemp[1024*10] = {0};
int nRecvDataSize = 0;
if(m_bTCPSocket)
{
nRecvDataSize = this->Receive((char*)szTemp,1024*10);
}
else
{
CString strAddress = "";
UINT uPort = 0;
nRecvDataSize = this->ReceiveFrom((char*)szTemp,1024*10,strAddress,uPort);
}
if(nRecvDataSize > 0)
{
m_DataList.AddData((unsigned char*)szTemp,nRecvDataSize);
}
}long CClientSocket::GetData(char* pBuf,int nLen)
{
if(m_bClosed)
{
return RET_SOCKET_CLOSED;
}
PData_Info pData = m_DataList.GetHeadData();
if(NULL != pData)
{
long nRet = pData->dwDataSize;
if(nLen < pData->dwDataSize)
{
return RET_RECV_BUF_SHORT;
}
memcpy(pBuf,pData->pData,pData->dwDataSize);
m_DataList.RemoveHeadData();
delete pData;
return nRet;
}
else
{
return RET_OK;
}
}
void CClientSocket::OnConnect(int nErrorCode)
{
if(0 == nErrorCode)
{
m_wConnect = 1;
}
else
{
m_wConnect = 2;
}
}
void CClientSocket::OnClose(int nErrorCode)
{
m_bClosed = TRUE;
CAsyncSocket::OnClose(nErrorCode);
}
void CClientSocket::SetUDP()
{
m_bTCPSocket = FALSE;
}long CClientSocket::GetConnect()
{
return m_wConnect;
}void CClientSocket::SetSocketWnd()
{
_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
if(!IsWindow(pState->m_hSocketWindow)) return ; WSAAsyncSelect(m_hSocket, pState->m_hSocketWindow,
WM_SOCKET_NOTIFY, FD_READ | FD_CONNECT | FD_CLOSE);
}
调用如下:
m_pTcpSocket = new CClientSocket;
int nSocketProtocol = SOCK_STREAM;
BOOL bCreateRet = FALSE;
int nBindPort = nLocalPort;
bCreateRet = m_pTcpSocket->Create(nBindPort);
if(FALSE == bCreateRet)
{
delete m_pTcpSocket;
m_pTcpSocket = NULL;
return RET_SOCKET_CREATE_ERROR;
}
if(FALSE == m_pTcpSocket->Connect(dwIP_StrIP(m_dwProxyHost),m_wProxyPort))
{
DWORD dwErrorCode = GetLastError();
if(WSAEWOULDBLOCK != dwErrorCode)
{
delete m_pTcpSocket;
m_pTcpSocket = NULL;
return RET_CONNECT_PROXY_ERROR;
}
} m_pTcpSocket->SetSocketWnd();
BOOL bRet = FALSE;
char buffer[1024] = {0};
int bufferlen=1023;
sock5req1 *proxyreq1;
proxyreq1=(sock5req1 *)buffer;
proxyreq1->Ver= SOCKS_VER;
proxyreq1->nMethods=2;
proxyreq1->Methods[0]=METHOD_AUTH_NO;
proxyreq1->Methods[1]=METHOD_AUTH;
int nRet = m_pTcpSocket->Send(buffer,4); DWORD dwWaitCount = 0;
while(0 == m_pTcpSocket->GetData(buffer,1023))
{
Sleep(100);
// dwWaitCount ++;
if(dwWaitCount > 30)
{
m_pTcpSocket->ShutDown();
delete m_pTcpSocket;
m_pTcpSocket = NULL;
return RET_PROXY_ERROR;
}
}
m_pTcpSocket->SetSocketWnd();
放到Connect()语句前试试,一旦连接之后,再设置WSAAsyncSelect()就晚了啊。