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注释掉,那么又正常了。

解决方案 »

  1.   

    我发现问题好像出在EndConnect这边。收到超时请求之后,connectCallback函数还是会执行。
      

  2.   

    调试之后确定了是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 
      

  3.   

    找到原因了,超时的时候需要把socket给断开,clientSocket.Disconnect(true);