Example #1
0
 bool OnOpen(SocketStream sock)
 {
     _startTime = 0;
     _timeStamp = _startTime;
     _sinkSock = sock;
     return true;
 }
Example #2
0
 /// <summary>
 /// Closes the stream.
 /// </summary>
 /// <param name="stream">The <see cref="NetworkStream" /></param>
 private void CloseStream(SocketStream stream)
 {
     this.Log(this.ToString(), "flush client stream", LogLevel.Debug);
     stream.Close();
     this.OnClientDisconnected?.Invoke(stream.ClientId);
 }
Example #3
0
 public Messenger(SocketModel socket)
 {
     this.socket = socket;
     stream      = new SocketStream(socket);
     stream.Write("Slim -- V0.3\n");
 }
Example #4
0
        protected void HandleAcceptedSocket(Object _Socket)
        {
            Stopwatch Stopwatch = new Stopwatch();

            Stopwatch.Start();

            using (var Socket = (Socket)_Socket)
                //using (var SocketStream = new BufferedStream(new SocketStream(Socket)))
                using (var SocketStream = new SocketStream(Socket))
                    using (var SocketStreamReader = new StreamReader(SocketStream))
                        using (var SocketStreamWriter = new StreamWriter(SocketStream))
                        {
                            SocketStreamWriter.NewLine = "\r\n";

                            List <string> HeaderLines = new List <string>();

                            while (Socket.Connected)
                            {
                                string Line = SocketStreamReader.ReadLine();
                                if (Line == null || Line.Length == 0)
                                {
                                    break;
                                }
                                HeaderLines.Add(Line.Trim());
                            }

                            //HeaderLines[0];

                            foreach (var Line in HeaderLines.Skip(1))
                            {
                                string[] Components = Line.Split(new string[] { ":" }, 2, StringSplitOptions.None);

                                string NormalizedKey   = Components[0].Trim().ToLower();
                                string NormalizedValue = Components[1].Trim();

                                switch (NormalizedKey)
                                {
                                case "connection":
                                    switch (NormalizedValue.ToLower())
                                    {
                                    case "keep-alive":
                                        break;

                                    case "close":
                                        break;
                                    }
                                    break;
                                }
                            }

                            SocketStreamWriter.WriteLine("HTTP/1.1 200 OK");
                            SocketStreamWriter.WriteLine("Content-Type: text/html");
                            SocketStreamWriter.WriteLine("Connection: close");
                            SocketStreamWriter.WriteLine("");
                            SocketStreamWriter.WriteLine("Hello World!");
                            SocketStreamWriter.Flush();
                            Socket.Close();
                        }

            Stopwatch.Stop();
            Console.WriteLine(Stopwatch.Elapsed);
        }
Example #5
0
            private void NsiFromSrv(SocketStream stmX, Dictionary <string, string> aC, DataSet ds,
                                    ref string sErr, int nRetSrv)
            {
                int
                    nFullEnd   = 0,
                    nStartRead = 0,
                    nEndRead   = 0;
                string
                    sMD5New = aC["MD5"],
                    sP      = xNSI.sPathNSI + xNSI.DT[sTName].sXML;

                SocketStream.ASRWERROR
                    nRErr;

                if ((bMD_5 == true) && (sMD5New == (string)xNSI.BD_TINF_RW(sTName)["MD5"]))
                {
                    sErr = "OK-No Load";
                    xNSI.BD_TINF_RW(sTName)["LASTLOAD"] = DateTime.Now;
                }
                else
                {
                    sErr = "Ошибка чтения XML";
                    string sXMLFile = "";

                    if (stmX.ASReadS.OutFile.Length == 0)
                    {
                        stmX.ASReadS.TermDat = AppC.baTermMsg;
                        nStartRead           = Environment.TickCount;
                        nRErr    = stmX.ASReadS.BeginARead(true, 1000 * 300);
                        nEndRead = Environment.TickCount;
                        switch (nRErr)
                        {
                        case SocketStream.ASRWERROR.RET_FULLMSG:       // сообщение полностью получено
                            break;

                        default:
                            throw new System.Net.Sockets.SocketException(10061);
                        }
                    }
                    sXMLFile = stmX.ASReadS.OutFile;
                    stmX.Disconnect();

                    try
                    {
                        xNSI.DT[sTName].dt.BeginLoadData();
                        xNSI.DT[sTName].dt.Clear();
                        System.Xml.XmlReader xmlRd = System.Xml.XmlReader.Create(sXMLFile);
                        xNSI.DT[sTName].dt.ReadXml(xmlRd);
                        xmlRd.Close();

                        xNSI.DT[sTName].dt.EndLoadData();

                        if (File.Exists(sP))
                        {
                            File.Delete(sP);
                        }

                        if (xNSI.AfterLoadNSI(sTName, true, sXMLFile) == AppC.RC_OK)
                        {
                            File.Move(sXMLFile, sP);
                        }

                        xNSI.BD_TINF_RW(sTName)["MD5"]      = sMD5New;
                        xNSI.BD_TINF_RW(sTName)["LASTLOAD"] = DateTime.Now;
                    }
                    finally
                    {
                        if (File.Exists(sXMLFile))
                        {// возникла ошибка при загрузке, иначе отработал бы Move
                            sErr = "Ошибка загрузки XML";
                            File.Delete(sXMLFile);
                        }
                        else
                        {// ошибок не было
                            sErr = "OK";
                        }
                        nFullEnd = Environment.TickCount;
                        //xNSI.DT[sTName].sDTStat = String.Format("{0(сокет)}-{1(XML)}-{2(Full)}",
                        //    Srv.TimeDiff(nStartRead, nEndRead, 1),
                        //    Srv.TimeDiff(nEndRead, nFullEnd, 1),
                        //    Srv.TimeDiff(xNSI.DT[sTName].nCount, nFullEnd, 1));
                        xNSI.DT[sTName].sDTStat = String.Format("{0}(сокет)-{1}(XML)-{2}(Full)",
                                                                Srv.TimeDiff(nStartRead, nEndRead, 1),
                                                                Srv.TimeDiff(nEndRead, nFullEnd, 1),
                                                                Srv.TimeDiff(xNSI.DT[sTName].nCount, nFullEnd, 1));
                    }
                }
            }
        public object Decode(object sender, SocketClient <object, object, object> client, SocketStream <object, object, object> stream)
        {
            MemoryStream ms = new MemoryStream();
            byte         data;

            while ((data = (byte)stream.ReadByte()) != 0)
            {
                ms.WriteByte(data);
            }

            string xml = encoding.GetString(ms.ToArray());

            return(NicoXmlRegistry.Deserialize(xml));
        }
