我近一个月都在搞Socket 编程.我觉得你如果用来编写聊天室程序,完全没有必要用Client/Server模式.使用广播通信完全可以达到可靠性要求(我自己也编写了一个聊天室).使用广播通信可以所有的通信端口号保持一致.对于服务器程序发送数据地址用INADDR_BROADCAST,对于客户程序发送地址统一用服务器地址.如果用Client/Server模式则必须使用多线程才可以较好地解决问题.(My E_mail:[email protected])

解决方案 »

  1.   

    首先,你可以调试一下,看看客户端与服务端连接时是否执行了OnAccept两次,
    然后,你把服务端发送数据的那一段程序写在这个贴子里。我现在不知道你是怎么样发
    数据的。
                   [email protected]
      

  2.   

    我同意cxwhust的意见,就你的应用需求而言,选用广播方式的套接字通讯比较合适。
      

  3.   

    嘿,谢谢各位大侠指点,不过每个客户端程序连接时服务器端程序都执行了OnAccept函数,不过只有发送信息(字符串)的客户端程序才能收到,如果我想用server_client模式解决这个问题,不知应该怎么办?
    服务器端接收及发送程序是这样的:
    void CNewSocket::OnReceive(int nErrorCode) 
    {
    // TODO: Add your specialized code here and/or call thebaseclass
    m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);
    // 直接转发消息
    AsyncSelect(FD_WRITE);
    }
    void CNewSocket::OnSend(int nErrorCode) 
    {
    // TODO: Add your specialized code here and/or call the basclass
    Send(m_szBuffer,m_nLength,0);
    memset(m_szBuffer,0,m_nLength);
    AsyncSelect(FD_READ);
    }
      

  4.   

    是不是首先接收的socket把接收缓冲清空了,其他的当然无法接收了
      

  5.   

    你每次调用accept都要创建一个新的CAsyncSocket对象来处理相应的连接。
    所以如要给所有的连接都发信息,你必须调用每一个在accept中创建的CAsyncSocket对象
    的send函数。(或许有广播的方法,不过我不知道)。
      

  6.   

    void CNewSocket::OnReceive(int nErrorCode) 
    {
    // TODO: Add your specialized code here and/or call thebaseclass
    m_nLength=Receive(m_szBuffer,sizeof(m_szBuffer),0);
    // 直接转发消息
            for(m=1;m<k;m++)
            {
              m_pSocket[m]->AsyncSelect(FD_WRITE);
            }
    }