/// <summary> /// Starts to receive data from remote host. /// </summary> public static void StartReceive(NetworkToken Token) { if (!Token.Socket.ReceiveAsync(Token.AsyncEvent)) { NetworkTcp.ProcessReceive(Token.AsyncEvent); } }
/// <summary> /// Accept the new client and store it in memory. /// </summary> /// <param name="AsyncEvent">The <see cref="SocketAsyncEventArgs"/> instance containing the event data.</param> private static void ProcessAccept(SocketAsyncEventArgs AsyncEvent) { if (AsyncEvent.AcceptSocket.Connected) { string IpAddress = ((IPEndPoint)AsyncEvent.AcceptSocket.RemoteEndPoint).Address.ToString(); if (IpAddress.StartsWith("192.168.")) { SocketAsyncEventArgs ReadEvent = NetworkTcp.ReadPool.Dequeue(); if (ReadEvent != null) { NetworkToken Token = new NetworkToken(ReadEvent, AsyncEvent.AcceptSocket); Device Device = new Device(Token); Devices.Add(Device); if (!Token.Socket.ReceiveAsync(ReadEvent)) { NetworkTcp.ProcessReceive(ReadEvent); } } else { Logging.Warning(typeof(NetworkTcp), "Server is full, new connections cannot be accepted."); } } } NetworkTcp.StartAccept(AsyncEvent); }
/// <summary> /// Called when [receive completed]. /// </summary> /// <param name="Sender">The sender.</param> /// <param name="AsyncEvent">The <see cref="SocketAsyncEventArgs"/> instance containing the event data.</param> private static void OnReceiveCompleted(object Sender, SocketAsyncEventArgs AsyncEvent) { if (AsyncEvent.SocketError == SocketError.Success) { NetworkTcp.ProcessReceive(AsyncEvent); } else { NetworkTcp.Disconnect(AsyncEvent); } }
/// <summary> /// Connets the specified token to the remote host. /// </summary> public static bool StartConnect(string Host, out NetworkToken Token) { Socket Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Socket.Blocking = false; Socket.NoDelay = true; var ConnectEvent = new SocketAsyncEventArgs(); ConnectEvent.RemoteEndPoint = new DnsEndPoint(Host, 9339); ManualResetEventSlim Waiter = new ManualResetEventSlim(); ConnectEvent.Completed += NetworkTcp.OnConnectCompleted; ConnectEvent.UserToken = Waiter; if (!Socket.ConnectAsync(ConnectEvent)) { NetworkTcp.OnConnectCompleted(Socket, ConnectEvent); } if (Waiter.Wait(10000)) { var AsyncEvent = NetworkTcp.ReadPool.Dequeue(); if (AsyncEvent != null) { Token = new NetworkToken(AsyncEvent, ConnectEvent.ConnectSocket); Token.AsyncEvent.AcceptSocket = null; Token.AsyncEvent.RemoteEndPoint = new DnsEndPoint(Host, 9339); if (!Token.Socket.ReceiveAsync(Token.AsyncEvent)) { NetworkTcp.ProcessReceive(Token.AsyncEvent); } return(true); } else { Logging.Info(typeof(NetworkTcp), "AsyncEvent == null at StartConnect()."); } } else { Logging.Info(typeof(NetworkTcp), "Waiter.Wait(10000) != true at StartConnect()."); } Token = null; return(false); }
/// <summary> /// Receives data from the specified client. /// </summary> /// <param name="AsyncEvent">The <see cref="SocketAsyncEventArgs"/> instance containing the event data.</param> private static void ProcessReceive(SocketAsyncEventArgs AsyncEvent) { if (AsyncEvent.BytesTransferred == 0) { NetworkTcp.Disconnect(AsyncEvent); } if (AsyncEvent.SocketError != SocketError.Success) { NetworkTcp.Disconnect(AsyncEvent); } NetworkToken Token = (NetworkToken)AsyncEvent.UserToken; if (Token.IsConnected) { Token.AddData(); try { if (Token.Socket.Available == 0) { Token.Process(); } if (Token.IsFailing == false) { if (!Token.Socket.ReceiveAsync(AsyncEvent)) { NetworkTcp.ProcessReceive(AsyncEvent); } } else { NetworkTcp.Disconnect(AsyncEvent); } } catch (Exception Exception) { Logging.Warning(typeof(NetworkTcp), Exception.GetType().Name + " thrown at ProcessReceive(" + AsyncEvent.RemoteEndPoint + ")."); NetworkTcp.Disconnect(AsyncEvent); } } else { NetworkTcp.Disconnect(AsyncEvent); } }