Example #7
0
 void RequestFrames(UInt32 timestamp, SocketStream sock, UInt32 maxFrames, UInt32[] gotFrames)
 {
     uint count = 0;
     try 
     {
         for (count = 0; count < maxFrames; count++)
         {
             IBuffer buffer = WindowsRuntimeBufferExtensions.AsBuffer(_buffer, 0, (Int32)(_mp3Reader.FrameLen));
             Int32 len = (Int32)_mp3Reader.ReadFrames(buffer, 1);
             byte[] byteArray = buffer.ToArray();
             while (len > 0)
             {
                 Int32[] sent = new Int32[1];
                 sock.Send(byteArray, (Int32)len, sent);
                 len -= sent[0];
                 byte[] byteArray2 = new byte[len];
                 Array.Copy(byteArray, sent[0], byteArray2, 0, len);
                 byteArray = byteArray2;
             }
         }
     } catch {
         // TODO
     }
     gotFrames[0] = count;
 }
        } // AddHookChannelUri

        //
        // end of IChannelReceiverHook implementation
        //

        // Thread for listening
        void Listen()
        {
            bool bOkToListen = false;

            try
            {
                _tcpListener.Start(_bExclusiveAddressUse);
                bOkToListen = true;
            }
            catch (Exception e)
            {
                _startListeningException = e;
            }

            _waitForStartListening.Set(); // allow main thread to continue now that we have tried to start the socket

            InternalRemotingServices.RemotingTrace("Waiting to Accept the Socket on Port: " + _port);

            //
            // Wait for an incoming socket
            //
            Socket socket;

            while (bOkToListen)
            {
                InternalRemotingServices.RemotingTrace("TCPChannel::Listen - tcpListen.Pending() == true");

                try
                {
                    socket = _tcpListener.AcceptSocket();

                    if (socket == null)
                    {
                        throw new RemotingException(
                                  String.Format(
                                      CultureInfo.CurrentCulture, CoreChannel.GetResourceString("Remoting_Socket_Accept"),
                                      Marshal.GetLastWin32Error().ToString(CultureInfo.InvariantCulture)));
                    }
                    else
                    {
                        // disable nagle delay
                        socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, 1);
                        // Set keepalive flag, so that inactive sockets can be cleaned up
                        socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, 1);

                        // set linger option
                        LingerOption lingerOption = new LingerOption(true, 3);
                        socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, lingerOption);

                        Stream netStream = new SocketStream(socket);
                        HttpServerSocketHandler streamManager = null;

                        //Create the socket Handler
                        streamManager = new HttpServerSocketHandler(socket, CoreChannel.RequestQueue, netStream);

                        // @



                        streamManager.DataArrivedCallback = new WaitCallback(_transportSink.ServiceRequest);
                        streamManager.BeginReadMessage();
                    }
                }
                catch (Exception e)
                {
                    if (!_bListening)
                    {
                        // We called Stop() on the tcp listener, so gracefully exit.
                        bOkToListen = false;
                    }
                    else
                    {
                        // we want the exception to show up as unhandled since this
                        //   is an unexpected failure.
                        if (!(e is SocketException))
                        {
                            // <
                        }
                    }
                }
            } // while (bOkToListen)
        }
Example #9
0
        /// <summary>
        /// Logs in the user
        /// </summary>
        /// <returns> Instance of the user object if they login or null else.</returns>
        /// <param name="clientConnection">Client connection.</param>
        /// <param name="currentClientNumber">Current client number.</param>
        private static User LoginUser(TcpClient clientConnection, int currentClientNumber)
        {
            bool notLoggedIn = true;

            while (notLoggedIn)
            {
                Console.WriteLine("Logging user information");

                // User wants to login, so we ask them for their username and password.
                SocketStream.SendMessage("Enter Username - ", clientConnection.GetStream());
                string username = SocketStream.RecieveMessage(clientConnection.GetStream());

                Console.WriteLine(username);

                SocketStream.SendMessage("Enter Password - ", clientConnection.GetStream());
                string password = SocketStream.RecieveMessage(clientConnection.GetStream());

                Console.WriteLine(password);

                try
                {
                    string getUsernameQuery = "SELECT * FROM user_accounts WHERE username = ?username;";

                    // Holds info grabbed from the db
                    string dbPassword  = null;
                    string dbUsername  = null;
                    int    permissions = 0;
                    string lastname    = null;
                    string firstname   = null;

                    using (MySqlConnection con = new MySqlConnection(Database.Instance.ConnectionString))
                    {
                        con.Open();

                        using (var cmd = con.CreateCommand())

                        {
                            cmd.CommandText = getUsernameQuery;

                            cmd.Parameters.Add("?username", MySqlDbType.VarChar).Value = username;

                            using (var queryReader = cmd.ExecuteReader())
                            {
                                // Using while even though only one value should return as the usernames are unique.
                                while (queryReader.Read())
                                {
                                    try
                                    {
                                        dbUsername  = queryReader.GetString(queryReader.GetOrdinal("username"));
                                        dbPassword  = queryReader.GetString(queryReader.GetOrdinal("password"));
                                        permissions = queryReader.GetInt32(queryReader.GetOrdinal("user_type"));
                                        firstname   = queryReader.GetString(queryReader.GetOrdinal("first_name"));
                                        lastname    = queryReader.GetString(queryReader.GetOrdinal("last_name"));
                                    }
                                    catch (Exception e)
                                    {
                                        Console.WriteLine(e);
                                    }
                                }

                                // The username doesn't exist in the database or the password is incorrect
                                // so we loop again asking for a new password.

                                if ((dbUsername == null) || (!PasswordEncryptor.CheckPassword(password, dbPassword)))
                                {
                                    // Tell the user the username or password is incorrect.
                                    // Not too sure whether or not to be specific about which one
                                    // The vagueness in the message increases security though, as
                                    // Someone trying to guess a user's account might not know which one.
                                    SocketStream.SendMessage("Username or password is incorrect, Try again? Y/N\n", clientConnection.GetStream());

                                    // Used to decide if the user wants to continue with the login,
                                    bool continueLogin = true;

                                    // Use this as a form of user input error checking, so we only get y or n.
                                    bool decisionNotMade = true;

                                    while (decisionNotMade)
                                    {
                                        string userResponse = SocketStream.RecieveMessage(clientConnection.GetStream());

                                        switch (userResponse.ToLower())
                                        {
                                        // the user wants to try again, so we can just break the loop and continue
                                        case ("y"):
                                            continueLogin   = true;
                                            decisionNotMade = false;
                                            break;

                                        case ("n"):
                                            continueLogin   = false;
                                            decisionNotMade = false;
                                            break;

                                        // If the choice is not what we want, send the message saying incorrect response and
                                        // try again.
                                        default:
                                            SocketStream.SendMessage("Invalid input, try again.", clientConnection.GetStream());
                                            continue;
                                        }
                                    }

                                    // If the user does not want to continue attempting the login then we return a null user
                                    // the user is not logged in.
                                    if (!continueLogin)
                                    {
                                        return(null);
                                    }
                                    // Here we go back to the start of the loop and ask for a username again.
                                    continue;
                                }

                                // If this point is reached, the user has entered successful login information.

                                SocketStream.SendMessage(String.Format("Welcome back, {0}", firstname), clientConnection.GetStream());

                                return(new User(currentClientNumber, username, firstname, permissions));
                            }
                        }
                    }
                }

                catch (InvalidOperationException)
                {
                    Console.WriteLine("Query cannot be executed, please check parameters.");
                }
            }

            // Return null if the loop to login is broken, this means that the user would like to return to the main menu.
            return(null);
        }
Example #10
0
        /// <summary>
        /// Gets the new username.
        /// </summary>
        /// <returns>The new username.</returns>
        /// <param name="clientConnection">Client connection.</param>
        private static string GetNewUsername(TcpClient clientConnection)
        {
            /////////////////////////////
            ///  USERNAME VALIDATION  ///
            /////////////////////////////

            bool   usernameValid  = false;
            bool   usernameExists = false;
            string username       = null;


            while (!usernameValid)
            {
                SocketStream.SendMessage("Please enter username: "******"Checking username...\n", clientConnection.GetStream());
                using (MySqlConnection connection = new MySqlConnection(Database.Instance.ConnectionString))
                {
                    connection.Open();
                    using (MySqlCommand usernameExistsCommand = connection.CreateCommand())
                    {
                        usernameExistsCommand.CommandText = "SELECT username from user_accounts WHERE username = ?username";
                        usernameExistsCommand.Parameters.Add("?username", MySqlDbType.VarChar).Value = inputUsername;

                        // Here we execute the command to the database and if it returns a non null value, the username exists
                        string usernameInDatabase = (string)usernameExistsCommand.ExecuteScalar();

                        if (usernameInDatabase != null)
                        {
                            usernameExists = true;
                        }
                    }
                    connection.Close();
                }

                // Here we put our username validity conditionals, space for more can be added
                // if there are more constraints to be added at a later date
                // such as certain strings not being accepted.

                if (usernameLength >= 3 && usernameLength <= 20)
                {
                    // Satisfies our length requirement
                    usernameValid = true;
                    username      = inputUsername;
                    SocketStream.SendMessage("Username Accepted!\n", clientConnection.GetStream());
                }
                // Username exists already for a user
                else if (usernameExists)
                {
                    SocketStream.SendMessage("Username already exists! Please choose another.", clientConnection.GetStream());
                    continue;
                }
                // Username doesn't fall into our criteria
                else
                {
                    SocketStream.SendMessage("Username does not satisfy requirements, please insert a new one.", clientConnection.GetStream());
                    continue;
                }
            }

            return(username);
        }
