//创建一个线程,线程的执行函数是sendproc ,sockparam是传给socket的关于远程主机的参数    hThread = CreateThread(NULL,0,sendproc,(LPVOID)sockparam,0,0);    if(hThread==NULL)
    {
        MessageBox("Creat thread error!",NULL,MB_ICONEXCLAMATION );
return FALSE;
}
//////////////////////////////////
DWORD WINAPI CIfisokDlg::sendproc(LPVOID sockparam)
{   CMysocket mysocket; 
   LPCTSTR  serveraddr;
   sparam  *pparam;
   int a;
   pparam = (sparam*)sockparam;   mysocket.bysock = pparam;    if(!mysocket.Create())
{    
AfxMessageBox("Can't create socket");
  return FALSE;
    }
   serveraddr = inet_ntoa((pparam->sockaddr)->sin_addr);     a = mysocket.Connect(serveraddr,(pparam->sockaddr)->sin_port);//每次debug到这里就不行了,a=0,但是不debug直接用的时候服务器却显示已经连接。而且不管怎样都无法进入onconnect,如果已经连接应该进入onconnect,请问这是怎么回事,debug与真正用的有什么不同吗?还是我程序出错了  return 1;
}

解决方案 »

  1.   

    CreateThread(NULL,0,sendproc,(LPVOID)sockparam,0,0); 
    这里的sockparam是不是在栈上的临时变量?如果是的话,那肯定有问题,因为调用CreateThread的函数,可能线程函数还没有执行到Connect,那边栈上的变量就被释放了,应该在堆上new出来,在线程里释放
      

  2.   

    sparam  *sockparam = new sparam;
    堆跟栈两者我还没弄清楚,
      

  3.   

    debug的时候,每次过了if(!mysocket.Create())这一步,pparam就变了,它里面的地址都变成了0.
      

  4.   

    程序一般把函数地址变量值存在栈上,但是作用域结束会结束。
    存在堆上的变量不存在这个问题,程序员要自己分配和销毁,比如new delete malloc free and so on..CMysocket是从CSocket,继承的吗?如果是In CSocket, the OnConnect notification function is never called. 
    只有CAsyncSocket和CCeSocket才会产生这个消息。
      

  5.   

    看看Create里面的代码吧,是不是修改了什么。
      

  6.   

    class a =new A()//堆上的,要手动delete 
    class a();//栈上的,自动释放内存如果你是vc.net上,也分托管堆和非托管堆