Ejemplo n.º 1
0
 /// <summary>
 /// 发送一个数据库操作请求。如果发送成功返回true,否则返回false
 /// </summary>
 /// <param name="userModel">用户对象</param>
 /// <param name="operation">操作类型</param>
 /// <param name="parameter">操作参数</param>
 public bool SendDatabaseRequest(User user, string operation, string parameter)
 {
     if (ClientState)
     {
         byte[] buffer = BytesConvert.ObjectToBytes(new Transmit()
         {
             SourceID  = ClientID,
             TargetID  = ClientID,
             DataType  = DataType.Request,
             Parameter = $"Database;{operation},{parameter}",
             Object    = user
         });
         SocketAsyncEventArgs args = new SocketAsyncEventArgs();
         try
         {
             args.SetBuffer(buffer, 0, buffer.Length);
             clientSocket.SendAsync(args);
             return(true);
         }
         catch (Exception exception)
         {
             ClientError?.Invoke(this, new ClientErrorEventArgs(exception, "在发送请求时发生错误"));
         }
         finally
         {
             args.Dispose();
         }
     }
     return(false);
 }
Ejemplo n.º 2
0
 /// <summary>
 /// 异步的发送文本消息。如果发送成功返回true,否则返回false
 /// </summary>
 /// <param name="targetUserID">目标用户ID</param>
 /// <param name="message">文本消息</param>
 public async Task <bool> SendTextAsync(string targetUserID, string message)
 {
     if (ClientState && targetUserID != null && message != null)
     {
         return(await Task.Run <bool>(() =>
         {
             byte[] buffer = BytesConvert.ObjectToBytes(new Transmit()
             {
                 SourceID = ClientID,
                 TargetID = targetUserID,
                 DataType = DataType.Text,
                 Parameter = message
             });
             try
             {
                 clientSocket.Send(buffer, buffer.Length, SocketFlags.None);
                 return true;
             }
             catch (Exception exception)
             {
                 ClientError?.Invoke(this, new ClientErrorEventArgs(exception, "在发送文本消息时发生错误"));
                 return false;
             }
         }));
     }
     return(false);
 }
Ejemplo n.º 3
0
 /// <summary>
 /// 异步的发送图片。如果发送成功返回true,否则返回false
 /// </summary>
 /// <param name="targetUserID">目标ID</param>
 /// <param name="imagePath">图片路径</param>
 public async Task <bool> SendImageAsync(string targetUserID, string imagePath)
 {
     if (ClientState && targetUserID != null && imagePath != null)
     {
         return(await Task.Run <bool>(() =>
         {
             FileStream fileStream = null;              //文件流
             byte[] dataBuffer = new byte[1024 * 1024]; //数据缓冲区
             try
             {
                 fileStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read);
                 if (fileStream.Length == 0)
                 {
                     return false;
                 }
                 byte[] buffer = BytesConvert.ObjectToBytes(new Transmit()
                 {
                     SourceID = ClientID,
                     TargetID = targetUserID,
                     DataType = DataType.Image,
                     Parameter = $"{Path.GetFileName(imagePath)};{fileStream.Length}"
                 });
                 clientSocket.Send(buffer, buffer.Length, SocketFlags.None);
                 Thread.Sleep(100);
                 while (true)
                 {
                     int readBytes = fileStream.Read(dataBuffer, 0, dataBuffer.Length);
                     if (readBytes <= 0)
                     {
                         break;
                     }
                     clientSocket.Send(dataBuffer, readBytes, SocketFlags.None);
                     Thread.Sleep(10);
                 }
             }
             catch (Exception exception)
             {
                 ClientError?.Invoke(this, new ClientErrorEventArgs(exception, "在发送图片时发生错误"));
                 return false;
             }
             finally
             {
                 fileStream?.Close();
                 fileStream?.Dispose();
                 fileStream = null;
             }
             return true;
         }));
     }
     return(false);
 }
