客户机刚连接,服务器这边终止退出了。源代码如下:
(用CNewSocket继承CSocket,重载OnAccept函数,让它调用CServerDlg::OnAccept())
我设了一个按钮:(定义: CNewSocket listenSocket,server;)
void CServerDlg::OnListenBtn() 
{
// TODO: Add your control notification handler code here
if(!listenSocket.Create(2002))
{
AfxMessageBox("Create failed ...");
return ;
}
if(!listenSocket.Listen())
{
        AfxMessageBox("Listen failed ...");
        return;
    }
}void CServerDlg::OnAccept()
{
AfxMessageBox("abc");
        //客户机连接后,服务器这边正常弹出该对话框,但后面那个“def”的对话框出来之前,程序就终止退出了,一点提示也没。
if(!(listenSocket.Accept(server)))
{
AfxMessageBox("Link failed ...");
return;
}
AfxMessageBox("def");
server.setParent(this);
socketFile=new CSocketFile(&server);
in= new CArchive(socketFile, CArchive::load);
out= new CArchive(socketFile,CArchive::store);
AfxMessageBox("Connect client successfully!");
}另外,若将上述两段代码合到CServerDlg::OnListenBtn()中,就是完全成功的。不过我原想用listenSocket不断监听,创建多个server连接,实现一对多的通讯,代码不分开好像不行啊。

解决方案 »

  1.   

    不太清楚,
    难道你在别的范围里面执行Accept()的时候因为域不同而是系统放弃了listen()或者与哪一个listen()取得联系?(问题:listen()线程安全吗?)
      

  2.   

    AfxMessageBox("Link failed ...");这个对话框又没出现?如果没有客户端连接上你就退出了,调试看看有没有accept成功?
      

  3.   

    简单的说吧,我就是想先用listenSocket监听连接,然后每当一个客户连接时(listenSocket自动产生事件响应,调用OnAccept函数)动态创建一个socket,然后将这些socket用链表串起来,以便于管理。有知道怎么做的么?
      

  4.   

    我没看见你动态创建,server啊。
      

  5.   

    建议使用WSAGetLastError来发现错误类型.
      

  6.   

    MSDN上不是有个chatsrvr的例子吗?很好的
      

  7.   

    CAsyncSocket::OnAccept(nErrorCode);
    CClientSocket * pSocket=new CClientSocket; if(Accept(*pSocket))
    {
    m_Client.AddTail(pSocket);
    }
    else
    delete pSocket;
      

  8.   

    就是啊,根本就没有建你动态的在accept里动态建立什么SOCKET,
    每次都用那一人,能不出来吧
    CList <CSocket CSocket&> listSock;
    CClientSocket * pSocket=new CClientSocket; if(Accept(*pSocket))
    {
    listSock.AddTail(pSocket);
    }