这种情况,不是每次操作都会出现,
可有时会出现,就是调用closesocket()时,死锁到这种语句,不能向下执行,出现的时机也不确定,我这个程序,有时就会出现这种情况(经过跟踪发现的)怎么解决呢?谢谢

解决方案 »

  1.   

    closesocket()这个不会死锁吧
    可能原因
    如果sock=NULL 不需要closesocket();
    另外就是其他地方出错。。
      

  2.   

    可能是你多线程同时使用同一个socket了。你在这个线程关闭了的同时,它还在另一个线程 还正在使用(应该是出于阻塞状态)。
      

  3.   

    to  star119119(我要成为架构师) :你的回答,倒是挺符合我程序的环境。
    可是即使是其它线程在使用此socket,我在主线程中closesocket()掉这个socket,就会死锁吗?难道closesocket()的时候,套接字必须是空闲状态?我想不是吧.....
      

  4.   

    closesocket会导致blocking call立即返回的,所以closesocket()的时候套接字不必须是空闲状态
      

  5.   

    所以啊,我觉得star119119(我要成为架构师) ,
    他讲的并不对...
    可我这确实有的时候会出现这种情况,closesocket()会死锁,也不知道到底是什么操作导致这个函数死锁,关键它不是每次都这样,不太好调试郁闷啊......
      

  6.   

    可是 ,如果你得sock正在其中一个线程中 读数据。也就是正在处于阻塞状态的话。这个时候你能closesocket()么?你还是把你得代码 大致帖出来看看吧
      

  7.   

    TO star119119(我要成为架构师)我这个代码太大了,实在不好拿出来,不过,你讲的,我明白了,我的程序,确实是会出现你説的那种情况 (某一线程正在recv(),这时,主线程closesocket()),可是,有时,确实需要在recv()时(超时以前),closesocket(),那怎么解决这个矛盾呢?好像在这种情况下closesocket(),会导致程序死锁,即一直处于死锁状态。。
    怎么解决呢?非常感谢
      

  8.   

    现在,可以肯定的是  star119119(我要成为架构师) 的说法是正确的,之所以closesocket()会死锁,是因为WSARecv()函数死锁造成的,如果双方的连接存在,一方用WSARecv()来接收数据,而另一方并没有发送Send(),那接收方WSARecv()大概要等一分半钟才会返回,但令人奇怪的事,这个函数竟然返回0(成功),按理説,这种情况,接收方不可能成功啊(事实上,接收方确实也没收到数据),但它为什么会返回0(成功)呢?接收方的代码如下:
    WSABUF DataBuf;
    WSAOVERLAPPED RecvOverLapp;
    DWORD flag = 0;
    DataBuf.buf=data;
    DataBuf.len=len;
    memset(&RecvOverLapp,0,sizeof(WSAOVERLAPPED));
    RecvOverLapp.hEvent=hRecvEvent; /////////////////////////////////////
    int ret;
    if((ret=WSARecv(socket,&DataBuf,1,retlen,&flag,&RecvOverLapp,NULL))==0)
    {
    return true;//尽管对方没有send,但这个函数竟然执行到这里,大概要等一分半左右的时间
    }
    这是怎么回事呢?谢谢