Ejemplo n.º 4
0
        public void Test2()
        {
            Aes.Create().Then(_ =>
            {
                _.SetEmptyIV();
                _.Key = "1234567890123456".Bytes(Encoding.ASCII);

                Assert.Equal("0c66182ec710840065ebaa47c5e6ce90",
                             _.Encrypt <AesEmptyIVCombiner>("123".Bytes(Encoding.UTF8)).Flow(BytesFlow.HexString));
            });

            Aes.Create().Then(_ =>
            {
                var now       = DateTime.Now.ToString();
                var flow      = new Flow <byte[], string>(x => BytesConvert.Base64(_.Encrypt(x)));
                var encrypted = _.Encrypt(now.ToString().Bytes(Encoding.UTF8)).Flow(BytesFlow.Base64);
                Assert.Equal(now, _.Decrypt(encrypted.Flow(BytesFlow.FromBase64)).String(Encoding.UTF8));
            });
        }
Ejemplo n.º 5
0
        /// <summary>
        /// Generate one or more sentinal files
        /// </summary>
        /// <returns>int number of failures</returns>
        static int Genfiles()
        {
            int rc = 0;

            foreach (FileRecord File in config.Files)
            {
                if (File.Sentinal) // only generate for files where Sentinal is true
                {
                    if (System.IO.File.Exists(File.Path))
                    {
                        Console.WriteLine("Failure: '" + File.Path + "' already exists ");
                        rc++;
                        continue;
                    }


                    Sentinal s      = new Sentinal(File.Path);
                    int      length = File.GetLength();

                    if (length == 0)
                    {
                        s.Length = new Random().Next(4, 32768) * 1024;  // set a random size if not specified
                    }
                    else
                    {
                        s.Length = length;
                    }


                    try
                    {
                        if (s.GenerateType1())
                        {
                            Console.WriteLine("Success: '" + s.Path + "' Generated, " + BytesConvert.ToString(s.Length));
                        }
                        else
                        {
                            Console.WriteLine("Something wierd happened attempting to write '" + File.Path);  // shouldnt be here
                        }
                        // there should have been an execption if anything went wrong in s.Generate().
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("301 Error writing file: " + " " + e.Message);
                        rc++;
                    }
                }
            }

            Console.WriteLine("RC=" + rc);
            return(rc);
        }
Ejemplo n.º 6
0
 internal override string GetCommandLogString()
 {
     return($"{Arg.Handle} {Arg.Datalen} ({BytesConvert.ToHexString(Arg.Data)})");
 }
Ejemplo n.º 7
0
 public static string HexString(byte[] bytes) => BytesConvert.ToHexString(bytes);
