예제 #1
0
 private void OnReceiveCompleted(object sender, SocketAsyncEventArgs e)
 {
     if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
     {
         byte[] buffer = new byte[e.BytesTransferred];
         Array.Copy(e.Buffer, e.Offset, buffer, 0, buffer.Length);
         Array.Clear(e.Buffer, 0, e.Buffer.Length);
         OnReceiveBase(buffer);
         lock (lockRef)
         {
             if (m_socket != null)
             {
                 if (!m_socket.ReceiveAsync(e))
                 {
                     OnReceiveCompleted(null, e);
                 }
             }
         }
     }
     else
     {
         if (e.SocketError == SocketError.ConnectionReset)
         {
             State = ClientExState.Disconnected;
             if (m_autoReConnect && connectOnce)
             {
                 m_Connect();
             }
         }
     }
 }
예제 #2
0
 private void OnConnectCompleted(object sender, SocketAsyncEventArgs e)
 {
     if (e.SocketError == SocketError.Success)
     {
         SocketAsyncEventArgs args = new SocketAsyncEventArgs();
         args.SetBuffer(new Byte[Int16.MaxValue], 0, Int16.MaxValue);
         args.Completed += OnReceiveCompleted;
         lock (lockRef)
         {
             if (!m_socket.ReceiveAsync(args))
             {
                 OnReceiveCompleted(null, args);
             }
         }
         State = ClientExState.Connected;
         OnStateChange?.Invoke(0, "連線成功");
     }
     else if (e.SocketError != SocketError.ConnectionAborted)
     {
         State = ClientExState.Disconnected;
         OnStateChange?.Invoke(1, e.SocketError.ToString());
         if (m_autoReConnect && connectOnce)
         {
             // 自動5秒重連
             Timer timer = new Timer((state) => m_Connect(), null, 5000, -1);
         }
     }
 }
예제 #3
0
 private void OnSendCompleted(object sender, SocketAsyncEventArgs e)
 {
     if (e.SocketError == SocketError.Success)
     {
         OnSendBase((byte[])e.UserToken);
     }
     else if (e.SocketError == SocketError.ConnectionReset)
     {
         State = ClientExState.Disconnected;
         if (m_autoReConnect && connectOnce)
         {
             m_Connect();
         }
     }
 }
예제 #4
0
        private void m_Connect()
        {
            if (m_socket != null)
            {
                lock (lockRef)
                {
                    m_socket.Close(); m_socket.Dispose(); m_socket = null;
                }
            }
            m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            State    = ClientExState.Connecting;
            SocketAsyncEventArgs args = new SocketAsyncEventArgs();

            args.RemoteEndPoint = m_endPoint;
            args.Completed     += OnConnectCompleted;
            lock (lockRef)
            {
                // 如果是false,表示已同步執行連線作業完成,不會觸發Completed事件
                if (!m_socket.ConnectAsync(args))
                {
                    OnConnectCompleted(null, args);
                }
            }
        }