Example #11
0
        /// <summary>
        /// Registers a new user into the messenger database
        /// </summary>
        /// <param name="clientConnection">Client tcp connection.</param>
        private static void RegisterNewUser(TcpClient clientConnection)
        {
            // Display the info asking for the user to input registration

            string registationMenu = "[REGISTRATION MENU]\nUsername must be between 3 and 20 characters\n";

            SocketStream.SendMessage(registationMenu, clientConnection.GetStream());

            string username          = GetNewUsername(clientConnection);
            string encryptedPassword = GetNewPassword(clientConnection);

            // While the username the user inputs is invalid, ask for a correct one.

            /////////////////////
            ///   USER INFO   ///
            /////////////////////

            // To do, get first name, last name and date of birth.
            SocketStream.SendMessage("Please enter your personal information\nWhat is your first name? ", clientConnection.GetStream());

            string firstName = SocketStream.RecieveMessage(clientConnection.GetStream());

            SocketStream.SendMessage("What is your last name? ", clientConnection.GetStream());

            string lastName = SocketStream.RecieveMessage(clientConnection.GetStream());

            // Here we're getting the user's date of birth, going to implement age restrictions for 13 on this messaging service.
            SocketStream.SendMessage("Please enter in format dd/mm/yyyy, dd.mm.yyyy, dd-mm-yyyy.\nWhat is your date of birth? ", clientConnection.GetStream());

            // while a valid dob has not been input.
            bool     dateValid = false;
            DateTime realDOB   = new DateTime();

            while (!dateValid)
            {
                string dob = SocketStream.RecieveMessage(clientConnection.GetStream());

                // If dob is in form dd/mm/yyyy or dd.mm.yyyy or dd-mm-yyyy, it is correct.
                // TODO: validate against the actual roman calander.(only dates that might not be correct is february 29th or something.)
                if (Regex.IsMatch(dob, "^([0]?[1-9]|[1|2][0-9]|[3][0|1])[./-]([0]?[1-9]|[1][0-2])[./-]([0-9]{4}|[0-9]{2})$"))
                {
                    try
                    {
                        // convert the dob into a date time object, use this to convert to an sql date object,
                        // then leave the loop to insert data into database.
                        realDOB = DateTime.Parse(dob);
                        break;
                    }
                    catch (FormatException)
                    {
                        Console.WriteLine("Unable to parse date, incorrect format.");
                        SocketStream.SendMessage("Try again.", clientConnection.GetStream());
                        continue;
                    }
                }
            }

            try
            {
                // Inserting new user into database
                using (var databaseConnection = new MySqlConnection(Database.Instance.ConnectionString))
                {
                    string insertUserQuery = "INSERT INTO user_accounts(username, password, first_name, last_name, dob, user_since, user_type) VALUES (?username, ?password, ?firstname, ?lastname, ?dob, CURRENT_TIMESTAMP(), 1)";
                    databaseConnection.Open();

                    using (var command = databaseConnection.CreateCommand())
                    {
                        command.CommandText = insertUserQuery;
                        command.Parameters.Add("?username", MySqlDbType.VarChar).Value  = username;
                        command.Parameters.Add("?password", MySqlDbType.VarChar).Value  = encryptedPassword;
                        command.Parameters.Add("?firstname", MySqlDbType.VarChar).Value = firstName;
                        command.Parameters.Add("?lastname", MySqlDbType.VarChar).Value  = lastName;
                        command.Parameters.Add("?dob", MySqlDbType.Date).Value          = realDOB;

                        command.ExecuteNonQuery();
                    }

                    databaseConnection.Close();
                    SocketStream.SendMessage("\nUser Registered.\n", clientConnection.GetStream());
                }
            }

            catch (Exception e)
            {
                Console.WriteLine("Error inputting to database - " + e);
            }
        }
        private void AcceptSocketCallback(IAsyncResult ar)
        {
            Socket socket = null;
            TcpServerSocketHandler streamManager = null;
            bool flag = true;

            try
            {
                if (this._tcpListener.IsListening)
                {
                    this._tcpListener.BeginAcceptSocket(this._acceptSocketCallback, null);
                }
                socket = this._tcpListener.EndAcceptSocket(ar);
                if (socket == null)
                {
                    throw new RemotingException(string.Format(CultureInfo.CurrentCulture, CoreChannel.GetResourceString("Remoting_Socket_Accept"), new object[] { Marshal.GetLastWin32Error().ToString(CultureInfo.CurrentCulture) }));
                }
                if ((this._authorizeRemotingConnection != null) && !this._authorizeRemotingConnection.IsConnectingEndPointAuthorized(socket.RemoteEndPoint))
                {
                    throw new RemotingException(CoreChannel.GetResourceString("Remoting_Tcp_ServerAuthorizationEndpointFailed"));
                }
                socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.Debug, 1);
                socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, 1);
                LingerOption optionValue = new LingerOption(true, 3);
                socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, optionValue);
                Stream stream = new SocketStream(socket);
                streamManager = new TcpServerSocketHandler(socket, CoreChannel.RequestQueue, stream);
                WindowsIdentity identity = null;
                flag = false;
                if (this._secure)
                {
                    identity      = this.Authenticate(ref stream, streamManager);
                    streamManager = new TcpServerSocketHandler(socket, CoreChannel.RequestQueue, stream);
                    if ((this._authorizeRemotingConnection != null) && !this._authorizeRemotingConnection.IsConnectingIdentityAuthorized(identity))
                    {
                        throw new RemotingException(CoreChannel.GetResourceString("Remoting_Tcp_ServerAuthorizationIdentityFailed"));
                    }
                }
                streamManager.ImpersonationIdentity = identity;
                streamManager.DataArrivedCallback   = new WaitCallback(this._transportSink.ServiceRequest);
                streamManager.BeginReadMessage();
            }
            catch (Exception exception)
            {
                try
                {
                    if (streamManager != null)
                    {
                        streamManager.SendErrorResponse(exception, false);
                    }
                    if (socket != null)
                    {
                        if (flag)
                        {
                            socket.Close(0);
                        }
                        else
                        {
                            socket.Close();
                        }
                    }
                }
                catch (Exception)
                {
                }
                if (this._bListening)
                {
                    SocketException exception3 = exception as SocketException;
                }
            }
        }
Example #13
0
 public HttpStream(HttpEntity entity, SocketStream stream)
 {
     HttpEntity   = entity;
     SocketStream = stream;
     AddHeaders   = true;
 }
Example #14
0
        public async Task WhenSendingMessagesToEchoServer_ThenStatisticsAreUpdated(
            [LinuxInstance(InitializeScript = InitializeScripts.InstallEchoServer)] ResourceTask <InstanceLocator> vm,
            [Credential(Role = PredefinedRole.IapTunnelUser)] ResourceTask <ICredential> credential,
            [Values(
                 1,
                 (int)DataMessage.MaxDataLength,
                 (int)DataMessage.MaxDataLength * 2)] int length)
        {
            var message = new byte[length];

            FillArray(message);

            var locator = await vm;

            var listener = SshRelayListener.CreateLocalListener(
                new IapTunnelingEndpoint(
                    await credential,
                    await vm,
                    7,
                    IapTunnelingEndpoint.DefaultNetworkInterface,
                    TestProject.UserAgent),
                new AllowAllRelayPolicy());

            listener.ClientAcceptLimit = 1; // Terminate after first connection.
            listener.ListenAsync(CancellationToken.None).ContinueWith(_ => { });

            var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            socket.Connect(new IPEndPoint(IPAddress.Loopback, listener.LocalPort));

            var clientStreamStats = new ConnectionStatistics();
            var clientStream      = new SocketStream(socket, clientStreamStats);

            using (var tokenSource = new CancellationTokenSource())
            {
                // Write full payload.
                await clientStream.WriteAsync(message, 0, message.Length, tokenSource.Token);

                Assert.AreEqual(length, clientStreamStats.BytesTransmitted);

                // Read entire response.
                var response       = new byte[length];
                int totalBytesRead = 0;
                while (true)
                {
                    var bytesRead = await clientStream.ReadAsync(
                        response,
                        totalBytesRead,
                        response.Length - totalBytesRead,
                        tokenSource.Token);

                    totalBytesRead += bytesRead;

                    if (bytesRead == 0 || totalBytesRead >= length)
                    {
                        break;
                    }
                }

                await clientStream.CloseAsync(tokenSource.Token);

                await Task.Delay(50);

                Assert.AreEqual(length, totalBytesRead, "bytes read");
                Assert.AreEqual(length, clientStreamStats.BytesReceived, "client received");
                Assert.AreEqual(length, listener.Statistics.BytesReceived, "server received");
                Assert.AreEqual(length, listener.Statistics.BytesTransmitted, "server sent");
            }
        }
