【远控】主机上线

  • TCP服务端:
    #define _WINSOCK_DEPRECATED_NO_WARNINGS
    #include <iostream>
    #include <WinSock2.h>
    #pragma comment(lib,"ws2_32.lib")
    
    //上线结构
    typedef struct _NetWorkingInfo
    {
    	//功能号
    	DWORD dwFinctionCode;
    	//计算机名称
    	char szComputerName[30];
    	//系统版本
    	char szSystemVersion[30];
    	//内网IP
    	char szIntranetIP[20];
    	//外网IP
    	char szNetWorkIP[20];
    }NetWorkingInfo, *PNetWorkingInfo;
    
    //上线结构对象
    NetWorkingInfo NetWorkingBuffer = { 0 };
    
    //套接字
    SOCKET socSrv;
    SOCKET sockConn;
    //SOCKADDR_IN结构指定 AF_INET 地址系列的传输地址和端口
    SOCKADDR_IN addrClient;
    SOCKADDR_IN addSrv;
    
    //初始化套接字
    BOOL InitSocket()
    {
    	WORD wVersionRequested = MAKEWORD(2, 2);
    	WSADATA lpWSAData;
    	int nRet = WSAStartup(wVersionRequested, &lpWSAData);
    	if (nRet != 0)
    	{
    		printf("WSAStartup Error!\r\n");
    		system("pause");
    		return -1;
    	}
    	if (LOBYTE(lpWSAData.wVersion) != 2 || HIBYTE(lpWSAData.wVersion) != 2)
    	{
    		WSACleanup();
    		printf("wVersion Error!\r\n");
    		system("pause");
    		return -1;
    	}
    	//创建套接字
    	//IP协议版本,运输层协议
    	socSrv = socket(AF_INET, SOCK_STREAM, 0);
    
    
    	//指定IP
    	addSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//htonl(INADDR_ANY);
    	//指定IP协议版本
    	addSrv.sin_family = AF_INET;
    	//指定端口
    	addSrv.sin_port = htons(8000);
    
    	char opt = -1;
    	setsockopt(socSrv, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
    
    	//绑定
    	bind(socSrv, (sockaddr *)&addSrv, sizeof(sockaddr));
    
    	//监听
    	listen(socSrv, 5);
    
    	return TRUE;
    }
    
    //退出清理套接字
    BOOL CleanSocket()
    {
    	//关闭套接字
    	closesocket(socSrv);
    	closesocket(sockConn);
    	//退出Winsock DLL
    	WSACleanup();
    	return TRUE;
    }
    
    DWORD SocketThreadCallBack(LPVOID lpBuffer)
    {
    	int nLength = sizeof(sockaddr);
    	while (true)
    	{
    		//函数允许在套接字上尝试传入连接。
    		sockConn = accept(socSrv, (sockaddr *)&addrClient, &nLength);
    		char TempBuffer[0x1000] = { 0 };
    		//发送信息到客户端
    		//send(sockConn, "已登录至服务器", strlen("已登录至服务器") + 1, 0);
    		//接收客户端发送给服务端的信息
    		//char recvBuffer[MAX_PATH]{ 0 };
    		recv(sockConn, TempBuffer, 0x1000, 0);
    		//printf("客户端消息:%s\r\n", recvBuffer);
    		NetWorkingBuffer = *(NetWorkingInfo *)TempBuffer;
    		//获取客户端带过来的IP
    		memcpy(NetWorkingBuffer.szNetWorkIP, inet_ntoa(addrClient.sin_addr), strlen(inet_ntoa(addrClient.sin_addr)));
    		NetWorkingInfo * pNetWorkingBuffer = &NetWorkingBuffer;
    		//计算机名称
    		std::cout << pNetWorkingBuffer->szComputerName << std::endl;
    		//内网IP
    		std::cout << pNetWorkingBuffer->szIntranetIP << std::endl;
    		//外网IP
    		std::cout << pNetWorkingBuffer->szNetWorkIP << std::endl;
    		//系统版本
    		std::cout << pNetWorkingBuffer->szSystemVersion << std::endl;
    		break;
    	}
    	return 0;
    }
    
    int main()
    {
    	InitSocket();
    	HANDLE hThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)SocketThreadCallBack, NULL, NULL, NULL);
    	WaitForSingleObject(hThread, INFINITE);
    	CleanSocket();
    	system("pause");
    	return 0;
    }
    
  • TCP客户端:
    #define _WINSOCK_DEPRECATED_NO_WARNINGS
    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <WinSock2.h>
    #pragma comment(lib,"ws2_32.lib")
    #include <VersionHelpers.h>
    
    //上线结构
    typedef struct _NetWorkingInfo
    {
    	//功能号
    	DWORD dwFinctionCode;
    	//计算机名称
    	char szComputerName[30];
    	//系统版本
    	char szSystemVersion[30];
    	//内网IP
    	char szIntranetIP[20];
    	//外网IP
    	char szNetWorkIP[20];
    }NetWorkingInfo, *PNetWorkingInfo;
    
    //上线结构对象
    NetWorkingInfo NetWorkingBuffer = { 0 };
    //客户端套接字
    SOCKET socClient;
    //服务端相关的信息结构
    SOCKADDR_IN addSrv;
    
    BOOL InitSocket()
    {
    	WORD wVersionRequested = MAKEWORD(2, 2);
    	WSADATA lpWSAData;
    	int nRet = WSAStartup(wVersionRequested, &lpWSAData);
    	if (nRet != 0)
    	{
    		printf("WSAStartup Error!\r\n");
    		system("pause");
    		return -1;
    	}
    	if (LOBYTE(lpWSAData.wVersion) != 2 || HIBYTE(lpWSAData.wVersion) != 2)
    	{
    		WSACleanup();
    		printf("wVersion Error!\r\n");
    		system("pause");
    		return -1;
    	}
    	//创建一个套接字
    	socClient = socket(AF_INET, SOCK_STREAM, 0);
    
    	//指定IP地址
    	//inet_addr 把一个点分十进制字符串转换成32位整数
    	addSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
    	//指定IP协议版本
    	addSrv.sin_family = AF_INET;
    	//指定端口号
    	addSrv.sin_port = htons(8000);
    	//连接
    	connect(socClient, (sockaddr*)&addSrv, sizeof(sockaddr));
    	return TRUE;
    }
    
    BOOL CleanSocket()
    {
    	//关闭套接字
    	closesocket(socClient);
    	//退出Winsock DLL
    	WSACleanup();
    	return TRUE;
    }
    
    BOOL SendInfoToServer()
    {
    	char opt = -1;
    	setsockopt(socClient, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
    	send(socClient, (char *)&NetWorkingBuffer, sizeof(NetWorkingBuffer), 0);
    	return TRUE;
    }
    
    
    BOOL GetSystemOSVersion(char * szBuffer)
    {
    	if (IsWindows10OrGreater())
    	{
    		memcpy(szBuffer, "Windows 10", strlen("Windows 10"));
    		return TRUE;
    	}
    	if (IsWindows8OrGreater())
    	{
    		memcpy(szBuffer, "Windows 8", strlen("Windows 10"));
    		return TRUE;
    	}
    	if (IsWindows7SP1OrGreater())
    	{
    		memcpy(szBuffer, "Windows 7", strlen("Windows 10"));
    		return TRUE;
    	}
    }
    
    BOOL InitNetWorkingInfo()
    {
    	//对结构体进行初始化
    	memset(NetWorkingBuffer.szComputerName, 0, 30);
    	memset(NetWorkingBuffer.szSystemVersion, 0, 30);
    	memset(NetWorkingBuffer.szIntranetIP, 0, 20);
    	GetSystemOSVersion(NetWorkingBuffer.szSystemVersion);
    	char szHostName[128]{ 0 };
    	int nRet = gethostname(szHostName, 128);
    	if (nRet == 0)
    	{
    		sprintf(NetWorkingBuffer.szComputerName, "%s", szHostName);
    		hostent * phost = gethostbyname(szHostName);
    		char * szHostIP = inet_ntoa(*(in_addr *)phost->h_addr_list[0]);
    		sprintf(NetWorkingBuffer.szIntranetIP, "%s", szHostIP);
    		return TRUE;
    	}
    	return FALSE;
    
    }
    
    int main()
    {
    	InitSocket();
    	InitNetWorkingInfo();
    	SendInfoToServer();
    	CleanSocket();
    	system("pause");
    	return 0;
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Shad0w-2023

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

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

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

打赏作者

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

抵扣说明:

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

余额充值