示例#1
0
        /// <summary>
        /// Connect a stream according to the settings provided.
        /// </summary>
        /// <param name="settings">Network settings to use to connect the stream</param>
        /// <returns>A <see cref="CStreamClientIO"/> object is evrything went fine, null otherwise</returns>
        public static CStreamClientIO Connect(CStreamClientSettings settings)
        {
            CStreamClientIO stream = null;

            try
            {
                // determine whether v4 or v6 IP addresse
                IPAddress ip        = IPAddress.Parse(settings.IP);
                bool      v6        = AddressFamily.InterNetworkV6 == ip.AddressFamily;
                TcpClient tcpclient = new TcpClient(v6 ? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork);
                try
                {
                    CLog.DEBUG($"{MethodBase.GetCurrentMethod().Module.Name}.{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}", $"About to connect to {settings.FullIP}");
                    tcpclient.Connect(settings.Address, (int)settings.Port);
                    tcpclient.SendBufferSize    = (tcpclient.SendBufferSize >= settings.SendBufferSize ? tcpclient.SendBufferSize : settings.SendBufferSize + 1);
                    tcpclient.ReceiveBufferSize = (tcpclient.ReceiveBufferSize >= settings.ReceiveBufferSize ? tcpclient.SendBufferSize : settings.ReceiveBufferSize);
                    tcpclient.SendTimeout       = settings.SendTimeout * CStreamSettings.ONESECOND;
                    tcpclient.ReceiveTimeout    = settings.ReceiveTimeout * CStreamSettings.ONESECOND;
                    // Create an SSL stream that will close the client's stream.
                    stream = new CStreamClientIO(tcpclient, settings);
                }
                catch (Exception ex)
                {
                    CLog.AddException($"{MethodBase.GetCurrentMethod().Module.Name}.{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}", ex);
                    tcpclient.Close();
                }
            }
            catch (Exception ex)
            {
                CLog.AddException($"{MethodBase.GetCurrentMethod().Module.Name}.{MethodBase.GetCurrentMethod().DeclaringType.Name}.{MethodBase.GetCurrentMethod().Name}", ex);
            }
            return(stream);
        }
示例#2
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        bool TestConnect(char c)
        {
            StartServer(c);

            CStreamClientSettings settings = new CStreamClientSettings()
            {
                AllowedSslErrors = SslPolicyErrors.RemoteCertificateNotAvailable | SslPolicyErrors.RemoteCertificateNameMismatch | SslPolicyErrors.RemoteCertificateChainErrors,
                //IP = CStream.Localhost(),
                IP         = "127.0.0.1",
                Port       = Port,
                ServerName = UseSSL ? "hello world" : null,
            };
            CStreamClientIO clientIO = CStream.Connect(settings);

            if (null != clientIO)
            {
                clientIO.Send("hello");
                Console.ReadKey();
                Console.WriteLine($"Client connected: {clientIO.Connected}");
                Console.ReadKey();
                StopServer(c);
                Console.ReadKey();
                Console.WriteLine($"Client connected: {clientIO.Connected}");
                clientIO.Close();
            }
            return(true);
        }
示例#3
0
        /// <summary>
        /// This function prevents using any size header, using CR+LF as an EOT
        /// </summary>
        /// <param name="settings"></param>
        /// <param name="request"></param>
        /// <param name="EOT"></param>
        /// <returns></returns>
        public static bool ConnectSendLine(CStreamClientSettings settings, string request, string EOT = CStreamIO.CRLF)
        {
            if (string.IsNullOrEmpty(request))
            {
                return(false);
            }
            CStreamClientIO stream = ConnectToSend(settings, request);

            if (null != stream)
            {
                bool fOK = SendLine(stream, request, EOT);
                Disconnect(stream);
                return(fOK);
            }
            return(false);
        }
示例#4
0
        /// <summary>
        /// Connect (<see cref="Connect(CStreamClientSettings)"/>) and send data (<see cref="Send(CStreamIO, byte[], bool)"/> and <see cref="Send(CStreamIO, string)"/>).
        /// </summary>
        /// <param name="settings">The settings to use for sending data</param>
        /// <param name="request">A array of bytes to send</param>
        /// <param name="addSizeHeader">Indicates whether a buffer size block must be added before the buffer to send</param>
        /// <returns>An arry of bytes received in response or if an error occured. In case of a client only request, the function returns the request, as no reply can be returned, if everything went right</returns>
        public static bool ConnectSend(CStreamClientSettings settings, byte[] request, bool addSizeHeader)
        {
            if (null == request || 0 == request.Length)
            {
                return(false);
            }
            CStreamClientIO stream = ConnectToSend(settings, request, addSizeHeader);

            if (null != stream)
            {
                bool fOK = Send(stream, request, addSizeHeader);
                Disconnect(stream);
                return(fOK);
            }
            return(false);
        }