Ejemplo n.º 8
0
        /// <summary>
        /// 接收数据
        /// </summary>
        /// <param name="socket">客户端Socket对象</param>
        private void ReceiveMessage(Socket socket)
        {
            bool isMain = true;                                              //是否为主端口

            string     clientID         = string.Empty;                      //客户端ID
            IPEndPoint clientIPEndPoint = (IPEndPoint)socket.RemoteEndPoint; //客户端网络终结点

            bool isFirstConnection = true;                                   //是否为首次连接

            byte[] dataBuffer = new byte[1024 * 1024];                       //缓冲区

            bool     isFirstReceive = true;                                  //是否为首次接收数据
            Transmit transmit       = null;                                  //传输对象
            double   dataSize       = 0.0;                                   //数据总大小
            double   receiveBytes   = 0.0;                                   //已接收的字节数
            int      targetPort     = -1;                                    //发送目标端口

            while (true)
            {
                int readBytes = 0;
                if (socket.Poll(-1, SelectMode.SelectRead) == true)
                {
                    if (!ServerState)
                    {
                        break;
                    }
                    try
                    {
                        readBytes = socket.Receive(dataBuffer, dataBuffer.Length, SocketFlags.None);
                        if (readBytes == 0)
                        {
                            if (isMain)
                            {
                                CloseClient(clientID);
                                break;
                            }
                            CloseClientPort(clientID, clientIPEndPoint.Port);
                            break;
                        }
                    }
                    catch (Exception exception)
                    {
                        if (isMain)
                        {
                            CloseClient(clientID, false, exception);
                            break;
                        }
                        CloseClientPort(clientID, clientIPEndPoint.Port, false, exception);
                        break;
                    }
                }

                //首次连接
                if (isFirstConnection)
                {
                    isFirstConnection = false;
                    clientID          = Encoding.UTF8.GetString(dataBuffer, 0, readBytes);
                    if (clientCollection.AddClient(clientID, clientIPEndPoint, socket))
                    {
                        ServerMessage?.Invoke(this, new ServerNotifyEventArgs($"客户端 {clientID}({clientIPEndPoint}) 已连接"));
                    }
                    else
                    {
                        if (!clientCollection.AddPort(clientID, clientIPEndPoint.Port, socket))
                        {
                            break;
                        }
                        isMain = false;
                        ServerMessage?.Invoke(this, new ServerNotifyEventArgs($"客户端 {clientID} 的 {clientIPEndPoint.Port} 端口已连接"));
                    }
                    socket.Send(new byte[] { 1 });
                    continue;
                }

                //首次接收数据
                if (isFirstReceive)
                {
                    isFirstReceive = false;
                    transmit       = BytesConvert.BytesToObject(dataBuffer, readBytes, "MiniSocket.Transmitting") as Transmit;
                    if (transmit?.Parameter == null)
                    {
                        ResetParameter(ref isFirstReceive, ref transmit, ref dataSize, ref receiveBytes);
                        continue;
                    }

                    if (isMain)
                    {
                        string[] parameters = transmit.Parameter.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                        switch (transmit.DataType)
                        {
                        case DataType.Text:
                            if (!Forward(transmit, dataBuffer, readBytes))
                            {
                                return;
                            }
                            break;

                        case DataType.Image:
                            if (parameters.Length == 2)
                            {
                                if (double.TryParse(parameters[1], out dataSize))
                                {
                                    if (!Forward(transmit, dataBuffer, readBytes))
                                    {
                                        return;
                                    }
                                    continue;
                                }
                            }
                            break;

                        case DataType.Request:
                            if (transmit.Parameter.StartsWith("Database"))
                            {
                                if (parameters.Length == 2)
                                {
                                    var result = DatabaseRequest?.Invoke(this, new DatabaseEventArgs(parameters[1], transmit.Object))?.Result;
                                    if (result != null)
                                    {
                                        transmit.Parameter = "Client;RequestResult";
                                        transmit.Object    = result;
                                        byte[] buffer = BytesConvert.ObjectToBytes(transmit);
                                        if (!Forward(transmit, buffer, buffer.Length))
                                        {
                                            return;
                                        }
                                    }
                                }
                            }
                            break;
                        }
                        ResetParameter(ref isFirstReceive, ref transmit, ref dataSize, ref receiveBytes);
                        continue;
                    }
                    if (transmit.DataType == DataType.File)
                    {
                        string[] parameters = transmit.Parameter.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                        if (parameters.Length == 2)
                        {
                            if (double.TryParse(parameters[1], out dataSize))
                            {
                                Transmit requestTransmit = new Transmit()
                                {
                                    SourceID  = transmit.SourceID,
                                    TargetID  = transmit.TargetID,
                                    DataType  = DataType.Request,
                                    Parameter = "Client;AddSocket"
                                };
                                byte[] buffer = BytesConvert.ObjectToBytes(requestTransmit);
                                if (!Forward(requestTransmit, buffer, buffer.Length))
                                {
                                    return;
                                }
                                Thread.Sleep(3000);
                                List <Socket> sockets = clientCollection.GetClientSockets(transmit.TargetID);
                                targetPort = ((IPEndPoint)sockets[sockets.Count - 1].RemoteEndPoint).Port;
                                if (!Forward(transmit, dataBuffer, readBytes, targetPort))
                                {
                                    return;
                                }
                                continue;
                            }
                        }
                    }
                    CloseClientPort(clientID, clientIPEndPoint.Port);
                    return;
                }

                receiveBytes += readBytes; //已接收到的数据累加

                //判断已接收到的数据是否有效
                if (receiveBytes > 0 && receiveBytes <= dataSize)
                {
                    if (!Forward(transmit, dataBuffer, readBytes, targetPort))
                    {
                        break;
                    }
                }
                //判断是否接收完成或数据是否有误
                if (receiveBytes == dataSize || (receiveBytes <= 0 || receiveBytes > dataSize))
                {
                    if (isMain)
                    {
                        ResetParameter(ref isFirstReceive, ref transmit, ref dataSize, ref receiveBytes);
                        continue;
                    }
                    CloseClientPort(clientID, clientIPEndPoint.Port);
                    break;
                }
            }
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 辅助接收器
        /// </summary>
        /// <param name="socket">客户端Socket对象</param>
        private void SecondaryReceiver(Socket socket)
        {
            if (socket == null)
            {
                return;
            }

            byte[] dataBuffer = new byte[1024 * 1024]; //数据缓冲区

            bool     isFirstReceive = true;            //是否为首次接收数据
            Transmit transmit       = null;            //传输对象
            double   dataSize       = 0.0;             //数据总大小
            double   receiveBytes   = 0.0;             //已接收的字节数

            while (true)
            {
                int readBytes = 0;
                if (socket.Poll(15000000, SelectMode.SelectRead))
                {
                    if (!ClientState)
                    {
                        break;
                    }
                    try
                    {
                        readBytes = socket.Receive(dataBuffer, dataBuffer.Length, SocketFlags.None);
                        if (readBytes == 0)
                        {
                            socketManager.CloseConnection(socket);
                            break;
                        }
                    }
                    catch
                    {
                        socketManager.CloseConnection(socket);
                        break;
                    }
                }
                else
                {
                    socketManager.CloseConnection(socket);
                    break;
                }

                //首次接收数据
                if (isFirstReceive)
                {
                    isFirstReceive = false;
                    transmit       = BytesConvert.BytesToObject(dataBuffer, readBytes, "MiniSocket.Transmitting") as Transmit;
                    if (transmit?.Parameter != null)
                    {
                        string[] parameters = transmit.Parameter.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                        if (parameters.Length == 2)
                        {
                            if (double.TryParse(parameters[1], out dataSize))
                            {
                                continue;
                            }
                        }
                    }
                    socketManager.CloseConnection(socket);
                    break;
                }

                receiveBytes += readBytes; //已接收到的数据累加

                //判断已接收到的数据是否有效
                if (receiveBytes > 0 && receiveBytes <= dataSize)
                {
                    ReceiveDataHandler(transmit, dataBuffer, readBytes);
                }
                //判断是否接收完成或数据是否有误
                if (receiveBytes == dataSize || (receiveBytes <= 0 || receiveBytes > dataSize))
                {
                    socketManager.CloseConnection(socket);
                    break;
                }
            }
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 主接收器
        /// </summary>
        private void MainReceiver()
        {
            byte[] dataBuffer = new byte[1024 * 1024]; //数据缓冲区

            bool     isFirstReceive = true;            //是否为首次接收数据
            Transmit transmit       = null;            //传输对象
            double   dataSize       = 0.0;             //数据总大小
            double   receiveBytes   = 0.0;             //已接收的字节数

            while (true)
            {
                int readBytes = 0;
                if (clientSocket.Poll(-1, SelectMode.SelectRead))
                {
                    if (!ClientState)
                    {
                        break;
                    }
                    try
                    {
                        readBytes = clientSocket.Receive(dataBuffer, dataBuffer.Length, SocketFlags.None);
                        if (readBytes == 0)
                        {
                            CloseClient();
                            ClientMessage?.Invoke(this, new ClientNotifyEventArgs("服务器断开连接"));
                            break;
                        }
                    }
                    catch (Exception exception)
                    {
                        CloseClient();
                        ClientMessage?.Invoke(this, new ClientNotifyEventArgs("服务器断开连接"));
                        ClientError?.Invoke(this, new ClientErrorEventArgs(exception, "服务器意外的断开连接"));
                        break;
                    }
                }

                //首次接收数据
                if (isFirstReceive)
                {
                    isFirstReceive = false;
                    transmit       = BytesConvert.BytesToObject(dataBuffer, readBytes, "MiniSocket.Transmitting") as Transmit;
                    if (transmit?.Parameter != null)
                    {
                        switch (transmit.DataType)
                        {
                        case DataType.Text:
                            ReceiveDataHandler(transmit, null, 0);
                            break;

                        case DataType.Image:
                            string[] parameters = transmit.Parameter.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
                            if (parameters.Length == 2)
                            {
                                if (double.TryParse(parameters[1], out dataSize))
                                {
                                    continue;
                                }
                            }
                            break;

                        case DataType.Request:
                            ReceiveRequestHandler(transmit);
                            break;
                        }
                    }
                    ResetParameter(ref isFirstReceive, ref transmit, ref dataSize, ref receiveBytes);
                    continue;
                }

                receiveBytes += readBytes; //已接收到的数据累加

                //判断已接收到的数据是否有效
                if (receiveBytes > 0 && receiveBytes <= dataSize)
                {
                    ReceiveDataHandler(transmit, dataBuffer, readBytes);
                }
                //判断是否接收完成或数据是否有误
                if (receiveBytes == dataSize || (receiveBytes <= 0 || receiveBytes > dataSize))
                {
                    ResetParameter(ref isFirstReceive, ref transmit, ref dataSize, ref receiveBytes);
                    continue;
                }
            }
        }
Ejemplo n.º 11
0
        /// <summary>
        /// 异步的发送文件。如果发送成功返回true,否则返回false
        /// </summary>
        /// <param name="targetUserID">目标ID</param>
        /// <param name="filePath">文件路径</param>
        public async Task <bool> SendFileAsync(string targetUserID, string filePath)
        {
            if (ClientState && targetUserID != null && filePath != null)
            {
                return(await Task.Run <bool>(async() =>
                {
                    FileStream fileStream = null;              //文件流
                    byte[] dataBuffer = new byte[1024 * 1024]; //数据缓冲区
                    try
                    {
                        fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                        if (fileStream.Length == 0)
                        {
                            return false;
                        }
                        byte[] buffer = BytesConvert.ObjectToBytes(new Transmit()
                        {
                            SourceID = ClientID,
                            TargetID = targetUserID,
                            DataType = DataType.File,
                            Parameter = $"{Path.GetFileName(filePath)};{fileStream.Length}"
                        });
                        SocketResult socketResult = await socketManager.CreateConnectionAsync();
                        switch (socketResult.State)
                        {
                        case ConnectionState.Success:
                            socketResult.Socket.Send(buffer, buffer.Length, SocketFlags.None);
                            break;

                        case ConnectionState.Failed:
                            throw new ArgumentException("服务器拒绝连接");

                        case ConnectionState.Timeout:
                            throw new ArgumentException("服务器连接超时");

                        case ConnectionState.Error:
                            throw socketResult.Exception;
                        }
                        Thread.Sleep(5000);
                        while (true)
                        {
                            int readBytes = fileStream.Read(dataBuffer, 0, dataBuffer.Length);
                            if (readBytes <= 0)
                            {
                                break;
                            }
                            socketResult.Socket.Send(dataBuffer, readBytes, SocketFlags.None);
                            Thread.Sleep(10);
                        }
                    }
                    catch (Exception exception)
                    {
                        ClientError?.Invoke(this, new ClientErrorEventArgs(exception, "在发送文件时发生错误"));
                        return false;
                    }
                    finally
                    {
                        fileStream?.Close();
                        fileStream?.Dispose();
                        fileStream = null;
                    }
                    return true;
                }));
            }
            return(false);
        }
Ejemplo n.º 12
0
 internal override string GetCommandLogString()
 {
     return($"{Arg.Handle} {Arg.Ipaddr} {Arg.Port} {(char)Arg.Sec} {Arg.Datalen} ({BytesConvert.ToHexString(Arg.Data)})");
 }
Ejemplo n.º 13
0
        public LANClient(ILogger <LANClient> logger)
        {
            var selfAddresses = NetworkInterface.GetAllNetworkInterfaces().SelectMany(ni => ni.GetIPProperties().UnicastAddresses.Select(ua => ua.Address.ToString()));

            _logger = logger;
            try
            {
                receiveUdpClient = new UdpClient(DefaultUdpPort)
                {
                    EnableBroadcast = true
                };
            }
            catch (Exception ex)
            {
                _logger.LogDebug(ex, "Exception");
                throw;
            }
            Task.Run(async() =>
            {
                try
                {
                    while (true)
                    {
                        var receivedResults = await receiveUdpClient.ReceiveAsync();
                        if (selfAddresses.Contains(receivedResults.RemoteEndPoint.Address.ToString()))
                        {
                            //ブロードキャストを自分で受信(無視)
                            continue;
                        }
                        _logger.LogDebug($"UDP受信:{receivedResults.RemoteEndPoint.Address.ToString()} {BytesConvert.ToHexString(receivedResults.Buffer)}");
                        OnEventReceived?.Invoke(this, (receivedResults.RemoteEndPoint.Address.ToString(), receivedResults.Buffer));
                    }
                }
                catch (System.ObjectDisposedException)
                {
                    //握りつぶす
                }
                catch (Exception ex)
                {
                    _logger.LogDebug(ex, "Exception");
                }
            });
        }