可有时会出现,
就是调用closesocket()时,死锁到这种语句,不能向下执行,
出现的时机也不确定,我这个程序,有时就会出现这种情况(经过跟踪发现的)
怎么解决呢?谢谢
9 个解决方案
#1
closesocket()这个不会死锁吧。。。
可能原因
如果sock=NULL 不需要closesocket();
另外就是其他地方出错。。
可能原因
如果sock=NULL 不需要closesocket();
另外就是其他地方出错。。
#2
可能是你多线程同时使用同一个socket了。你在这个线程关闭了的同时,它还在另一个线程 还正在使用(应该是出于阻塞状态)。
#3
to star119119(我要成为架构师) :
你的回答,倒是挺符合我程序的环境。
可是即使是其它线程在使用此socket,我在主线程中closesocket()掉这个socket,就会死锁吗?
难道closesocket()的时候,套接字必须是空闲状态?我想不是吧.....
你的回答,倒是挺符合我程序的环境。
可是即使是其它线程在使用此socket,我在主线程中closesocket()掉这个socket,就会死锁吗?
难道closesocket()的时候,套接字必须是空闲状态?我想不是吧.....
#4
closesocket会导致blocking call立即返回的,所以closesocket()的时候套接字不必须是空闲状态
#5
所以啊,我觉得star119119(我要成为架构师) ,
他讲的并不对...
可我这确实有的时候会出现这种情况,closesocket()会死锁,也不知道到底是什么操作导致这个函数死锁,关键它不是每次都这样,不太好调试
郁闷啊......
他讲的并不对...
可我这确实有的时候会出现这种情况,closesocket()会死锁,也不知道到底是什么操作导致这个函数死锁,关键它不是每次都这样,不太好调试
郁闷啊......
#6
可是 ,如果你得sock正在其中一个线程中 读数据。也就是正在处于阻塞状态的话。
这个时候你能closesocket()么?
你还是把你得代码 大致帖出来看看吧
这个时候你能closesocket()么?
你还是把你得代码 大致帖出来看看吧
#7
TO star119119(我要成为架构师)
我这个代码太大了,实在不好拿出来,
不过,你讲的,我明白了,我的程序,确实是会出现你説的那种情况 (某一线程正在recv(),这时,主线程closesocket()),
可是,有时,确实需要在recv()时(超时以前),closesocket(),那怎么解决这个矛盾呢?
好像在这种情况下closesocket(),会导致程序死锁,即一直处于死锁状态。。
怎么解决呢?非常感谢
我这个代码太大了,实在不好拿出来,
不过,你讲的,我明白了,我的程序,确实是会出现你説的那种情况 (某一线程正在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,但这个函数竟然执行到这里,大概要等一分半左右的时间
}
这是怎么回事呢?谢谢
之所以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();
另外就是其他地方出错。。
可能原因
如果sock=NULL 不需要closesocket();
另外就是其他地方出错。。
#2
可能是你多线程同时使用同一个socket了。你在这个线程关闭了的同时,它还在另一个线程 还正在使用(应该是出于阻塞状态)。
#3
to star119119(我要成为架构师) :
你的回答,倒是挺符合我程序的环境。
可是即使是其它线程在使用此socket,我在主线程中closesocket()掉这个socket,就会死锁吗?
难道closesocket()的时候,套接字必须是空闲状态?我想不是吧.....
你的回答,倒是挺符合我程序的环境。
可是即使是其它线程在使用此socket,我在主线程中closesocket()掉这个socket,就会死锁吗?
难道closesocket()的时候,套接字必须是空闲状态?我想不是吧.....
#4
closesocket会导致blocking call立即返回的,所以closesocket()的时候套接字不必须是空闲状态
#5
所以啊,我觉得star119119(我要成为架构师) ,
他讲的并不对...
可我这确实有的时候会出现这种情况,closesocket()会死锁,也不知道到底是什么操作导致这个函数死锁,关键它不是每次都这样,不太好调试
郁闷啊......
他讲的并不对...
可我这确实有的时候会出现这种情况,closesocket()会死锁,也不知道到底是什么操作导致这个函数死锁,关键它不是每次都这样,不太好调试
郁闷啊......
#6
可是 ,如果你得sock正在其中一个线程中 读数据。也就是正在处于阻塞状态的话。
这个时候你能closesocket()么?
你还是把你得代码 大致帖出来看看吧
这个时候你能closesocket()么?
你还是把你得代码 大致帖出来看看吧
#7
TO star119119(我要成为架构师)
我这个代码太大了,实在不好拿出来,
不过,你讲的,我明白了,我的程序,确实是会出现你説的那种情况 (某一线程正在recv(),这时,主线程closesocket()),
可是,有时,确实需要在recv()时(超时以前),closesocket(),那怎么解决这个矛盾呢?
好像在这种情况下closesocket(),会导致程序死锁,即一直处于死锁状态。。
怎么解决呢?非常感谢
我这个代码太大了,实在不好拿出来,
不过,你讲的,我明白了,我的程序,确实是会出现你説的那种情况 (某一线程正在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,但这个函数竟然执行到这里,大概要等一分半左右的时间
}
这是怎么回事呢?谢谢
之所以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
问题已经解决,谢谢各位!