一个SOCK_STREAM类型的socket写的程序我用CSocket写了一个基于对话框的客户端,OnDialogInit中调用顺序为CSocket.Create()   CSocket.Connect();又用CSocket写了一个基于对话框的服务器端,OnDialogInit调用顺序为create,bind,listen,accept,close.启动客户及服务器之后,通信正常,只不过服务器端启动之后,要等运行了客户端才会显示出来,这应该是因为accept等待的问题.  为了验证,我在accept后加了个MessageBox(), 就出问题了.故障现象: 启动服务器端之后不显示,对话框不弹出,在启动客户端,这时客户端好像也吊死在哪了,用鼠标移动它也不响应.  这是启动第二个服务器程序,第二个服务器程序可以启动并显示出来,但是双方没有通讯,在任务管理器里面看到有两个服务器程序,一个客户程序. 只要去掉MessageBox,就没问题, 哪位高手指导下. 实在是弄不明白了.

解决方案 »

  1.   

    对话框是写在OnInitDialog里面的,应该是accept成功之后,弹出对话框,等确认后再完成OnInitDialog吧.BOOL CTCPCLientDlg::OnInitDialog()
    {
    .............
    CSocket tempSocket;
    tempSocket.Create(7000, SOCK_STREAM, "127.0.0.1");
    tempSocket.Bind(7000, "127.0.0.1");
    tempSocket.Listen(5);
    tempSocket.Accept(mySocket);
    //AfxMessageBox("aa");
    tempSocket.Close();
    SetTimer(1, 1000, NULL);

    return TRUE;  // return TRUE  unless you set the focus to a control
    }
    另一端的代码如下:
    BOOL CTcpServerDlg::OnInitDialog()
    {
    ...........
    tempSocket.Create(0,SOCK_STREAM, "127.0.0.1");
    tempSocket.Connect("127.0.0.1", 7000);
    SetTimer(1,1000,NULL);
    return TRUE;  // return TRUE  unless you set the focus to a control
    }
      

  2.   

    初学者还是不要追究这么深了,慢慢学点看的懂的吧。如果你熟悉了调试的一些技巧,慢慢试着跟进去看看都调用了写什么,觉得VC的bug还是有的。