Example #15
0
        public void Disconnect()
        {
            if (_disconnectedCallback != null)
            {
                try
                {
                    _disconnectedCallback(this);
                }
                catch (Exception e)
                {
                    Log.InvokeExceptionLog(this, e, true);
                }
            }

            lock (_lockObject)
            {
                if (!Connected)
                {
                    return;
                }

                Connected = false;
            }
            Log.InvokeInfoLog(this, $"Socket {ContextName} is Disconnected with Ip:{TcpClient.Client.RemoteEndPoint}. Id=" + Id);

            try
            {
                _cancellationToken.Cancel(true);
            }
            catch (Exception e)
            {
                Log.InvokeExceptionLog(this, e, true);
            }

            try
            {
                SocketStatistic.WeHaveDisconnect();
            }
            catch (Exception e)
            {
                Log.InvokeExceptionLog(this, e, true);
            }

            try
            {
                SocketStream.Close();
            }
            catch (Exception e)
            {
                Log.InvokeExceptionLog(this, e, true);
            }

            try
            {
                TcpClient.Close();
            }
            catch (Exception e)
            {
                Log.InvokeExceptionLog(this, e, true);
            }

            try
            {
                _deliveryPublisherSubscriber.Stop();
            }
            catch (Exception e)
            {
                Log.InvokeExceptionLog(this, e, true);
            }


            Task.Run(ProcessOnDisconnectAsync);
        }
Example #16
0
        public static HttpTransaction BeginTransaction(HttpServer server, SocketStream stream, HttpConnectionCallback cb)
        {
            HttpTransaction transaction = new HttpTransaction(server, stream, cb);

            return(transaction);
        }
Example #17
0
 public HttpResponse(SocketStream stream)
 {
     Socket = stream;
     Stream = new HttpStream(this, stream);
 }
Example #18
0
 void JitterMiss(UInt32 timestamp, SocketStream sock, UInt32 jitter)
 {
 }
Example #19
0
        public virtual async Task ConnectAsync()
        {
            Log.Start();
            ActionReply reply = new ActionReply();

            if (isDisposed)
            {
                throw new ApplicationException("This client has been disposed!");
            }

            if (m_stream == null)
            {
                m_stream = new SocketStream(ConnectionInfo.Security);
            }
            else
            {
                if (IsConnected)
                {
                    await DisconnectAsync();
                }
            }

            if (ConnectionInfo.Hostname == null)
            {
                throw new MissingPrimaryKeyException("Hostname is empty!");
            }
            if (UserInfo == null)
            {
                throw new MissingPrimaryKeyException("No user information has been set!");
            }

            m_stream.ConnectTimeout = ConnectionInfo.TimeoutMilliseconds;
            m_stream.Connect(ConnectionInfo.Hostname, ConnectionInfo.Port);
            m_stream.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive,
                                     ConnectionInfo.KeepAlive);

            if (ConnectionInfo.Security != SSLType.Unsecure)
            {
                switch (ConnectionInfo.Security)
                {
                case SSLType.AuthSSL:
                    reply = await SendCommandAsync("AUTH SSL");

                    if (reply.Success)
                    {
                        m_stream.ActivateEncryption(ConnectionInfo.Hostname, null, SslProtocols.Ssl3);
                    }
                    //else
                    //    throw new SecurityNotAvailableException("SSL call failed!");
                    break;

                case SSLType.AuthTLSv10:
                    reply = await SendCommandAsync("AUTH TLS");

                    if (reply.Success)
                    {
                        m_stream.ActivateEncryption(ConnectionInfo.Hostname, null, SslProtocols.Ssl3 | SslProtocols.Tls);
                    }
                    //else
                    //    throw new SecurityNotAvailableException("TLS call failed!");
                    break;

                case SSLType.AuthTLSv11:
                    reply = await SendCommandAsync("AUTH TLS");

                    if (reply.Success)
                    {
                        m_stream.ActivateEncryption(ConnectionInfo.Hostname, null, SslProtocols.Ssl3 | SslProtocols.Tls11);
                    }
                    //else
                    //    throw new SecurityNotAvailableException("TLS call failed!");
                    break;

                case SSLType.AuthTLSv12:
                    reply = await SendCommandAsync("AUTH TLS");

                    if (reply.Success)
                    {
                        m_stream.ActivateEncryption(ConnectionInfo.Hostname, null, SslProtocols.Ssl3 | SslProtocols.Tls12);
                    }
                    //else
                    //    throw new SecurityNotAvailableException("TLS call failed!");
                    break;

                case SSLType.ImplicitSSL:
                    m_stream.ActivateEncryption(ConnectionInfo.Hostname, null, SslProtocols.Ssl2);
                    break;
                }

                ActionLog(reply);
                if (!reply.Success)
                {
                    await DisconnectAsync();

                    return;
                }
            }

            await HandshakeAsync();
            await LogInAsync();

            if (m_stream.IsEncrypted /* && DataConnectionEncryption*/)
            {
                if (!(reply = await SendCommandAsync("PBSZ 0")).Success)
                {
                    ActionLog(reply);
                    await DisconnectAsync();

                    return;
                    //throw new FtpCommandException(reply);
                }

                if (!(reply = await SendCommandAsync("PROT P")).Success)
                {
                    ActionLog(reply);
                    await DisconnectAsync();

                    return;
                    //throw new FtpCommandException(reply);
                }
            }

            if ((reply = await SendCommandAsync("FEAT")).Success && reply.InfoMessages != null)
            {
                GetServerOptions(reply);
            }

            ActionLog(ActionEventType.None, reply);

            if (TextEncoding == Encoding.ASCII && HasFeature(ServerCapabilities.UTF8))
            {
                TextEncoding = Encoding.UTF8;
                reply        = await SendCommandAsync("OPTS UTF8 ON");

                ActionLog(reply);
            }

            if ((reply = await SendCommandAsync("SYST")).Success)
            {
                ServerSystem = reply.Message;
                ActionLog(reply);
            }

            if (m_stream.IsEncrypted && ConnectionInfo.Security == SSLType.Unsecure)
            {
                if (!(reply = await SendCommandAsync("CCC")).Success)
                {
                    ActionLog(reply);
                    await DisconnectAsync();

                    return;
                }
                else
                {
                    m_stream.DeactivateEncryption();
                    await ReadStaleDataAsync(false, true);
                }
            }

            //list whatever files and shit!
        }
