1.有必要,不仅仅是效率的问题。
2。服务器端必须是非阻塞,试想当服务器Receive数据的时候,如果被阻塞了,结果是整个系统陷入瘫痪的境地。
3。典型的你可以模仿一个OICQ程序来设计。

解决方案 »

  1.   

    一个Socket只负责监听,有client的请求时(OnAccept,不是OnReceive)就再开一个socket来处理,在这个socket的OnReceive事件中接受client发送的数据。
    注意:新new出来的处理socket的OnClose中要delete this
      

  2.   

    定义两个类
    class CListeningSocket : public CAsyncSocket;
    class CReceivingSocket : public CAsyncSocket;
    分别用来监听和接收。
      

  3.   

    1.必须要多线程。否则必然堵塞!
    2.当然,要不然堵塞了,你的其他的N个CLIENTS就要在那喝西北风了。
    这个就和你说的一样了,起一个线程主要负责监听。另外的负责处理。反复的使用。起到不阻塞的作用就可以了!!
      

  4.   

    一个很奇怪的问题
    服务器端Create成功,listen也成功
    m_pSocket = new BServerSocket(this);
    if (m_pSocket->Create(g_uPort))
    {
    AfxMessageBox("Server Socket create success!");
    if (m_pSocket->Listen())
    {
    AfxMessageBox("Server begin listening ......");
    }
    }
    在BServerSocket中重载了OnAccpet函数,其中m_pServer是BServer类的一个对象
    void BServerSocket::OnAccept(int nErrorCode)
    {
    CSocket::OnAccept(nErrorCode);//重载OnAccept
    m_pServer->ServerAccpet();
    }
    在BServer类中写了ServerAccpet()函数
    void BServer::ServerAccpet()
    {
    AfxMessageBox("Accept")
    BClientSocket* pSocket=new BClientSocket(this);
    m_pSocket->Accept(*pSocket);
    }但是问题出来了,用客户端联过来,可以弹出Accept这个对话框,但是一到m_pSOcket->(*pSocket)这一步就出错,弹出一个报错对话框说:unhandled exception in exeserver.exe .....
    不知道为什么,急死人了,我是按照微软的chatsrvr和chatter源吗写的程序,基本没有什么变动,希望大家帮帮我!
      

  5.   

    this 指针到底代表什么?我发现自己的程序中m_pSocket = new BServerSocket(this)并没有把BServer对象指针传进去!
      

  6.   

    BClientSocket类是否定义了构造函数BClientSocket::BClientSocket(BServer*)?
      

  7.   

    还有你的BClientSocket* pSocket=new BClientSocket(this);返回的pSocket指针是否有效?
      

  8.   

    this这里是指向BServer对象的指针
    m_pSocket = new BServerSocket(this)肯定传进去了,要不然你根本不会运行到ServerAccpet()中,仔细检查一下你的BClientSocket类
      

  9.   

    上面的this问题解决了
    现在新的问题,什么时候开启新进程处理客户端的消息?
    void BServer::ServerAccpet()
    {
    在这里?
    BClientSocket* pSocket=new BClientSocket(this);
    if (m_pSocket->Accept(*pSocket)) 在这里?
    }
    启动新的进程传什么参数进去?是pSocket的指针吗?
      

  10.   

    一会没看这么多人回复了this的问题。
    this问题的产生是因为我在主程序中定义了一个BServer的对象,而不是一个对象指针。
    BServer Server,
    Server.Start();刚才贴出的代码就是BServer::Start()中的
    void BServer::Start()
    {
    m_pSocket = new BServerSocket(this);
    if (m_pSocket->Create(g_uPort))
    {
    AfxMessageBox("Server Socket create success!");
    if (m_pSocket->Listen())
    {
    AfxMessageBox("Server begin listening ......");
    }
    }
    }
    我调试进来发现this指针根本就没有指向我的BServer对象,所以进入ServerAccept回调函数时m_pSocket就是没主的变量了。
    解决方法,在主程序中定义对象指针。
    BServer* Server = new BServer();
    Server->Start();
    就OK了,呵呵
      

  11.   

    一般来说,用CSOCKET设计的局域网程序同时可以有几个链接?
    我对于每个客户端的请求都会开一个线程,这个线程如果遇到客户端死机等问题得不到响音,应该如何判断自动结束?
      

  12.   

    对于你这个问题
    http://www.csdn.net/expert/Topic/368/368634.shtm有过讨论
      

  13.   

    用CAsyncSocket吧,可以更好的控制SOCKET:
    --你可以用多线程或者不用也可以,因为你毕竟只有最多80个人嘛。
    --如果不用多线程,则不必担心数据库以及其他的一些同步的问题,但效率是可能会受影响,但你只是在数据库中查询一下数据,没有太复杂的操作,我想不会受到太大的影响。
    --程序编制过程中,需要注意的是SOCKET中各个事件的处理(FD_ACCEPT、FD_RECEIVE等)
    --再觉得不过瘾,就直接用WINSOCK吧(C+WIN32),呵呵。