我在一个activex控件里面使用casyncsocket
 我继承了casyncsocket类,并且重载了onreceive函数 使用的时候,我先new 一个对象,然后调用create
 接着调用connect,连接
 调用send发送数据
 对方有数据返回(如果调用receive就能收到数据)
但,onconnect onsend,onreceive都没有反应
 请问这是什么问题啊?

解决方案 »

  1.   

    重载了onreceive函数,有问题吧
      

  2.   

    msdn这种例子不少,你去看看
    ms-help://MS.VSCC.2003/MS.MSDNQTR.2006JAN.1033/vcsample/html/_sample_mfc_CHATSRVR.htm
      

  3.   

    class CClientSocket : public CAsyncSocket
    {
    // 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;
    }
    }
      

  4.   

    如果你是直接从CAsyncSocket类派生一个客户端,最好要重载Connect,OnConnect这两个虚函数,将其从非阻塞模式变成阻塞模式。CSocket是用消息的方式来实现阻塞的,你可以简化用事件来处理,达到阻塞的目的。
      

  5.   

    楼主的问题我知道是怎么回事了。你在connect调用后,确认调用连接成功了之后,需要嗲用AsyncSelect函数,来绑定你感兴趣的事件,比如FD_READ,FD_WRITE,在绑定这些事件后,相应的事件通知消息才会被触发!
      

  6.   

    你将
     m_pTcpSocket->SetSocketWnd();
    放到Connect()语句前试试,一旦连接之后,再设置WSAAsyncSelect()就晚了啊。