我在OnAccept和OnReceive各得到一个CSocket指针请问我现在怎样根据这个指针得到客户端的IP这里主要是CSocket可能有很多个,是个链

解决方案 »

  1.   

    OnAccept(int nErrorCode) 事件中    SOCKADDR_IN addr;
        int len = sizeof(addr);
        Accept(*m_pClientSocket,(SOCKADDR*)&addr,&len);
        TRACE(IP: %s; PORT: %d\n, inet_ntoa(addr.sin_addr), addr.sin_port);
      

  2.   

    CSDN人气一天不如一天楼上的,这个我已经知道了,
    请问OnReceive下呢?
      

  3.   

    已经得到一个CSocket指针了,怎样根据这个指针得到其IP
      

  4.   

    楼主仔细研究一下MSDN:CObject
      |___CAsyncSocket
            |__CSocket.可以看出,CSocket是从CAsyncSocket继承得到的。CAsyncSocket有一个方法GetPeerName可以得到对方的IP信息。
    因此,答案就明了。void CMySocket::OnReceive(int nErrorCode)   
    {
       CString sIP;
       UINT nPort;
       if(GetPeerName(sIp, nPort) == 0)
       {
         CString sInfo;
          sInfo.Format("GetPeerName() failed! last error: %d", GetLastError());
          AfxMessageBox(sInfo);
          return;
        }   CString sInfo;
       sInfo.Format("The peer IP:%s, port:%d", sInfo.operator LPCTSTR(), nPort);
       AfxMessageBox(sInfo);
    }
         
      

  5.   

    更正一下:   CString sInfo;
       sInfo.Format("The peer IP:%s, port:%d", sIP.operator LPCTSTR(), nPort);
       AfxMessageBox(sInfo);
      

  6.   

    void CServerSocket::OnReceive(int nErrorCode) 
    {
    char buff[1024];
    int bufflen=1024; int nLen = CSocket::Receive(buff,bufflen);
    m_pParentWnd->PostMessage (WM_UPDATEMSG,(WPARAM)buff,(LPARAM)nLen); SOCKADDR_IN ClientAddr;
    int addr_length = sizeof(ClientAddr);
    GetPeerName((SOCKADDR*)&ClientAddr,&addr_length);
    CString strAddr = inet_ntoa(ClientAddr.sin_addr);//********Client IP
    UINT IntProt = ClientAddr.sin_port; //*****************Client Port
    CString strmp;
    strmp.Format(":%d",IntProt);
    AfxMessageBox(strAddr+strmp); CSocket::OnReceive(nErrorCode);
    m_pWnd->ProcessPendingRead(this);
    }
    void CListenSocket::OnAccept(int nErrorCode) 
    {
    CServerSocket* pSocket=new CServerSocket; SOCKADDR_IN ClientAddr;
    int addr_length = sizeof(ClientAddr);
    CSocket::Accept (*pSocket,(SOCKADDR*)&ClientAddr,&addr_length);
    lpIp = inet_ntoa(ClientAddr.sin_addr);//********Client IP
    nPort = ClientAddr.sin_port; //*****************Client Port
    CString strmp;
    strmp.Format(":%d",nPort);
    AfxMessageBox(lpIp+strmp);
    // m_list_pSocket.AddTail(pSocket); pSocket->m_pParentWnd=m_pParentWnd;
    m_pParentWnd->PostMessage (WM_UPDATECONNECT,0,0);
    CSocket::OnAccept(nErrorCode);
    m_pWnd->ProcessPendingAccept();
    }
    以前,我用这两个函数得到的IP PROT值是不一样的,不知道为什么