示例#5
0
        /// <summary>
        /// This function prevents using any size header, using CR+LF as an EOT
        /// </summary>
        /// <param name="settings"></param>
        /// <param name="request"></param>
        /// <param name="error"></param>
        /// <param name="EOT"></param>
        /// <returns></returns>
        public static string ConnectSendReceiveLine(CStreamClientSettings settings, string request, out bool error, string EOT = CStreamIO.CRLF)
        {
            error = false;
            if (string.IsNullOrEmpty(request))
            {
                return(null);
            }
            CStreamClientIO stream = ConnectToSend(settings, request);

            if (null != stream)
            {
                string reply = SendReceiveLine(stream, request, out error, EOT);
                Disconnect(stream);
                return(reply);
            }
            return(null);
        }
示例#6
0
        /// <summary>
        /// Connect (<see cref="Connect(CStreamClientSettings)"/>), send (<see cref="Send(CStreamIO, byte[], bool)"/> and <see cref="Send(CStreamIO, string)"/>) and receive (<see cref="Receive(CStreamIO, out int, out bool, bool)"/> and <see cref="Receive(CStreamIO, out int, out bool)"/>) data.
        /// </summary>
        /// <param name="settings">The settings to use for sending data</param>
        /// <param name="request">A array of bytes to send</param>
        /// <param name="addSizeHeader">Indicates whether a buffer size block must be added before the buffer to send</param>
        /// <param name="announcedSize">The size of the reply as announced by the sender</param>
        /// <param name="error">True indicates the function ended up with a error, false otherwise</param>
        /// <returns>An arry of bytes received in response or if an error occured. In case of a client only request, the function returns the request, as no reply can be returned, if everything went right</returns>
        public static byte[] ConnectSendReceive(CStreamClientSettings settings, byte[] request, bool addSizeHeader, out int announcedSize, out bool error)
        {
            byte[] reply = null;
            error         = false;
            announcedSize = 0;
            if (null == request || 0 == request.Length)
            {
                return(null);
            }
            CStreamClientIO stream = ConnectToSend(settings, request, addSizeHeader);

            if (null != stream)
            {
                if (Send(stream, request, addSizeHeader))
                {
                    reply = Receive(stream, out announcedSize, out error, addSizeHeader);
                }
                Disconnect(stream);
            }
            return(reply);
        }
示例#7
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="menu"></param>
        /// <param name="entry"></param>
        /// <param name="option"></param>
        /// <param name="o"></param>
        /// <returns></returns>
        static bool TestListener(MenuList menu, CMenu entry, char option, object o)
        {
            TestListenerType type = (TestListenerType)o;

            type.FileToUse = Input("File to use", LISTENER_TEST_FILE, out bool isdef);
            if (string.IsNullOrEmpty(type.FileToUse))
            {
                Console.WriteLine("Invalid test file");
                return(true);
            }

            type.IP = Input("Listener IP", CStream.Localhost(), out isdef);
            if (string.IsNullOrEmpty(type.IP))
            {
                Console.WriteLine("Invalid IP");
                return(true);
            }

            string sport = Input("Listener port to reach", type.Port.ToString(), out isdef);

            if (string.IsNullOrEmpty(sport))
            {
                return(true);
            }
            try
            {
                type.Port = uint.Parse(sport);
            }
            catch (Exception)
            {
                Console.WriteLine("Invalid port number");
                return(true);
            }

            //var json = new CJson<CListenerRequest>(fileToUse);
            //var request = json.ReadSettings(out bool except);
            //if (null != request)
            //{
            //	var sreply = CStream.ConnectSendReceive(new CStreamClientSettings() { IP = ip, Port = port }, CJson<CListenerRequest>.Serialize(request), out int size, out bool error);
            //	if (!string.IsNullOrEmpty(sreply))
            //	{
            //		CLogger.Add(sreply);
            //		var reply = CJson<CListenerReply>.Deserialize(sreply, out except);
            //		CLogger.Add(reply.ToString());
            //	}
            //	else
            //		CLogger.Add("No reply has been received");
            //}

            var json    = new CJson <CListenerRequest>(type.FileToUse);
            var request = json.ReadSettings(out bool except);

            if (null != request)
            {
                CStreamClientIO streamIO = CStream.Connect(new CStreamClientSettings()
                {
                    IP = type.IP, Port = type.Port
                });
                if (null != streamIO)
                {
                    if (CStream.Send(streamIO, CJson <CListenerRequest> .Serialize(request)))
                    {
                        string sreply;
                        while (!string.IsNullOrEmpty(sreply = CStream.Receive(streamIO, out int announcedSize, out bool error)))
                        {
                            var reply = CJson <CListenerReply> .Deserialize(sreply, out except);

                            CLogger.Add($"{reply.ToString()} (received message)");
                            if (!reply.Notification)
                            {
                                break;
                            }
                        }
                    }
                }
            }

            return(true);
        }