Example #20
0
            private void NsiFromSrv(SocketStream stmX, Dictionary <string, string> aC, DataSet ds,
                                    ref string sErr, int nRetSrv)
            {
                SocketStream.ASRWERROR nRErr;
                string sMD5New = aC["MD5"];
                string sP      = xNSI.sPathNSI + xNSI.DT[sTName].sXML;

                if ((bMD_5 == true) && (sMD5New == (string)xNSI.BD_TINF_RW(sTName)["MD5"]))
                {
                    sErr = "OK-No Load";
                    xNSI.BD_TINF_RW(sTName)["LASTLOAD"] = DateTime.Now;
                }
                else
                {
                    sErr = "Ошибка чтения XML";
                    string sXMLFile = "";

                    if (stmX.ASReadS.OutFile.Length == 0)
                    {
                        stmX.ASReadS.TermDat = AppC.baTermMsg;
                        nRErr = stmX.ASReadS.BeginARead(true, 1000 * 60);
                        switch (nRErr)
                        {
                        case SocketStream.ASRWERROR.RET_FULLMSG:       // сообщение полностью получено
                            break;

                        default:
                            throw new System.Net.Sockets.SocketException(10061);
                        }
                    }
                    sXMLFile = stmX.ASReadS.OutFile;
                    stmX.Disconnect();

                    try
                    {
                        sErr = "Ошибка загрузки XML";
                        xNSI.DT[sTName].dt.BeginLoadData();
                        xNSI.DT[sTName].dt.Clear();
                        System.Xml.XmlReader xmlRd = System.Xml.XmlReader.Create(sXMLFile);
                        xNSI.DT[sTName].dt.ReadXml(xmlRd);
                        xmlRd.Close();

                        xNSI.DT[sTName].dt.EndLoadData();

                        sErr = "Ошибка сохранения XML";

                        if (File.Exists(sP))
                        {
                            File.Delete(sP);
                        }

                        if (xNSI.AfterLoadNSI(sTName, true, sXMLFile) == AppC.RC_OK)
                        {
                            File.Move(sXMLFile, sP);
                        }

                        xNSI.BD_TINF_RW(sTName)["MD5"]      = sMD5New;
                        xNSI.BD_TINF_RW(sTName)["LASTLOAD"] = DateTime.Now;
                    }
                    finally
                    {
                        if (File.Exists(sXMLFile))
                        {// возникла ошибка при загрузке, иначе отработал бы Move
                            sErr = "Ошибка загрузки XML";
                            File.Delete(sXMLFile);
                        }
                        else
                        {// ошибок не было
                            sErr = "OK";
                        }
                    }
                }
            }
Example #21
0
        private string ExchgSrv(int nCom, string sPar1, string sDop,
                                LoadFromSrv dgRead, DataSet dsTrans, ref int ret)
        {
            string sC;
            string sAdr = xPars.sHostSrv + ":" + xPars.nSrvPort.ToString();
            string sErr = sAdr + "-нет связи с сервером";
            int    nRetSrv;

            byte[] bAns = { };

            //SocketStream.ASRWERROR nRErr;

            System.IO.Stream stm = null;

            ret = 0;
            try
            {
                ssWrite = new SocketStream(xPars.sHostSrv, xPars.nSrvPort);
                if (!TestConnection())
                {
                    //throw new System.Net.Sockets.SocketException(11053);
                }

                stm = ssWrite.Connect();

                // поток создан, отправка команды
                sErr = sAdr + "-команды не отправлена";
                byte[] baCom = SetUpLoadCommand(nCom, sPar1, sDop);

                // 20 секунд на запись команды
                ssWrite.ASWriteS.TimeOutWrite = 1000 * 20;
                ssWrite.ASWriteS.BeginAWrite(baCom, baCom.Length);

                sErr = sAdr + "-ошибка завершения";
                // 10 секунд на запись терминатора сообщения
                ssWrite.ASWriteS.TimeOutWrite = 1000 * 10;
                // терминатор сообщения
                ssWrite.ASWriteS.BeginAWrite(AppC.baTermMsg, AppC.baTermMsg.Length);

                sErr = sAdr + "-ошибка чтения";

/*
 *              // 120 секунд на чтение ответа
 *              ssWrite.ASReadS.TimeOutRead = 1000 * 120;
 *              ssWrite.ASReadS.TermMsg = AppC.baTermCom;
 *              nRErr = ssWrite.ASReadS.BeginARead();
 *              switch (nRErr)
 *              {
 *                  case SocketStream.ASRWERROR.RET_FULLBUF:   // переполнение буфера
 *                      sErr = " длинная команда";
 *                      throw new System.Net.Sockets.SocketException(10061);
 *                  case SocketStream.ASRWERROR.RET_FULLMSG:   // сообщение полностью получено
 *                      sC = ssWrite.ASReadS.GetMsg();
 *                      break;
 *                  default:
 *                      throw new System.Net.Sockets.SocketException(10061);
 *              }
 */

                //============
                int nCommLen = 0;
                bAns = ReadAnswerCommand(stm, ref nCommLen);
                sC   = Encoding.UTF8.GetString(bAns, 0, nCommLen - AppC.baTermCom.Length);
                //================


                Dictionary <string, string> aComm = SrvCommParse(sC, new char[] { ';' });
                nRetSrv = int.Parse(aComm["RET"]);

                if (aComm["COM"] == AppC.saComms[nCom])
                {
                    if (nRetSrv == AppC.RC_OK)
                    {
                        sErr = "OK";
                        if (dgRead != null)
                        {
                            dgRead(stm, aComm, dsTrans, ref sErr, nRetSrv);
                        }
                        else
                        {//
                         //sErr = sAdr + "-завершение";
                            //// 5 секунд на чтение ответа
                            //ssWrite.ASReadS.TimeOutRead = 1000 * 5;
                            //ssWrite.ASReadS.TermMsg = AppC.baTermMsg;
                            //nRErr = ssWrite.ASReadS.BeginARead(256);
                            //switch (nRErr)
                            //{
                            //    case SocketStream.ASRWERROR.RET_FULLBUF:   // переполнение буфера
                            //        sErr = " длинная команда";
                            //        throw new System.Net.Sockets.SocketException(10061);
                            //    case SocketStream.ASRWERROR.RET_FULLMSG:   // сообщение полностью получено
                            //        break;
                            //    default:
                            //        throw new System.Net.Sockets.SocketException(10061);
                            //}
                        }
                    }
                    else
                    {
                        if (aComm["MSG"] != "")
                        {
                            sErr = sAdr + " - ошибка:\r\n" + aComm["MSG"];
                        }
                        else
                        {
                            sErr = sAdr + "\r\n Отложено выполнение";
                        }
                    }
                }
                ret = nRetSrv;
            }
            catch (Exception e)
            {
                sC  = e.Message;
                ret = 3;
            }
            finally
            {
                ssWrite.Disconnect();
            }
            return(sErr);
        }
Example #22
0
        public static HttpTransaction BeginTransaction(HttpServer server, SocketStream stream, HttpConnectionCallback cb, bool closeOnEnd = false)
        {
            HttpTransaction transaction = new HttpTransaction(server, stream, cb, closeOnEnd);

            return(transaction);
        }
