为什么调用closesocket(),有时会死锁?有人遇到过这种情况吗?

时间:2021-06-04 23:28:09
这种情况,不是每次操作都会出现,
可有时会出现,

就是调用closesocket()时,死锁到这种语句,不能向下执行,

出现的时机也不确定,我这个程序,有时就会出现这种情况(经过跟踪发现的)

怎么解决呢?谢谢

9 个解决方案

#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,但这个函数竟然执行到这里,大概要等一分半左右的时间
}


这是怎么回事呢?谢谢

#9


问题已经解决,谢谢各位!

#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,但这个函数竟然执行到这里,大概要等一分半左右的时间
}


这是怎么回事呢?谢谢

#9


问题已经解决,谢谢各位!