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(); } } } }
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); } } }
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(); } } }
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); } } }