C/C++ 使用Socket模拟远程CMD

本文介绍了一个简单的TCP/IP服务器和客户端程序实现。服务器端负责接收客户端连接请求、执行客户端发送的命令;客户端则可以向服务器发送命令并接收反馈。程序涵盖了Winsock库初始化、套接字创建、绑定及监听等关键步骤。

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

服务端(server)

这段代码是一个简单的TCP/IP服务器端程序,主要实现以下功能:

  1. 初始化Winsock库:通过调用 WSAStartup 函数初始化 Winsock 库,这是在 Windows 系统上进行网络编程的必要步骤。

  2. 创建套接字:使用 socket 函数创建一个套接字,该套接字用于监听客户端连接请求。

  3. 绑定本地地址:通过 bind 函数将本地地址绑定到所创建的套接字上,以在网络上标识该套接字。

  4. 进入监听模式:使用 listen 函数将套接字置入监听模式,并准备接受连接请求。

  5. 接受连接:调用 accept 函数接收客户端的连接请求,并返回一个新的套接字用于与客户端通信。

  6. 接收和处理客户端发送的数据:通过 recv 函数接收客户端发送的数据,然后使用 system 函数在本地运行接收到的命令。

  7. 循环处理:服务器程序通过一个无限循环,持续监听和处理客户端连接和数据。

