void CWSocketServerDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
   CSocket serversocket;
if(!(serversocket.Create(6000)))
{
MessageBox("端口创建失败");
}
if(serversocket.Listen())
{
AfxBeginThread(BeginReceive,&serversocket);
}
    while(1)
        {
         ;
        }
  }UINT CWSocketServerDlg::BeginReceive(LPVOID pParam)
{
   CSocket* serversocket=(CSocket *)pParam;
   CSocket* acceptsocket=new CSocket();
   CString str1;
   char buf[20];
  serversocket->Accept(*acceptsocket);
   while(1)  //持续性线程函数里总会看到
   {
   acceptsocket->Receive(buf,20,0);
   str1=buf;
   str_all+="\r\n";
       str_all+=str1;
       AfxGetApp()->GetMainWnd()->SetDlgItemText(IDC_EDIT1,str_all);
   }
   delete acceptsocket;   return 0;
}最开始运行线程里accept居然不阻塞等待,直接执行后面while(1)内容,我估计是因为onclick执行完后把传递给线程使用的serversocket释放掉了,于是在onclick后面加了死循环,让他先别结束。但这样做报错。
请问怎么解决才能让serversocket传递后不被onclick释放。

解决方案 »

  1.   

    将CSocket serversocket;在头文件中定义成类变量就可以了,不需要用whlie循环
      

  2.   

    void CWSocketServerDlg::OnBnClickedButton1()
    {
    // TODO: 在此添加控件通知处理程序代码
    if(!(serversocket.Create(6000)))
    {
    MessageBox("端口创建失败");
    }
    if(serversocket.Listen())
    {
    AfxBeginThread(BeginReceive,&serversocket);
    }
    }UINT CWSocketServerDlg::BeginReceive(LPVOID pParam)
    {
       CSocket* acceptsocket=new CSocket();
       CString str1;   char buf[20];
      serversocket.Accept(*acceptsocket);
       while(1)  //持续性线程函数里总会看到
       {
       acceptsocket->Receive(buf,20,0);
       str1=buf;
      str_all+="\r\n";
           str_all+=str1;
           AfxGetApp()->GetMainWnd()->SetDlgItemText(IDC_EDIT1,str_all);
         }   delete acceptsocket;   return 0;
    }
    已经改成类变量了,报错,在accept报错
      

  3.   

    已经是static了在代码上能看出问题么?