Example #23
0
        private string ShMove(string sHostSh, int nPortSh, string sLogin, string sPass,
                              string sDevID, string sOper, ref int nRet)
        {
            string sC;
            string sAdr = sHostSh + ":" + nPortSh.ToString();
            string sErr = sAdr + "-нет связи с сервером";

            SocketStream.ASRWERROR nRErr;
            byte[] baCom;

            SocketStream ssSH = null;

            System.IO.Stream stm = null;

            try
            {
                Encoding enc866 = Encoding.Default;

                ssSH = new SocketStream(sHostSh, nPortSh);
                if (!TestConnection())
                {
                    //throw new System.Net.Sockets.SocketException(11053);
                }
                stm = ssSH.Connect();

                // поток создан, отправка команды
                sErr = sAdr + "-команда не отправлена";
                string sCom = "100|" + sLogin + "|" + sPass + "|" + sDevID + "|" + sOper;
                baCom = enc866.GetBytes(sCom);

                // 10 секунд на запись команды
                ssSH.ASWriteS.TimeOutWrite = 1000 * 10;
                ssSH.ASWriteS.BeginAWrite(baCom, baCom.Length);

                sErr = sAdr + "-ошибка чтения";
                // 20 секунд на чтение ответа
                ssSH.ASReadS.TimeOutRead = 1000 * 30;
                ssSH.ASReadS.MsgEncoding = Encoding.Default;
                //ssSH.ASReadS.TermMsg = enc866.GetBytes("1|");
                ssSH.ASReadS.TermDat = enc866.GetBytes("1|");

                nRErr = ssSH.ASReadS.BeginARead(256);
                switch (nRErr)
                {
                case SocketStream.ASRWERROR.RET_FULLBUF:       // переполнение буфера
                    sErr = " длинная команда";
                    throw new System.Net.Sockets.SocketException(10061);

                case SocketStream.ASRWERROR.RET_FULLMSG:       // сообщение полностью получено
                    sC = ssSH.ASReadS.GetMsg();
                    break;

                default:
                    throw new System.Net.Sockets.SocketException(10061);
                }

                sErr = " ошибочный ответ";
                string[] saReply = sC.Split(new char[] { '|' });
                nRet = int.Parse(saReply[2]);
                switch (nRet)
                {
                case 0:
                    sErr = "OK";
                    break;

                case -1:
                    sErr = " Неверный ID";
                    break;

                case -2:
                    sErr = " Неверный User/Pass";
                    break;

                case -3:
                    sErr = " Ошибка устройства";
                    break;

                case -4:
                    sErr = " Нет прав";
                    break;

                default:
                    sErr = " Неизвестная ошибка";
                    break;
                }
            }
            catch (Exception e)
            {
                sC   = e.Message;
                nRet = 3;
            }
            finally
            {
                ssSH.Disconnect();
            }
            return(sErr);
        }
        // AcceptSocket method which will invoke the
        // authorization callbacks
        void AcceptSocketCallback(IAsyncResult ar)
        {
            Socket socket = null;

            InternalRemotingServices.RemotingTrace("TCPChannel::Listen - tcpListen.Pending() == true");
            TcpServerSocketHandler streamManager = null;
            bool closeImmediately = true;

            try
            {
                //
                // Wait for an incoming socket
                // if the listener is still active
                if (_tcpListener.IsListening)
                {
                    _tcpListener.BeginAcceptSocket(_acceptSocketCallback, null);
                }

                socket = _tcpListener.EndAcceptSocket(ar);

                if (socket == null)
                {
                    throw new RemotingException(
                              String.Format(
                                  CultureInfo.CurrentCulture, CoreChannel.GetResourceString("Remoting_Socket_Accept"),
                                  Marshal.GetLastWin32Error().ToString(CultureInfo.CurrentCulture)));
                }

                if (_authorizeRemotingConnection != null)
                {
                    bool authorized = _authorizeRemotingConnection.IsConnectingEndPointAuthorized(socket.RemoteEndPoint);
                    if (!authorized)
                    {
                        throw new RemotingException(CoreChannel.GetResourceString(
                                                        "Remoting_Tcp_ServerAuthorizationEndpointFailed"));
                    }
                }

                // disable nagle delay
                socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, 1);
                // Set keepalive flag, so that inactive sockets can be cleaned up
                socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, 1);

                // set linger option
                LingerOption lingerOption = new LingerOption(true, 3);
                socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, lingerOption);

                Stream netStream = new SocketStream(socket);
                streamManager = new TcpServerSocketHandler(socket, CoreChannel.RequestQueue, netStream);

#if !FEATURE_PAL
                WindowsIdentity identity = null;
#endif // !FEATURE_PAL
                // If authentication is requested wait for auth request.
                closeImmediately = false;
                if (_secure)
                {
#if !FEATURE_PAL
                    identity = Authenticate(ref netStream, streamManager);
                    // Create a new SocketHandler to wrap the new netStream
                    streamManager = new TcpServerSocketHandler(socket, CoreChannel.RequestQueue, netStream);
                    if (_authorizeRemotingConnection != null)
                    {
                        bool authorized = _authorizeRemotingConnection.IsConnectingIdentityAuthorized(identity);
                        if (!authorized)
                        {
                            throw new RemotingException(CoreChannel.GetResourceString(
                                                            "Remoting_Tcp_ServerAuthorizationIdentityFailed"));
                        }
                    }
#else
                    throw new NotSupportedException();
#endif // !FEATURE_PAL
                }

#if !FEATURE_PAL
                // Cache the identity for impersonation
                streamManager.ImpersonationIdentity = identity;
