コード例 #1
0
ファイル: TcpClient.cs プロジェクト: huangdonghai/titan3d
        public override async System.Threading.Tasks.Task <bool> Connect(string strHostIp, UInt16 nPort, int timeOutMillisecond = 3000)
        {
            await Thread.AsyncDummyClass.DummyFunc();

            Profiler.Log.WriteLine(Profiler.ELogTag.Info, "RPC", $"TcpClient.Connect:{strHostIp},{nPort}");
            Close();

            hostIp = strHostIp;
            port   = nPort;
            IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(hostIp), port);

            try
            {
                mSocket = new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

                //if (!SocketOption.SupportSocketIOControl)
                //    mSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, keepAliveOptionValues);
                //else
                //    mSocket.IOControl(IOControlCode.KeepAliveValues, keepAliveOptionValues, null);
                //mSocket.NoDelay = true;
                //mSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);

                //if (false)
                //{
                //    mSocket.Connect(ipe);
                //}
                //else
                {
                    TimeoutObject.Reset();
                    mSocket.BeginConnect(ipe, CallBackMethod, mSocket);
                    //阻塞当前线程
                    TimeoutObject.WaitOne(timeOutMillisecond, false);
                    if (mSocket.Connected == false)
                    {
                        mSocket.Close();
                        Profiler.Log.WriteLine(Profiler.ELogTag.Info, "RPC", $"TcpClient Connect {ipe} Timeout({timeOutMillisecond})");
                    }
                }
            }
            catch (Exception e)
            {
                Profiler.Log.WriteException(e);
            }

            if (mSocket.Connected == false)
            {
                return(false);
            }
            else
            {
                mRun = true;
                //mRecvThread = new System.Threading.Thread(this.RecvPackageProc);
                //mRecvThread.Name = "TcpClient";
                //mRecvThread.Start();
                try
                {
                    //ReceiveBuffer buffer = new ReceiveBuffer();
                    //mSocket.BeginReceive(buffer.buffer, buffer.count, buffer.buffer.Length - buffer.count, SocketFlags.None, EndReceive, buffer);
                    mRcvBuffer.Reset();
                    mSocket.BeginReceive(mRcvBuffer.buffer, mRcvBuffer.count, mRcvBuffer.buffer.Length - mRcvBuffer.count, SocketFlags.None, EndReceive, mRcvBuffer);
                }
                catch (System.Exception ex)
                {
                    Profiler.Log.WriteException(ex);
                }
                return(true);
            }
        }