socket异步连接会导致程序卡死

lantianawei 2013-07-09 05:41:19
protected void connectServer()
{
if(socketResult != null)
{
socketResult.connectCallBack(CONNECTSTART);
}
IAsyncResult asyncresult = clientSocket.BeginConnect(ip,port,new AsyncCallback(connectCallback),clientSocket);
// 这里做一个超时的监测,当连接超过5秒还没成功表示超时
if(connectTimeoutObject.WaitOne(5000, false))
{
if(isConnected)
{
if(socketResult != null)
{
Encrypt.initEncrypt();
socketResult.connectCallBack(CONNECTSUCESS);
Thread receiverThread = new Thread(new ThreadStart(receiveSorket));
receiverThread.IsBackground = true;
receiverThread.Start();
}
}
else
{
if(socketResult != null)
{
socketResult.connectCallBack(CONNECTERROR);
}
}
}
else
{
if(socketResult != null)
{
socketResult.connectCallBack(CONNECTTIMEOUT);
}
clientSocket.EndConnect(asyncresult);
close();
}
}
private void connectCallback(IAsyncResult asyncresult)
{
try
{
isConnected = false;
Socket tcpclient = asyncresult.AsyncState as Socket;
tcpclient.EndConnect(asyncresult);
isConnected = true;
}
catch (Exception ex)
{
isConnected = false;
Debug.Log("EndConnectError:"+ex.StackTrace);
}
finally
{
connectTimeoutObject.Set();
}
}
//关闭Socket
public void close()
{
if(clientSocket != null && clientSocket.Connected)
{
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
}
这个是代码。问题是这样的,如果我把后端服务器开着,那不管怎么连后端都正常。问题来了,如果我没开服务器,第一次确实会得到超时,各项情况正常。但是我把程序关了(进程都不存在的),然后再开启,程序会死机。这个是神马情况啊。。如果我把clientSocket.BeginConnect注释掉,那么又正常了。
...全文
568 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
lantianawei 2013-07-09
  • 打赏
  • 举报
回复
找到原因了,超时的时候需要把socket给断开,clientSocket.Disconnect(true);
lantianawei 2013-07-09
  • 打赏
  • 举报
回复
调试之后确定了是clientSocket.EndConnect(asyncresult);出问题了,错误信息是: EndConnectError: at (wrapper managed-to-native) System.Threading.WaitHandle:WaitOne_internal (intptr,int,bool) at System.Threading.WaitHandle.WaitOne () [0x00015] in /Applications/buildAgent/work/3df08680c6f85295/mcs/class/corlib/System.Threading/WaitHandle.cs:334 at System.Net.Sockets.Socket.EndConnect (IAsyncResult result) [0x00000] in <filename unknown>:0 at XYSocket.connectServer () [0x000ca] in /Users/JinYing/majiang2/Assets/Script/net/core/XYSocket.cs:90 EndConnectError: at System.Net.Sockets.Socket.EndConnect (IAsyncResult result) [0x00000] in <filename unknown>:0 at XYSocket.connectCallback (IAsyncResult asyncresult) [0x00013] in /Users/JinYing/majiang2/Assets/Script/net/core/XYSocket.cs:109
public_lcc 2013-07-09
  • 打赏
  • 举报
回复
调试的时候哪句话出问题应该会标出来啊。。。难不成不调试??不然设断点。。
lantianawei 2013-07-09
  • 打赏
  • 举报
回复
我发现问题好像出在EndConnect这边。收到超时请求之后,connectCallback函数还是会执行。

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