- 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; }
【远控】主机上线
最新推荐文章于 2025-05-18 08:10:10 发布