#endif // !FEATURE_PAL


                streamManager.DataArrivedCallback = new WaitCallback(_transportSink.ServiceRequest);
                streamManager.BeginReadMessage();
            }
            catch (Exception e)
            {
                // Close the socket pre-emptively. We also close the socket if
                // We need to catch all exceptions if we hit ObjectDisposedException
                try{
                    if (streamManager != null)
                    {
                        streamManager.SendErrorResponse(e, false);
                    }
                    if (socket != null)
                    {
                        if (closeImmediately)
                        {
                            socket.Close(0);
                        }
                        else
                        {
                            socket.Close();
                        }
                    }
                }catch (Exception) {}
                if (!_bListening)
                {
                    // We called Stop() on the tcp listener, so gracefully exit.
                    //bOkToListen = false;
                }
                else
                {
                    // we want the exception to show up as unhandled since this
                    //   is an unexpected failure.
                    if (!(e is SocketException))
                    {
                        // <
                    }
                }
            }
        }
        // Token: 0x0600184D RID: 6221 RVA: 0x00063F20 File Offset: 0x00062120
        internal static bool TryOpenChannel(NetworkPath netPath, int timeoutInMs, out TcpClientChannel channel, out NetworkTransportException networkEx)
        {
            channel   = null;
            networkEx = null;
            Exception       ex              = null;
            Socket          socket          = null;
            Stream          stream          = null;
            NegotiateStream negotiateStream = null;
            ReplayStopwatch replayStopwatch = new ReplayStopwatch();

            replayStopwatch.Start();
            try
            {
                socket = new Socket(netPath.TargetEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                if (netPath.Purpose == NetworkPath.ConnectionPurpose.Seeding)
                {
                    socket.ReceiveBufferSize = RegistryParameters.SeedingNetworkTransferSize;
                    socket.SendBufferSize    = RegistryParameters.SeedingNetworkTransferSize;
                }
                else
                {
                    socket.ReceiveBufferSize = RegistryParameters.LogCopyNetworkTransferSize;
                    socket.SendBufferSize    = RegistryParameters.LogCopyNetworkTransferSize;
                }
                if (netPath.HasSourceEndpoint())
                {
                    socket.Bind(netPath.SourceEndPoint);
                }
                TcpClientChannel.ConnectAbandon connectAbandon = new TcpClientChannel.ConnectAbandon(socket);
                IAsyncResult asyncResult = socket.BeginConnect(netPath.TargetEndPoint.Address, netPath.TargetEndPoint.Port, null, connectAbandon);
                if (!asyncResult.AsyncWaitHandle.WaitOne(timeoutInMs, false))
                {
                    socket = null;
                    connectAbandon.Cancel(asyncResult);
                    TcpChannel.ThrowTimeoutException(netPath.TargetNodeName, ReplayStrings.NetworkConnectionTimeout(timeoutInMs / 1000));
                }
                socket.EndConnect(asyncResult);
                long elapsedMilliseconds = replayStopwatch.ElapsedMilliseconds;
                ExTraceGlobals.TcpClientTracer.TraceDebug <long>(0L, "Connection took {0}ms", elapsedMilliseconds);
                socket.LingerState = new LingerOption(true, 0);
                if (!netPath.UseSocketStream || RegistryParameters.DisableSocketStream)
                {
                    stream = new NetworkStream(socket, false);
                }
                else
                {
                    stream = new SocketStream(socket, netPath.SocketStreamBufferPool, netPath.SocketStreamAsyncArgPool, netPath.SocketStreamPerfCounters);
                }
                negotiateStream     = new NegotiateStream(stream, false);
                stream              = null;
                elapsedMilliseconds = replayStopwatch.ElapsedMilliseconds;
                if (elapsedMilliseconds >= (long)timeoutInMs)
                {
                    TcpChannel.ThrowTimeoutException(netPath.TargetNodeName, ReplayStrings.NetworkConnectionTimeout(timeoutInMs / 1000));
                }
                int num = timeoutInMs - (int)elapsedMilliseconds;
                negotiateStream.WriteTimeout = num;
                negotiateStream.ReadTimeout  = num;
                TcpClientChannel.AuthAbandon authAbandon = new TcpClientChannel.AuthAbandon(socket, negotiateStream);
                string targetName;
                if (netPath.UseNullSpn)
                {
                    targetName = "";
                }
                else
                {
                    targetName = "HOST/" + netPath.TargetNodeName;
                }
                bool            encrypt = netPath.Encrypt;
                ProtectionLevel protectionLevel;
                if (encrypt)
                {
                    protectionLevel = ProtectionLevel.EncryptAndSign;
                }
                else if (RegistryParameters.DisableNetworkSigning)
                {
                    protectionLevel = ProtectionLevel.None;
                }
                else
                {
                    protectionLevel = ProtectionLevel.Sign;
                }
                asyncResult = negotiateStream.BeginAuthenticateAsClient(CredentialCache.DefaultNetworkCredentials, targetName, protectionLevel, TokenImpersonationLevel.Identification, null, authAbandon);
                if (!asyncResult.AsyncWaitHandle.WaitOne(num, false))
                {
                    negotiateStream = null;
                    socket          = null;
                    authAbandon.Abandon(asyncResult);
                    TcpChannel.ThrowTimeoutException(netPath.TargetNodeName, ReplayStrings.NetworkConnectionTimeout(timeoutInMs / 1000));
                }
                negotiateStream.EndAuthenticateAsClient(asyncResult);
                bool flag = false;
                if (!negotiateStream.IsAuthenticated)
                {
                    flag = true;
                }
                else if (protectionLevel != ProtectionLevel.None && !negotiateStream.IsMutuallyAuthenticated)
                {
                    if (netPath.IgnoreMutualAuth || MachineName.Comparer.Equals(netPath.TargetNodeName, Environment.MachineName))
                    {
                        ExTraceGlobals.TcpClientTracer.TraceDebug(0L, "Ignoring mutual auth since we are local");
                    }
                    else
                    {
                        flag = true;
                    }
                }
                if (!flag && encrypt && !negotiateStream.IsEncrypted)
                {
                    ExTraceGlobals.TcpClientTracer.TraceError(0L, "Encryption requested, but could not be negotiated");
                    flag = true;
                }
                if (flag)
                {
                    ExTraceGlobals.TcpClientTracer.TraceError <bool, bool, bool>(0L, "Security Negotiation failed. Auth={0},MAuth={1},Encrypt={2}", negotiateStream.IsAuthenticated, negotiateStream.IsMutuallyAuthenticated, negotiateStream.IsEncrypted);
                    NetworkManager.ThrowException(new NetworkCommunicationException(netPath.TargetNodeName, ReplayStrings.NetworkSecurityFailed));
                }
                ExTraceGlobals.TcpClientTracer.TraceDebug <long, bool, ProtectionLevel>(0L, "Authenticated Connection took {0}ms. Encrypt={1} ProtRequested={2}", replayStopwatch.ElapsedMilliseconds, negotiateStream.IsEncrypted, protectionLevel);
                channel = new TcpClientChannel(netPath.TargetNodeName, socket, negotiateStream, timeoutInMs);
                return(true);
            }
            catch (SocketException ex2)
            {
                ex = ex2;
            }
            catch (IOException ex3)
            {
                ex = ex3;
            }
            catch (AuthenticationException ex4)
            {
                ex = ex4;
            }
            catch (NetworkTransportException ex5)
            {
                ex = ex5;
            }
            finally
            {
                if (channel == null)
                {
                    if (negotiateStream != null)
                    {
                        negotiateStream.Dispose();
                    }
                    else if (stream != null)
                    {
                        stream.Dispose();
                    }
                    if (socket != null)
                    {
                        socket.Close();
                    }
                }
                else
                {
                    ReplayCrimsonEvents.NetworkConnectionSuccess.Log <string, IPEndPoint, IPEndPoint>(netPath.TargetNodeName, netPath.TargetEndPoint, channel.LocalEndpoint);
                }
            }
            ExTraceGlobals.TcpClientTracer.TraceError <Exception>(0L, "TryOpenChannel failed. Ex={0}", ex);
            ReplayCrimsonEvents.NetworkConnectionFailure.Log <string, IPEndPoint, IPEndPoint, string>(netPath.TargetNodeName, netPath.TargetEndPoint, netPath.SourceEndPoint, ex.ToString());
            if (ex is NetworkTransportException)
            {
                networkEx = (NetworkTransportException)ex;
            }
            else
            {
                networkEx = new NetworkCommunicationException(netPath.TargetNodeName, ex.Message, ex);
            }
            return(false);
        }
Example #26
0
            // обмен данными с сервером в формате XML
            // nCom - номер команды
            // sPar1
            // nTOutRead - таймаут на ожидание ответа от сервера
            public string ExchgSrv(string nCom, string sPar1, string sDop,
                                   LoadFromSrv dgRead, DataSet dsTrans, ref int ret, int nTOutRead, int nBufSize)
            {
                string
                    sOutFileXML = "",
                    sC,
                    sHost,
                    sAdr,
                    sErr;
                int
                    nPort;

                SocketStream.ASRWERROR
                    nRErr;

                System.IO.Stream
                    stm = null;

                ret       = AppC.RC_CANCEL;
                ServerRet = AppC.EMPTY_INT;
                if (xMF.xCLoad != null)
                {
                    xMF.xCLoad.xLastSE      = this;
                    xMF.xCLoad.sFileFromSrv = "";
                }


                SelSrvPort(nCom, sPar1, out sHost, out nPort);
                sAdr = sHost + ":" + nPort.ToString();
                sErr = sAdr + "-нет соединения!";

                Cursor.Current = Cursors.WaitCursor;

                try
                {
                    CurSocket = new SocketStream(sHost, nPort);
                    if (!TestConn(false, xMF.xBCScanner, xMF.xFPan))
                    {
                        TraiceWiFi(sErr);
                        //throw new System.Net.Sockets.SocketException(11053);
                    }
                    else
                    {
                        //MessageBox.Show("Good reset!");
                    }

                    //TraiceWiFi(nCom + " - перед Connect");
                    stm = CurSocket.Connect();

                    // поток создан, отправка команды
                    sErr = sAdr + "-команда не отправлена";
                    byte[] baCom = SetCommand2Srv(nCom, sPar1, sDop);
                    //stm.Write(baCom, 0, baCom.Length);
                    //stm.Write(AppC.baTermCom, 0, AppC.baTermCom.Length);

                    // 20 секунд на запись команды
                    CurSocket.ASWriteS.TimeOutWrite = 1000 * 10;
                    CurSocket.ASWriteS.BeginAWrite(baCom, baCom.Length);

                    if ((dsTrans != null) || (XMLPars != null))
                    {// передача данных при выгрузке
                     //sErr = sAdr + "-ошибка выгрузки";
                     //dsTrans.WriteXml(stm, XmlWriteMode.IgnoreSchema);
                     //sErr = sAdr + "-ошибка завершения";

                        sErr = sAdr + "-ошибка выгрузки";
                        MemoryStream mst = new MemoryStream();
                        if (dsTrans != null)
                        {
                            dsTrans.WriteXml(mst, XmlWriteMode.IgnoreSchema);
                        }

                        if (XMLPars != null)
                        {
                            mst.Write(XMLPars, 0, XMLPars.Length);
                        }

                        // терминатор сообщения
                        mst.Write(AppC.baTermMsg, 0, AppC.baTermMsg.Length);

                        byte[] bm1 = mst.ToArray();
                        mst.Close();
                        // 60 секунд на запись данных
                        CurSocket.ASWriteS.TimeOutWrite = 1000 * 180;
                        CurSocket.ASWriteS.BeginAWrite(bm1, bm1.Length);
                    }
                    else
                    {
                        sErr = sAdr + "-ошибка завершения";
                        // 10 секунд на запись терминатора сообщения
                        CurSocket.ASWriteS.TimeOutWrite = 1000 * 30;
                        // терминатор сообщения
                        CurSocket.ASWriteS.BeginAWrite(AppC.baTermMsg, AppC.baTermMsg.Length);
                    }


                    //int nCommLen = 0;
                    //byte[] bAns = ReadAnswerCommand(stm, ref nCommLen);
                    //sC = Encoding.UTF8.GetString(bAns, 0, nCommLen - AppC.baTermCom.Length);

                    sErr = sAdr + "-нет ответа сервера!";
                    // 120 секунд на чтение ответа
                    //m_ssExchg.ASReadS.TimeOutRead = 1000 * 120;

                    //m_ssExchg.ASReadS.BufSize = 256;
                    //nRErr = m_ssExchg.ASReadS.BeginARead(bUseFileAsBuf, 1000 * nTOutRead);

                    if (nBufSize > 0)
                    {
                        CurSocket.ASReadS.BufSize = nBufSize;
                    }
                    nRErr = CurSocket.ASReadS.BeginARead(1000 * nTOutRead);

                    switch (nRErr)
                    {
                    case SocketStream.ASRWERROR.RET_FULLBUF:       // переполнение буфера
                        sErr = " длинная команда";
                        throw new System.Net.Sockets.SocketException(10061);

                    case SocketStream.ASRWERROR.RET_FULLMSG:       // сообщение полностью получено
                        sC = CurSocket.ASReadS.GetMsg();
                        break;

                    default:
                        TraiceWiFi("Сетевая ошибка (чтение ответа)");
                        throw new System.Net.Sockets.SocketException(10061);
                    }


                    sErr = sAdr + "-ошибка чтения";
                    //Dictionary<string, string> aComm = SrvCommandParse(sC);
                    ServerAnswer = Srv.SrvAnswerParParse(sC);

                    SyncTimeWithSrv();

                    if (ServerAnswer.ContainsKey("PAR"))
                    {
                        StringAnsPars = ServerAnswer["PAR"];
                        StringAnsPars = StringAnsPars.Substring(1, StringAnsPars.Length - 2);
                        AnswerPars    = Srv.SrvAnswerParParse(StringAnsPars, new char[] { ',' });
                    }


                    //TraiceWiFi("Ответ получен...");
                    ServerRet = int.Parse(ServerAnswer["RET"]);

                    if ((ServerAnswer["COM"] == nCom) &&
                        ((ServerRet == AppC.RC_OK) ||
                         (ServerRet == AppC.RC_NEEDPARS) ||
                         (ServerRet == AppC.RC_HALFOK)))
                    {
                        CurSocket.ASReadS.OutFile = "";
                        if (ServerRet == AppC.RC_NEEDPARS)
                        {
                            CurSocket.ASReadS.TermDat = AppC.baTermMsg;
                            if (CurSocket.ASReadS.BeginARead(true, 1000 * nTOutRead) == SocketStream.ASRWERROR.RET_FULLMSG)
                            {
                                //TraiceWiFi("Доп.Данные получены...");
                                sOutFileXML = CurSocket.ASReadS.OutFile;
                            }
                            else
                            {
                                TraiceWiFi("Сетевая ошибка (чтение данных)");
                                throw new System.Net.Sockets.SocketException(10061);
                            }
                        }

                        if (dgRead != null)
                        {
                            dgRead(CurSocket, ServerAnswer, dsTrans, ref sErr, ServerRet);
                        }
                        try
                        {
                            sErr = ServerAnswer["MSG"];
                        }
                        catch { sErr = "OK"; }
                        //dgRead(m_ssExchg, aComm, dsTrans, ref sErr, nRetSrv);
                        //else
                        //{
                        //    sErr = "OK";
                        //}
                    }
                    else
                    {
                        if (ServerAnswer["MSG"] != "")
                        {
                            sErr = ServerAnswer["MSG"];
                        }
                        else
                        {
                            sErr = sAdr + "\n Отложено выполнение";
                        }
                    }
                    ret = ServerRet;
                }
                catch (Exception e)
                {
                    //sC = e.Message;
                    sErr = e.Message;
                    TraiceWiFi(sErr);
                    ret = 3;
                }
                finally
                {
                    CurSocket.Disconnect();
                    Cursor.Current = Cursors.Default;
                    if (ServerRet == AppC.RC_NEEDPARS)
                    {
                        if (Srv.ExchangeContext.ExchgReason == AppC.EXCHG_RSN.NO_EXCHG)
                        {
                            Srv.ExchangeContext.ExchgReason = AppC.EXCHG_RSN.SRV_INIT;
                            Srv.ExchangeContext.CMD_EXCHG   = nCom;
                            DialogResult xDRslt = xMF.CallDllForm(xMF.sExeDir + "SGPF-Univ.dll", true,
                                                                  new object[] { this, nCom, AppC.R_PARS, sOutFileXML });
                            Srv.ExchangeContext.ExchgReason = AppC.EXCHG_RSN.NO_EXCHG;
                            if (xDRslt == DialogResult.OK)
                            {
                            }
                        }
                    }
                }
                return(sErr);
            }
Example #27
0
 public async ValueTask SendPingAsync()
 {
     var pingPacket    = GetPingPacket();
     var packageToSend = TcpSerializer.Serialize(pingPacket);
     await SocketStream.WriteAsync(packageToSend);
 }
Example #28
0
        private async Task ProcessMessages()
        {
            Log?.LogInformation($"Connected from {RemoteAddress.ToString(true)}");
            using (var collector = new FtpCommandCollector(() => Encoding))
            {
                await WriteAsync(new FtpResponse(220, "FTP Server Ready"), _cancellationTokenSource.Token).ConfigureAwait(false);

                var buffer = new byte[1024];
                try
                {
                    Task <int> readTask = null;
                    for (; ;)
                    {
                        if (readTask == null)
                        {
                            readTask = SocketStream.ReadAsync(buffer, 0, buffer.Length, _cancellationTokenSource.Token);
                        }

                        var tasks = new List <Task>()
                        {
                            readTask
                        };
                        if (_activeBackgroundTask != null)
                        {
                            tasks.Add(_activeBackgroundTask);
                        }

                        Debug.WriteLine($"Waiting for {tasks.Count} tasks");
                        var completedTask = Task.WaitAny(tasks.ToArray(), _cancellationTokenSource.Token);
                        Debug.WriteLine($"Task {completedTask} completed");
                        if (completedTask == 1)
                        {
                            var response = _activeBackgroundTask?.Result;
                            if (response != null)
                            {
                                Write(response);
                            }

                            _activeBackgroundTask = null;
                        }
                        else
                        {
                            var bytesRead = readTask.Result;
                            readTask = null;
                            if (bytesRead == 0)
                            {
                                break;
                            }

                            var commands = collector.Collect(buffer, 0, bytesRead);
                            foreach (var command in commands)
                            {
                                await ProcessMessage(command).ConfigureAwait(false);
                            }
                        }
                    }
                }
                catch (OperationCanceledException)
                {
                    // Ignore the OperationCanceledException
                    // This is normal during disconnects
                }
                catch (Exception ex)
                {
                    Log?.LogError(ex, "Failed to process connection");
                }
                finally
                {
                    Log?.LogInformation($"Disconnection from {RemoteAddress.ToString(true)}");
                    _closed = true;
                    Data.BackgroundCommandHandler.Cancel();
                    if (!ReferenceEquals(SocketStream, OriginalStream))
                    {
                        SocketStream.Dispose();
                        SocketStream = OriginalStream;
                    }
                    _socket.Dispose();
                    OnClosed();
                }
            }
        }
 public FitSocket(SocketModel socket, ProgressReporter reporter)
 {
     socketStream  = new SocketStream(socket);
     this.reporter = reporter;
     this.socket   = socket;
 }