/// <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);
     }
 }
Example #2
0
        /// <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);
     }
 }
Example #4
0
        /// <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);
            }
        }