服务端(server)

#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(,),&WSAData)==SOCKET_ERROR) //启动winsock ,WSAStartup()函数对Winsock DLL进行初始化
{
printf("Socket initialize fail!\n");
exit();
}
SOCKET sock; //服务进程创建套接字句柄(用于监听)
if((sock=socket(AF_INET,SOCK_STREAM,))==ERROR) //调用socket()函数创建一个流套接字,参数(网络地址类型,套接字类型,网络协议)
{
printf("Socket create!\n");
WSACleanup();
exit();
}
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();
}
printf("Server Socket Port:%d\n",ntohs(ServerAddr.sin_port));
if(listen(sock,)==SOCKET_ERROR) //调用listen()函数将套接字置入监听模式并准备接受连接请求,参数(已捆绑未连接的套接字描述字,正在等待连接的最大队列长度)
{
printf("Listen fail!\n");
closesocket(sock);
WSACleanup();
exit();
} SOCKET msgsock; //创建一个新的套接字(用于接收accept函数的返回值,即表示已经接受的那个客户端的连接,进而接收Client发来的数据)
char buf[BUFFER_SIZE]; //数据接收缓冲区
while()
{
if((msgsock=accept(sock,(LPSOCKADDR),(int *)))==INVALID_SOCKET) //进入监听状态后,调用accept()函数接收客户端的连接请求,并把连接传给msgsock套接字,原sock套接字继续监听其他客户机连接请求
{
printf("Accept fail!\n");
continue;
}
memset(buf,,sizeof(buf)); //初始化数据接收缓冲区
recv(msgsock,buf,BUFFER_SIZE,); //接收客户端发送过来的数据
if(buf[]=='e' && buf[]=='x' && buf[]=='i' && buf[]=='t') //"exit"命令,退出程序
{
printf("The End.\n");
break;
}
printf("C:\\Socket\\Server>%s",buf);
system(buf); //本地运行客户端传来的命令:这一点太厉害了,假如传一个Format命令,那服务端可能就毁了
closesocket(msgsock);
} closesocket(sock); //关闭套接字
WSACleanup(); //终止对Winsock DLL的使用,并释放资源
return ;
}

客户端(client)

#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()
{
printf("C:\\Socket\\Client>");
inputLen=;
memset(buf,,sizeof(buf));
while((buf[inputLen++]=getchar())!='\n') //输入以回车键为结束标识
{
;
}
if(buf[]=='e' && buf[]=='x' && buf[]=='i' && buf[]=='t')
{
printf("The End.\n");
break;
} WSADATA WSAData;
if(WSAStartup(MAKEWORD(,),&WSAData)==SOCKET_ERROR) //WSAStartup()函数对Winsock DLL进行初始化
{
printf("Socket initialize fail!\n");
continue;
}
SOCKET sock; //客户端进程创建套接字
if((sock=socket(AF_INET,SOCK_STREAM,))==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,); //向服务器发送数据
closesocket(sock); //关闭套接字
WSACleanup(); //终止对Winsock DLL的使用,并释放资源,以备下一次使用
}
return ;
}

客户端的简单写法

#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(, ), &WSAData); //== SOCKET_ERROR) WSAStartup()函数对Winsock DLL进行初始化
sock = socket(AF_INET, SOCK_STREAM, ); 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 ;
}

参考文献:https://blog.csdn.net/lynch0571

C语言Socket-模拟远程CMD(客户端向服务器发送命令,服务器执行该命令)的更多相关文章

  1. python练习-Socket实现远程cmd命令

    需求:基于tcp的套接字实现远程执行命令的操作 代码示例: # 编辑者:闫龙 #Client端部分 import socket #导入骚凯特模块 CmdObj = socket.socket(sock ...

  2. 使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)

    原文:使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置) 在上一篇中说到了Silverlight下的Socket通信,在最后的时候说到本篇将会结合地图. ...

  3. [Python Study Notes]Socket模拟ssh执行cmd并记录遇到的问题

    服务器端: 流程: 1.创建servert实例 2.绑定地址和端口 3.开始监听 4.创建客户端连接实例 5.等待客户端的消息 6.......... # The_author = 'liu66' # ...

  4. C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法

    C#调用接口注意要点   在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...

  5. Socket 模拟HTTP客户端请求

    import java.io.IOException; import java.io.InputStream; import java.io.OutputStreamWriter; import ja ...

  6. socket,模拟服务器、客户端通信

    服务器代码: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;u ...

  7. 在Java中使用Socket模拟客户端和服务端(多线程)

    1:Socket与ServerSocket的交互 2.Socket和ServerSocket介绍 Socket 构造函数 Socket() Socket(InetAddress address, in ...

  8. 模拟远程SSH执行命令的编解码说明

    模拟一个SSH“远程”执行命令并获取命令结果的一个程序: 1.在C/S架构下,当客户端与服务器建立连接(这里以TCP为例)后,二者可以不断的进行数据交互.SSH远程可以实现的效果是客户端输入命令可以在 ...

  9. Socket网络编程--FTP客户端

    Socket网络编程--FTP客户端(1)(Windows) 已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解F ...

随机推荐

  1. Spring Boot学习笔记:项目开发中规范总结

    Spring Boot在企业开发中使用的很广泛,不同的企业有不同的开发规范和标准.但是有些标准都是一致的. 项目包结构 以下是一个项目常见的包结构 以上是一个项目的基本目录结构,不同的项目结构会有差异 ...

  2. 【Java】使用Apache POI生成和解析Excel文件

    概述 Excel是我们平时工作中比较常用的用于存储二维表数据的,JAVA也可以直接对Excel进行操作,分别有jxl和poi,2种方式. HSSF is the POI Project's pure ...

  3. spring学习 三 框架的搭建

    1 导入jar包 spring启来最少要5个包,四个核心包和一个依赖的日志包 2 创建配置文件 在dynamic web project下的src目录下,创建一个spring的xml配置文件,名称可以 ...

  4. 如何将本地代码通过git上传到码云

    ps:同部署到GitHub上一样 http://www.cnblogs.com/pcx105/p/7777932.html

  5. es5数组的新方法

    1.every方法 //逻辑判断返回值为一个Boolean值 every方法就是每一个返回函数的返回值都是true的时候,才为true,否则为false var arr=[1,2,5,88,5,555 ...

  6. UVa 1610 Party Games(思维)

    题意: 给出一系列字符串,构造出一个最短字符串(可以不在集合中)大于等于其中的一半,小于另一半. 析:首先找出中间的两个字符串,然后暴力找出最短的字符串,满足题意. 代码如下: #include &l ...

  7. 微信 公众号平台 与 开放平台 获取用户信息 scope snsapi_login

    微信公众号(公众平台) 和 微信开放平台 是两码事.公众号(公众平台)获取的scope只包括两种:snsapi_base 和snsapi_userinfo,前者是静默获取,用户无感知:后者是需要用户确 ...

  8. VIP之Scaler

    VIP Scaller II   从以前的时序来看   当把2160p分辨率经过Scaller之后,变换为1080p输出的数据再经过CVO处理之后,输出的帧结构不正常,有效数据组成一个行,无效数据也是 ...

  9. java http大文件断点续传上传

    因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 效果: 上传中,显示进度,时间,百分比. 点击[Pause]暂停,点击[Resume]继续. 2,代码分析 项目进行了封装使用最简单的 ...

  10. TreeSet集合为什么要实现Comparable?

    首先,让我们来看看JDK中TreeSet类的add方法 /** * Adds the specified element to this set if it is not already presen ...