比如说我们有两个继承CSocket的类,一个是CClientSocket一个是CServerSocket.当然我们要用client去connect那个Server,然后一旦制定对了端口和IP,connect()会触发CServerSocket对象的OnAccept()函数,然后好多程序里面会这样写 
void CServerSocket::OnAccept(int nErrorCode) 

CClientSocket * m_pNewClient = new CClientSocket(); 
ASSERT(m_pNewClient != NULL); 
Accept(*m_pNewClient); CSocket::OnAccept(nErrorCode); 
} 这就是说你随便的建立了一个心的CClientSocket对象来让ServerSocket接受,这样接受怎么保证是和请求连接的客户端Socket一致?不太明白啊,这个新建立的ClientSocket既没有制定IP,也没有端口,ServerSocket怎么会知道和谁去通信呢?
问题补充:其实我的核心问题就是说 
Accept(*m_pNewClient); 
这个函数内部参数m_pNewClient是在服务器上面随随便便new出来的一个和客户端毫不相干的Socket,这样他Accept这个会有什么意义呢?

解决方案 »

  1.   

    MSDN:Windows Sockets: Sequence of Operations
      

  2.   

    //创建新的socket用于连接客户端,并且将其放入列表中便于管理
    CClientSocket* pSocket = new  CClientSocket(this);
    //当客户端已经连接上服务端时,此时由pSocket对象处理数据的接受与发送
    if (m_pSocket->Accept(*pSocket))
    //..........
             m_pSocket->Accept(*pSocket)这句就可以使新创建的socket和用于连接的m_pSocket相联系起来~~~
    那么接下来pSocket就可以用于通信了,包含发送接受~~~
      

  3.   

    问题补充:其实我的核心问题就是说 
    Accept(*m_pNewClient); 
    这个函数内部参数m_pNewClient是在服务器上面随随便便new出来的一个和客户端毫不相干的Socket,这样他Accept这个会有什么意义呢?
    你可能没有注意到Accept(*m_pNewClient); 是由已经建立连接的Socket来联系的~~~
      

  4.   

    CClientSocket* pSocket = new CClientSocket(this); if (m_pSocket->Accept(*pSocket))
    {
    pSocket->Init();
    m_connectionList.AddTail(pSocket);
    }
    else
    delete pSocket;