#include <stdio.h>  
#include <winsock2.h>  
#pragma comment(lib,"ws2_32.lib")    //把ws2_32.lib加到Link页的连接库  
#define PORT 15001                    //通信的端口(指服务器端)
#define ERROR 0  
#define BUFFER_SIZE 1024            //注意:此Server端数据接收缓冲区 >= Client端数据发送缓冲区 ,否则造成缓冲区溢出
/*
    服务端原理:
        1、服务器进程创建套接字
        2、将本地地址绑定到所创建的套接字上,以三元组{<通信协议>,<IP地址>,<端口号>}在网络上标识该套接字
        3、将套接字置入监听模式,并准备接受连接请求
        4、接受请求之后,便可接收客户端发来的数据,并以本地DOS命令运行
*/
int main()  
{  
    WSADATA WSAData;  
    if(WSAStartup(MAKEWORD(2,0),&WSAData)==SOCKET_ERROR)  //启动winsock ,WSAStartup()函数对Winsock DLL进行初始化
    {  
        printf("Socket initialize fail!\n");  
        exit(1);  
    }  
    SOCKET sock;                                        //服务进程创建套接字句柄(用于监听)
    if((sock=socket(AF_INET,SOCK_STREAM,0))==ERROR)        //调用socket()函数创建一个流套接字,参数(网络地址类型,套接字类型,网络协议)
    { 
        printf("Socket create!\n");  
        WSACleanup();  
        exit(1);  
    }  
    struct sockaddr_in ServerAddr;            //sockaddr_in结构用来标识TCP/IP协议下的地址,可强制转换为sockaddr结构
    ServerAddr.sin_family=AF_INET;            //sin_family字段必须设为AF_INET,表示该Socket处于Internet域
    ServerAddr.sin_port=htons(PORT);        //sin_port字段用于指定服务端口,注意避免冲突
    ServerAddr.sin_addr.s_addr=INADDR_ANY;  //sin_addr字段用于把一个IP地址保存为一个4字节的数,无符号长整型,根据不同用法还可表示本地或远程IP地址
    if(bind(sock,(LPSOCKADDR)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)  //调用bind()函数将本地地址绑定到所创建的套接字上,以在网络上标识该套接字
    {   
        printf("Bind fail!\n");  
        closesocket(sock);  
        WSACleanup();  
        exit(1);  
    }  
    printf("Server Socket Port:%d\n",ntohs(ServerAddr.sin_port));  
    if(listen(sock,10)==SOCKET_ERROR)        //调用listen()函数将套接字置入监听模式并准备接受连接请求,参数(已捆绑未连接的套接字描述字,正在等待连接的最大队列长度)
    { 
        printf("Listen fail!\n");  
        closesocket(sock);  
        WSACleanup();  
        exit(1);  
    }  

    SOCKET msgsock;            //创建一个新的套接字(用于接收accept函数的返回值,即表示已经接受的那个客户端的连接,进而接收Client发来的数据)
    char buf[BUFFER_SIZE];  //数据接收缓冲区
    while(1)  
    {  
        if((msgsock=accept(sock,(LPSOCKADDR)0,(int *)0))==INVALID_SOCKET)  //进入监听状态后,调用accept()函数接收客户端的连接请求,并把连接传给msgsock套接字,原sock套接字继续监听其他客户机连接请求
        {  
            printf("Accept fail!\n");  
            continue;  
        }  
        memset(buf,0,sizeof(buf));                                            //初始化数据接收缓冲区
        recv(msgsock,buf,BUFFER_SIZE,0);                                    //接收客户端发送过来的数据  
        if(buf[0]=='e' && buf[1]=='x' && buf[2]=='i' && buf[3]=='t')        //"exit"命令,退出程序
        {  
            printf("The End.\n");  
            break;  
        }
        printf("C:\\Socket\\Server>%s",buf);  
        system(buf);                        //本地运行客户端传来的命令:这一点太厉害了,假如传一个Format命令,那服务端可能就毁了
        closesocket(msgsock);  
    }  

    closesocket(sock); //关闭套接字  
    WSACleanup();       //终止对Winsock DLL的使用,并释放资源
    return 0;
}   

客户端(client)

这段代码是一个简单的TCP/IP客户端程序,主要实现以下功能:

  1. 初始化Winsock库:通过调用 WSAStartup 函数初始化 Winsock 库,这是在 Windows 系统上进行网络编程的必要步骤。

  2. 创建套接字:使用 socket 函数创建一个套接字,该套接字用于与服务器端进行通信。

  3. 连接服务器:调用 connect 函数向服务器进程发出连接请求,并与服务器建立连接。

  4. 输入命令:客户端可以从标准输入获取用户输入的命令。

  5. 发送数据:使用 send 函数将输入的命令发送给服务器。

  6. 关闭套接字:发送完数据后,关闭套接字。

  7. 循环处理:通过一个无限循环,实现客户端持续与服务器端进行交互。

#include <winsock2.h>  
#include <stdio.h>  
#pragma comment(lib,"ws2_32.lib")    //把ws2_32.lib加到Link页的连接库  
//#define IP "172.18.68.243"            //在两台计算机上测试,IP为Server端的IP地址  
#define IP "127.0.0.1"                //在一台计算机上测试,IP为本地回送地址
#define PORT 15001                    //注意:客户端设置通信的端口 = 服务端的端口
#define BUFFER_SIZE 1024            //数据发送缓冲区大小
/*
    客户端原理:
        1、客户端进程创建套接字
        2、客户端向服务端进程发出连接请求
        3、当服务端接受请求后,客户端便可向服务端发送数据
*/
int main()  
{  
    char buf[BUFFER_SIZE];                                //buf数组存放客户端发送的消息  
    int inputLen;                                        //用于输入字符自增变量
    while(1)  
    {  
        printf("C:\\Socket\\Client>");  
        inputLen=0;  
        memset(buf,0,sizeof(buf));  
        while((buf[inputLen++]=getchar())!='\n')        //输入以回车键为结束标识
        {
            ;
        }
        if(buf[0]=='e' && buf[1]=='x' && buf[2]=='i' && buf[3]=='t')  
        {  
            printf("The End.\n");  
            break;   
        }  

        WSADATA WSAData;  
        if(WSAStartup(MAKEWORD(2,0),&WSAData)==SOCKET_ERROR)  //WSAStartup()函数对Winsock DLL进行初始化
        {  
            printf("Socket initialize fail!\n");  
            continue;  
        }  
        SOCKET sock;                                            //客户端进程创建套接字
        if((sock=socket(AF_INET,SOCK_STREAM,0))==SOCKET_ERROR)  //创建流套接字(与服务端保持一致)
        {  
            printf("Socket create fail!\n");  
            WSACleanup();  
            continue;  
        }  

        struct sockaddr_in ClientAddr;                //sockaddr_in结构用来标识TCP/IP协议下的地址,可强制转换为sockaddr结构
        ClientAddr.sin_family=AF_INET;                //指Internet域
        ClientAddr.sin_port=htons(PORT);            //指定服务端所预留的端口
        ClientAddr.sin_addr.s_addr=inet_addr(IP);    //指定服务端所绑定的IP地址
        if(connect(sock,(LPSOCKADDR)&ClientAddr,sizeof(ClientAddr))==SOCKET_ERROR)  //调用connect()函数,向服务器进程发出连接请求  
        { 
            printf("Connect fail!\n");  
            closesocket(sock);  
            WSACleanup();  
            continue;  
        }  
        send(sock,buf,BUFFER_SIZE,0);                 //向服务器发送数据 
        closesocket(sock);                             //关闭套接字
        WSACleanup();                                //终止对Winsock DLL的使用,并释放资源,以备下一次使用
    }  
    return 0;
}  

客户端(client)

这段代码是一个简单的TCP/IP客户端程序,主要实现以下功能:

  1. 初始化Winsock库:通过调用 WSAStartup 函数初始化 Winsock 库,这是在 Windows 系统上进行网络编程的必要步骤。

  2. 创建套接字:使用 socket 函数创建一个套接字,该套接字用于与服务器端进行通信。

  3. 连接服务器:调用 connect 函数向服务器进程发出连接请求,并与服务器建立连接。

  4. 关闭套接字:连接建立后,即刻关闭套接字。

  5. 终止Winsock库使用:调用 WSACleanup 函数,终止对 Winsock 库的使用,并释放资源。

#include <winsock2.h>  
#include <stdio.h>  
#pragma comment(lib,"ws2_32.lib")    //把ws2_32.lib加到Link页的连接库  
//#define IP "172.18.68.243"            //在两台计算机上测试,IP为Server端的IP地址  
#define IP "127.0.0.1"                //在一台计算机上测试,IP为本地回送地址
#define PORT 6666                    //注意:客户端设置通信的端口 = 服务端的端口

int main()
{
        WSADATA WSAData;
        SOCKET sock;
        
        WSAStartup(MAKEWORD(2, 0), &WSAData);     //== SOCKET_ERROR)  WSAStartup()函数对Winsock DLL进行初始化
        sock = socket(AF_INET, SOCK_STREAM, 0);

        struct sockaddr_in ClientAddr;                //sockaddr_in结构用来标识TCP/IP协议下的地址,可强制转换为sockaddr结构
        ClientAddr.sin_family = AF_INET;                //指Internet域
        ClientAddr.sin_port = htons(PORT);            //指定服务端所预留的端口
        ClientAddr.sin_addr.s_addr = inet_addr(IP);    //指定服务端所绑定的IP地址

        connect(sock, (LPSOCKADDR)&ClientAddr, sizeof(ClientAddr));

        closesocket(sock);                             //关闭套接字
        WSACleanup();                                //终止对Winsock DLL的使用,并释放资源,以备下一次使用
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微软技术分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值