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

11 篇文章 0 订阅

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));
            }
        }
    }
}

 

 

多客户端连接参考

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C#基于Socket的TCP编程是一种常见的网络编程技术,它允许应用程序通过TCP/IP协议与远程服务器进行通信。在C#中,可以使用System.Net.Sockets命名空间中的TcpClient和TcpListener类来实现TCP连接的建立和监听。 要建立TCP连接,首先需要创建一个TcpClient对象,并指定要连接的服务器的IP地址和端口号。然后可以使用TcpClient的Connect方法来建立连接。一旦连接建立成功,就可以使用TcpClient提供的网络流进行数据的发送和接收。 以下是一个简单的C#代码示例,演示了基于Socket的TCP编程中的客户端和服务器端的交互: 客户端: ```csharp using System; using System.Net.Sockets; public class TcpClientExample { public static void Main() { string serverIP = "127.0.0.1"; int serverPort = 8888; try { TcpClient client = new TcpClient(serverIP, serverPort); // 获取网络流 NetworkStream stream = client.GetStream(); // 发送数据 string message = "Hello, server!"; byte[] data = System.Text.Encoding.UTF8.GetBytes(message); stream.Write(data, 0, data.Length); // 接收数据 data = new byte[256]; int bytesRead = stream.Read(data, 0, data.Length); string response = System.Text.Encoding.UTF8.GetString(data, 0, bytesRead); Console.WriteLine("Server response: " + response); // 关闭连接 client.Close(); } catch (Exception e) { Console.WriteLine("Error: " + e.Message); } } } ``` 服务器端: ```csharp using System; using System.Net; using System.Net.Sockets; public class TcpServerExample { public static void Main() { int serverPort = 8888; try { TcpListener server = new TcpListener(IPAddress.Any, serverPort); // 开始监听 server.Start(); Console.WriteLine("Server started. Waiting for clients..."); // 接受客户端连接 TcpClient client = server.AcceptTcpClient(); Console.WriteLine("Client connected."); // 获取网络流 NetworkStream stream = client.GetStream(); // 接收数据 byte[] data = new byte[256]; int bytesRead = stream.Read(data, 0, data.Length); string request = System.Text.Encoding.UTF8.GetString(data, 0, bytesRead); Console.WriteLine("Client request: " + request); // 发送数据 string response = "Hello, client!"; data = System.Text.Encoding.UTF8.GetBytes(response); stream.Write(data, 0, data.Length); // 关闭连接 client.Close(); server.Stop(); } catch (Exception e) { Console.WriteLine("Error: " + e.Message); } } } ``` 以上代码演示了一个简单的TCP客户端和服务器端的交互过程。客户端向服务器发送一条消息,服务器接收到消息后,返回一条响应给客户端。可以根据实际需求进行扩展和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值