private void DoReceive_Command() { byte[] data = new byte[GlobalRuntime.CommandTcpClient.Client.ReceiveBufferSize]; while (true) { receiveSignal_Command.Reset(); GlobalRuntime.CommandTcpClient.Client.BeginReceive(data, 0, data.Length, SocketFlags.None, asyncResult => { int length = 0; try { length = GlobalRuntime.CommandTcpClient.Client.EndReceive(asyncResult); } catch { return; } string command = System.Text.Encoding.Default.GetString(data, 0, length).TrimEnd("\r\n".ToCharArray()); if (NewTextMessageArrival != null) { NewTextMessageArrival.Invoke(command); } receiveSignal_Command.Set(); string[] parsedCommand = command.Split(','); string cmd = parsedCommand[0].ToLower().Trim(); switch (cmd) { case "ok": //nothing to do break; case "filelist": string[] files = parsedCommand[1].Trim().Split('|'); if (this.FileListMessageArrival != null) { this.FileListMessageArrival.Invoke(files.ToList()); } break; case "transfer-confirmed": long fileSize = long.Parse(parsedCommand[1]); if (this.FileTransferRequestConfirmed != null) { this.FileTransferRequestConfirmed.Invoke(fileSize); } confirmedLength = fileSize; SendTextMessage("Transfer-launch"); break; default: break; } }, null); receiveSignal_Command.WaitOne(); } }
private void ReadyReceive() { while (true) { receiveSignal_Command.Reset(); byte[] data = new byte[CommandTcpClient.Client.ReceiveBufferSize]; CommandTcpClient.Client.BeginReceive(data, 0, data.Length, SocketFlags.None, asyncResult => { int length = 0; try { length = CommandTcpClient.Client.EndReceive(asyncResult); if (length <= 0) //invalid command { return; } } catch { return; } string[] commands = ParseAllCommands(System.Text.Encoding.Default.GetString(data, 0, length).TrimEnd("\r\n".ToCharArray())); foreach (string command in commands) { if (command.Trim().Length == 0) { continue; } if (NewTextMessageArrival != null) { NewTextMessageArrival.Invoke(CommandTcpClient.Client.RemoteEndPoint.ToString(), command); } receiveSignal_Command.Set(); string[] parsedCommand = command.Split(','); string cmd = parsedCommand[0].ToLower().Trim(); switch (cmd) { case "hello": SendTextMessage("OK"); break; case "list": string filelist = ""; string[] files = System.IO.Directory.GetFiles(GlobalRuntime.BaseDirectory); foreach (string file in files) { filelist = file + "|" + filelist; } filelist = filelist.TrimEnd(':'); SendTextMessage("FILELIST", filelist); break; case "transfer-request": if (!File.Exists(parsedCommand[1].Trim())) { SendTextMessage("ERROR", "File not found"); break; } transfer_filePath = parsedCommand[1].Trim(); FileInfo fi = new FileInfo(parsedCommand[1].Trim()); SendTextMessage("TRANSFER-CONFIRMED", fi.Length.ToString()); break; case "transfer-launch": StartTransferFile(); break; default: SendTextMessage("ERROR", "Unknow command"); break; } } }, null); receiveSignal_Command.WaitOne(); } }