当前位置:首页 > 技术问答集
firefox

CSocket两问

 所属目录:Java   |   类型:技术问答   |   时间:2007-05-21
 问题:

一:如何知道某个csocket是否处于连接状态(我不是指实际的连接状态,实际的连接状态应该用心跳包,  
  我的意思是,我如何知道某个csocket是否已调用过close函数)  
  二:我在线程中调用close函数出现断言错,程序如下:  
  //发送心跳包,由主线程激活  
  byte   data   =   0;  
  position   pos,   fpos;  
  while   (1)  
  if   (wait_object_0   ==   waitforsingleobject(hevent,   0))  
  {  
  pos   =   pclientlist->getheadposition();  
  while   (pos)  
  {  
  fpos   =   pos;  
  ccomsocket*   thisccomsocket   =   (ccomsocket*)   pclientlist->getnext(pos);  
  if   (2   ==   thisccomsocket->lostpulsenum   ||  
  socket_error   ==   thisccomsocket->send(&data,   1))   //出错了  
  {  
  pclientlist->removeat(fpos);  
  thisccomsocket->close();   //这里出错  
  delete   thisccomsocket;  
  }  
  else  
  thisccomsocket->lostpulsenum++;   //发送的心跳包个数加1,收到心跳包时减1  
  }  
  }  
   
  错误为sockcore.cpp文件的337行:  
  assert(pstate->m_hsocketwindow   !=   null);

· 网友精彩回答:

发表者:orbit

mfc的csocket类需要一个不可见窗口分发消息,这是mfc初始化的时候完成的,你可以看看这个m_hsocketwindow   是否正确创建或在什么地方被close了

发表者:jjiaming

1.调用过close的函数的csocket的句柄m_hsocket会等于invalid_socket,  
  2.在close之前加一句thisccomsocket->m_hsocket   =invalid_socket,就能正常关闭,为什么会这样我也一直没搞清,好像由堆分配的csocket对象直接调用close时会出错,很奇怪的问题  
  另外  
  pclientlist->removeat(fpos);  
  thisccomsocket->close();   //这里出错  
  delete   thisccomsocket;  
  我不知道pclientlist->removeat(fpos);这个函数中做了些什么,不会在这个函数里就已经delete csocket对象了吧

发表者:sdcer

我也遇到过类似的问题,  
   
  你在函数之间传递socket参数时,形参最好用引用形式,不要用传值的形式。

发表者:nuaawenlin

我把上面的代码放到主线程中,执行一点问题都没有。  
   
  ///////////////////////////////////////////////////////////////////  
   
  csocket   是需要有窗口支持的

.
© 2006-2008 All Rights Reserved