C# 基于socket的远程cmd命令执行Demo

本文提供了一个C#基于Socket实现的远程CMD命令执行的示例,包括服务端接收并执行客户端发送的命令,以及客户端如何发送命令。适合理解Socket通信和远程控制的开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

socket demo

服务端直接执行客户端发来的命令

服务端

using System;
using System.Diagnostics;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace SocketServer
{
    internal class Program
    {
        private static Socket severSocket = null;

        private static void Main(string[] args)
        {
            severSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 19999);
            severSocket.Bind(endPoint);                 // 绑定
            severSocket.Listen(1);                     // 设置最大连接数
            Console.WriteLine("开始监听");
            //Console.WriteLine("进程ID"+Process.GetCurrentProcess().Id);
            Thread thread = new Thread(ListenClientConnect);        // 开启线程监听客户端连接
            thread.Start("连接成功");
        }

        private static Socket clientSocket;

        /// <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)
        {
            string msg = "";
            Process 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();
            p.StandardInput.WriteLine(cmd);
            p.StandardInput.WriteLine("exit");
            String strRst = p.StandardOutput.ReadToEnd(); //获取cmd处理输出信息
            String error = p.StandardError.ReadToEnd(); //获取错误信息
            msg += strRst + error;
            Console.WriteLine(msg);
            p.Dispose();
            clientSocket.Send(Encoding.Default.GetBytes(msg));
        }
    }
}

客户端

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

namespace SocketClient
{
    internal class Program
    {
        private static Socket clientSocket = null;

        private static void Main(string[] args)
        {
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            // 客户端不需要绑定, 需要连接
            IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 19999);   //服务端IP和端口
            clientSocket.Connect(endPoint);
            Console.WriteLine("连接到服务器");
            Receive();
            Console.ReadKey();
        }

        private static void Receive()
        {
            byte[] buffer = new byte[1024];
            string cmd = "";
            while ("exit" != cmd)
            {
                Array.Clear(buffer, 0, buffer.Length);
                clientSocket.Receive(buffer);
                string msg = Encoding.Default.GetString(buffer);
                Console.WriteLine("收到消息: " + msg.Replace("\0", ""));
                Console.WriteLine("输入CMD(exit退出):");
                while ((cmd = Console.ReadLine()) == "")
                {
                    Console.WriteLine("CMD命令不能为空:");
                }
                Console.WriteLine(cmd);
                clientSocket.Send(Encoding.Default.GetBytes(cmd));
            }
        }
    }
}

 

 

多客户端连接参考

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值