示例#1
0
        /// <summary>
        /// Resolves hostname to IP Address
        /// </summary>
        /// <param name="serverEndPoint">Server IP end point</param>
        /// <returns>True if resolve is successfull</returns>
        private bool GetHostnameEndPoint(out IPEndPoint serverEndPoint)
        {
            serverEndPoint = new IPEndPoint(IPAddress.Any, 0);
            bool resolveSuccess;

            try
            {
                // Find suitable IP address
                var addressList = Dns.GetHostAddresses(HostName);
                foreach (var ipAddress in addressList)
                {
                    if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
                    {
                        serverEndPoint.Address = ipAddress;
                        break;
                    }
                }

                serverEndPoint.Port = RemotePort;
                resolveSuccess      = true;

                // Raise event if registered
                OnHostnameResolved?.Invoke(serverEndPoint);
            }
            catch (SocketException socketException)
            {
                // Raise event if registered
                OnSocketException?.Invoke(socketException);

                resolveSuccess = false;
            }

            return(resolveSuccess);
        }
示例#2
0
        /// <summary>
        /// Main thread method
        /// </summary>
        private void ClientThread()
        {
            IPEndPoint responseEndPoint = null;
            IPEndPoint serverEndPoint;
            var        loopCount = (RepeatCount == 0) ? 1 : RepeatCount - 1;

            // Resolve server IP end point
            _clientRunning = GetHostnameEndPoint(out serverEndPoint);

            #region Main loop
            while (_clientRunning && loopCount >= 0)
            {
                try
                {
                    // Do we have local port assigned?
                    _udpClient = (LocalPort > 0) ? new UdpClient(LocalPort) : new UdpClient();

                    // Send data
                    _udpClient.Send(EchoPattern, EchoPattern.Length, serverEndPoint);

                    // Get the start time
                    var echoStart = DateTime.Now;
                    _udpClient.Client.ReceiveTimeout = ResponseTimeout * 1000;
                    var responseData = _udpClient.Receive(ref responseEndPoint);

                    // Raise event if registered
                    if (OnEchoResponse != null)
                    {
                        var echoTime = DateTime.Now - echoStart;
                        OnEchoResponse(responseEndPoint, echoTime, Utils.CompareByteArrays(EchoPattern, responseData));
                    }
                }
                catch (SocketException socketException)
                {
                    // Raise event if registered
                    OnSocketException?.Invoke(socketException);
                }
                finally
                {
                    _udpClient.Close();
                }

                // Infinite test
                if (RepeatCount > 0)
                {
                    loopCount--;
                }

                Thread.Sleep(100);
            }
            #endregion

            // End up thread legaly
            _clientRunning = false;
            EndClientThread();
        }
        private void DispatchSocketError(Exception exception)
        {
            _userInitiatedDisconnect = false;

            foreach (IParseLiveQueryClientCallbacks callback in _callbacks)
            {
                callback.OnSocketError(this, exception);
            }
            OnSocketException?.Invoke(exception);

            DispatchDisconnected();
        }
示例#4
0
        private void S_OnError(Exception obj)
        {
            log.Write(LogVerbosity.Debug, $"Socket catched exception {obj.ToString()}");

            OnSocketException?.Invoke(obj);
        }
示例#5
0
        /// <summary>
        /// Main thread method
        /// </summary>
        private void ClientThread()
        {
            IPEndPoint serverEndPoint;
            var        receiveBuffer = new byte[4096];
            var        loopCount     = (RepeatCount == 0) ? 1 : RepeatCount - 1;

            // Resolve server IP end point
            _clientRunning = GetHostnameEndPoint(out serverEndPoint);

            if (_clientRunning)
            {
                try
                {
                    // Do we have local port assigned?
                    _tcpClient = (LocalPort > 0) ? new TcpClient(new IPEndPoint(IPAddress.Any, LocalPort)) : new TcpClient();
                    _tcpClient.Connect(serverEndPoint);

                    OnConnect?.Invoke(_tcpClient.Client.RemoteEndPoint);

                    var networkStream = new NetworkStream(_tcpClient.Client)
                    {
                        ReadTimeout  = ResponseTimeout * 1000,
                        WriteTimeout = ResponseTimeout * 1000
                    };

                    #region Main Loop
                    while (_clientRunning && loopCount >= 0)
                    {
                        // Send data
                        networkStream.Write(EchoPattern, 0, EchoPattern.Length);

                        // Get the start time
                        var echoStart = DateTime.Now;

                        // Read the data
                        var bytesRead    = networkStream.Read(receiveBuffer, 0, receiveBuffer.Length);
                        var receivedData = new byte[bytesRead];
                        Array.Copy(receiveBuffer, receivedData, bytesRead);

                        // Raise event if registered
                        if (OnEchoResponse != null)
                        {
                            var echoTime = DateTime.Now - echoStart;
                            OnEchoResponse(serverEndPoint, echoTime, Utils.CompareByteArrays(EchoPattern, receivedData));
                        }

                        // Infinite test
                        if (RepeatCount > 0)
                        {
                            loopCount--;
                        }

                        Thread.Sleep(100);
                    }
                    #endregion

                    networkStream.Close();
                    networkStream = null;
                }
                catch (SocketException socketException)
                {
                    // Raise event if registered
                    OnSocketException?.Invoke(socketException);
                }
                catch (IOException ioException)
                {
                    // Raise event if the inner exception is SocketException
                    if (ioException.InnerException.GetType() == typeof(SocketException))
                    {
                        OnSocketException?.Invoke((SocketException)ioException.InnerException);
                    }
                }
                finally
                {
                    _tcpClient.Close();
                    _tcpClient = null;
                }
            }

            // End up thread legaly
            _clientRunning = false;
            EndClientThread();
        }