/// <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> /// Initializes a new instance of the <see cref="NetworkGateway"/> class. /// </summary> public static void Initialize() { if (NetworkTcp.Initialized) { return; } NetworkTcp.FillPools(); NetworkTcp.Listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); NetworkTcp.Listener.NoDelay = true; NetworkTcp.Listener.Blocking = false; NetworkTcp.Initialized = true; NetworkTcp.Listener.Bind(new IPEndPoint(IPAddress.Any, 9339)); NetworkTcp.Listener.Listen(150); Logging.Info(typeof(NetworkTcp), "Listener has been bound to " + NetworkTcp.Listener.LocalEndPoint + "."); SocketAsyncEventArgs AcceptEvent = new SocketAsyncEventArgs(); AcceptEvent.Completed += NetworkTcp.OnAcceptCompleted; AcceptEvent.DisconnectReuseSocket = true; NetworkTcp.StartAccept(AcceptEvent); }
/// <summary> /// Called when the client has been accepted. /// </summary> /// <param name="Sender">The sender.</param> /// <param name="AsyncEvent">The <see cref="SocketAsyncEventArgs"/> instance containing the event data.</param> private static void OnAcceptCompleted(object Sender, SocketAsyncEventArgs AsyncEvent) { if (AsyncEvent.SocketError == SocketError.Success) { NetworkTcp.ProcessAccept(AsyncEvent); } else { NetworkTcp.StartAccept(AsyncEvent); } }