RCmd/RCmdS/Program.cs
2023-08-31 19:20:41 +08:00

151 lines
5.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Diagnostics;
using System.Net.Sockets;
using System.Net;
using System.Text;
namespace RCmdS
{
internal class Program
{
private static Socket severSocket = null;
private static Process p;
private static Queue<string> cmdResultQueue = new Queue<string>();
private static Socket clientSocket;
private static void Main(string[] args)
{
//装载启动参数
string[] CmdLineArgs = Environment.GetCommandLineArgs();
int port = 10492;
if (CmdLineArgs.Count() >= 2 && int.TryParse(CmdLineArgs[1].Trim('/').Trim(), out int result))
{
port = result;
}
else
{
Console.WriteLine("参数错误,使用默认端口。需要指定端口命令 >RCmdS <端口> ");
}
p = new Process();
p.StartInfo.FileName = "cmd.exe"; //待执行的文件路径
p.StartInfo.UseShellExecute = false; //重定向输出这个必须为false
p.StartInfo.RedirectStandardError = true; //重定向错误流
p.StartInfo.RedirectStandardInput = true; //重定向输入流
p.StartInfo.RedirectStandardOutput = true; //重定向输出流
p.StartInfo.CreateNoWindow = false; //不启动cmd黑框框
p.Start();
severSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, port);
severSocket.Bind(endPoint); // 绑定
severSocket.Listen(1); // 设置最大连接数
Console.WriteLine($"开始监听 {port}");
Thread thread = new Thread(ListenClientConnect); // 开启线程监听客户端连接
thread.Start("连接成功");
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate
{
while (true)
{
if (p != null && !p.HasExited)
{
StreamReader sr = p.StandardOutput;
string str = sr.ReadLine();
Console.WriteLine(str);
cmdResultQueue.Enqueue(str);
}
Thread.Sleep(10);
}
}));
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate
{
while (true)
{
if (p != null && !p.HasExited)
{
StreamReader sr = p.StandardError;
string str = sr.ReadLine();
Console.WriteLine(str);
cmdResultQueue.Enqueue(str);
}
//Thread.Sleep(10);
}
}));
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate
{
while (true)
{
if (clientSocket != null)
{
while (cmdResultQueue.Count > 0)
{
clientSocket.Send(Encoding.Default.GetBytes(cmdResultQueue.Dequeue()));
}
}
//Thread.Sleep(10);
}
}));
while (true)
{
string cmd = Console.ReadLine();
p.StandardInput.WriteLine(cmd);
Console.WriteLine("输出命令");
}
}
/// <summary>
/// 监听客户端连接
/// </summary>
private static void ListenClientConnect(object msg)
{
clientSocket = severSocket.Accept(); // 接收客户端连接
Console.WriteLine("客户端连接成功 信息: " + clientSocket.AddressFamily.ToString());
clientSocket.Send(Encoding.Default.GetBytes(msg.ToString()));
Thread revThread = new Thread(ReceiveClientManage);
revThread.Start(clientSocket);
}
private static void ReceiveClientManage(object clientSocket)
{
try
{
Socket socket = clientSocket as Socket;
byte[] buffer = new byte[1024];
while (true)
{
Array.Clear(buffer, 0, buffer.Length);
socket.Receive(buffer); // 从客户端接收消息
string cmd = Encoding.Default.GetString(buffer);
Console.WriteLine("收到消息:" + cmd);
cmd = cmd.Replace("\0", "");
Exec(cmd);
}
}
catch (SocketException)
{
//客户端断开重启
severSocket.Close();
severSocket.Dispose();
GC.Collect();
Process.Start(Process.GetCurrentProcess().MainModule.FileName);
Environment.Exit(0);
}
}
/// <summary>
/// 执行客户端发来的cmd命令
/// </summary>
/// <param name="cmd"></param>
private static void Exec(string cmd)
{
p.StandardInput.WriteLine(cmd);
}
}
}