我是靠谱客的博主 时尚夏天,最近开发中收集的这篇文章主要介绍win创建TCP客户端,远程接收客户端命令打开本地应用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

通过在本地创建一个tcp服务端代码,然后接收远程客户端的命令,当接收1时打开一个应用,接收二时候关闭当前应用打开另一个应用,接收3时打开另外的应用。
完整代码:


/*
服务器编程思路:
初始化套接字库
1、创建套接字socket(socket)
地址处理以及端口处理
2、创建的套接字绑定(bind)到本地的地址和端口上
3、设置套接字的状态为监听(listen),准备接受客户端的连接请求
4、接受请求(accpet),同时返回得到一个用于连接的新套接字
5、使用这个新套接字进行通信(通信函数使用send/recv)
6、通信完毕,释放套接字资源(closesocket)
*/
#include <winsock.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
#pragma comment (lib,"ws2_32.lib") //显示加载套接字库
using namespace std;


int main()
{
	int server_port_number = 1111;
	//printf("请输入服务器端口号:");
	//scanf_s("%d", &server_port_number);
	string apply1 = "D:\Git\git-bash.exe";
	string apply2 = "D:\Youdao\Dict\YoudaoDict.exe";
	string apply3 = "D:\Notepad++\notepad++.exe";
	//初始化套接字库
	//获取应用名
	string app1 = "git-bash.exe";
	string app2 = "YoudaoDict.exe";
	string app3 = "notepad++.exe";

	WSADATA wsadata; //定义一个WSADATA类型的结构体,存储被WSAStartup函数调用后返回的Windows Sockets数据
	WORD sock_version = MAKEWORD(2, 0); //设置版本号
	if (WSAStartup(sock_version, &wsadata)) //初始化套接字,启动构建,将“ws2_32.lib”加载到内存中
	{
		printf("WSAStartup failed n");
		return 0;
	}

	//1、创建套接字socket(socket)
	//家族:ip地址IPV4 IPV6//协议类型//用户不确定什么方式 传0
	SOCKET sock_server = socket(AF_INET, SOCK_STREAM, 0); //创建一个对应IPv4的TCP套接字
	if (sock_server == INVALID_SOCKET)
	{
		printf("socket failed n");
		return 0;
	}

	//地址处理及端口处理
	sockaddr_in addr_server;
	int addr_server_size = sizeof(addr_server);
	addr_server.sin_family = AF_INET; //家族:ip地址IPV4
	addr_server.sin_port = htons(server_port_number); //htons 转换为u_short
	addr_server.sin_addr.S_un.S_addr = INADDR_ANY; //INADDR_ANY 任何ip都可以接入

												   //2、创建的套接字绑定(bind)到本地的地址和端口上
	int result = bind(sock_server, (sockaddr *)&addr_server, sizeof(addr_server));
	if (result == SOCKET_ERROR)
	{
		printf("socket bind failedn");
		closesocket(sock_server);
		WSACleanup();
		return 0;
	}

	//3、设置套接字的状态为监听(listen),准备接受客户端的连接请求
	result = listen(sock_server, 5);
	if (result == 0)
	{
		printf("服务器端启动:n");
	}

	SOCKET sock_client; //创建新套接字
	sockaddr_in addr_client;

	//4、接受请求(accpet),同时返回得到一个用于连接的新套接字
	sock_client = accept(sock_server, (sockaddr *)&addr_client, &addr_server_size);
	if (sock_client != NULL)
	{
		printf("%s 客户端已连接。n", inet_ntoa(addr_client.sin_addr)); //inet_ntoa将地址转换为字符串

		char buffer[1024]; //用于接受数据的缓冲区
		memset(buffer, 0, sizeof(buffer)); //初始化缓冲区
		int irecver, isend;
		//gets_s(buffer, 1024);

		while (1)
		{
			//5、使用这个新套接字进行通信(通信函数使用send/recv)
			//接收数据
			irecver = recv(sock_client, buffer, sizeof(buffer), 0); //接收数据
			if (irecver > 0) //缓冲区有数据,开始读取数据
			{
				if (!(strcmp(buffer, "q"))) //判断数据是否为结束标志,若是则关闭服务器
				{
					//closesocket(sock_server); //关闭服务器套接字
					//WSACleanup();
					//Sleep(5000);
					//return 0;
					break;
				}
				else if(!(strcmp(buffer, "1")))
				{
					/*printf("接收客户端数据:%sn", buffer);*/
					//WinExec("D:\Git\git-bash.exe", SW_NORMAL);
					/*string exe = "taskkill /f /t /im cmd.exe";
					WinExec(exe.c_str(), SW_HIDE);*/
					STARTUPINFO si; //一些必备参数设置
					memset(&si, 0, sizeof(STARTUPINFO));
					si.cb = sizeof(STARTUPINFO);
					si.dwFlags = STARTF_USESHOWWINDOW;
					si.wShowWindow = SW_SHOW;
					PROCESS_INFORMATION pi; //必备参数设置结束
					
					//wchar_t appName1[50] = TEXT("D:\Git\git-bash.exe");
					const char* pCStrKey = apply1.c_str();
					//第一次调用返回转换后的字符串长度,用于确认为wchar_t*开辟多大的内存空间
					int pSize = MultiByteToWideChar(CP_OEMCP, 0, pCStrKey, strlen(pCStrKey) + 1, NULL, 0);
					wchar_t *pWCStrKey = new wchar_t[pSize];
					//第二次调用将单字节字符串转换成双字节字符串
					MultiByteToWideChar(CP_OEMCP, 0, pCStrKey, strlen(pCStrKey) + 1, pWCStrKey, pSize);
					if (!CreateProcess(NULL, pWCStrKey, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
					{
						std::cout << "Create Fail!" << std::endl;
						exit(1);
					}
					string exe = "taskkill /f /t /im "+ app2;
					WinExec(exe.c_str(), SW_HIDE);
					string exe1 = "taskkill /f /t /im "+app3;
					WinExec(exe1.c_str(), SW_HIDE);
				}
				else if (!(strcmp(buffer, "2")))
				{
					/*printf("接收客户端数据:%sn", buffer);*/
					//WinExec("D:\Git\git-bash.exe", SW_NORMAL);
					/*string exe = "taskkill /f /t /im cmd.exe";
					WinExec(exe.c_str(), SW_HIDE);*/
					STARTUPINFO si; //一些必备参数设置
					memset(&si, 0, sizeof(STARTUPINFO));
					si.cb = sizeof(STARTUPINFO);
					si.dwFlags = STARTF_USESHOWWINDOW;
					si.wShowWindow = SW_SHOW;
					PROCESS_INFORMATION pi; //必备参数设置结束

					//wchar_t appName1[200] = TEXT("C:\Program Files\Google\Chrome\Application\chrome.exe");
					//wchar_t appName1[50] = TEXT("D:\Git\git-bash.exe");
					const char* pCStrKey = apply2.c_str();
					//第一次调用返回转换后的字符串长度,用于确认为wchar_t*开辟多大的内存空间
					int pSize = MultiByteToWideChar(CP_OEMCP, 0, pCStrKey, strlen(pCStrKey) + 1, NULL, 0);
					wchar_t *pWCStrKey = new wchar_t[pSize];
					//第二次调用将单字节字符串转换成双字节字符串
					MultiByteToWideChar(CP_OEMCP, 0, pCStrKey, strlen(pCStrKey) + 1, pWCStrKey, pSize);
					if (!CreateProcess(NULL, pWCStrKey, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
					{
						std::cout << "Create Fail!" << std::endl;
						exit(1);
					}
					string exe = "taskkill /f /t /im "+app1;
					WinExec(exe.c_str(), SW_HIDE);
					string exe1 = "taskkill /f /t /im "+app3;
					WinExec(exe1.c_str(), SW_HIDE);
				}
				else if (!(strcmp(buffer, "3")))
				{
					/*printf("接收客户端数据:%sn", buffer);*/
					//WinExec("D:\Git\git-bash.exe", SW_NORMAL);
					/*string exe = "taskkill /f /t /im cmd.exe";
					WinExec(exe.c_str(), SW_HIDE);*/
					STARTUPINFO si; //一些必备参数设置
					memset(&si, 0, sizeof(STARTUPINFO));
					si.cb = sizeof(STARTUPINFO);
					si.dwFlags = STARTF_USESHOWWINDOW;
					si.wShowWindow = SW_SHOW;
					PROCESS_INFORMATION pi; //必备参数设置结束

					//wchar_t appName1[50] = TEXT("D:\Notepad++\notepad++.exe");
					const char* pCStrKey = apply3.c_str();
					//第一次调用返回转换后的字符串长度,用于确认为wchar_t*开辟多大的内存空间
					int pSize = MultiByteToWideChar(CP_OEMCP, 0, pCStrKey, strlen(pCStrKey) + 1, NULL, 0);
					wchar_t *pWCStrKey = new wchar_t[pSize];
					//第二次调用将单字节字符串转换成双字节字符串
					MultiByteToWideChar(CP_OEMCP, 0, pCStrKey, strlen(pCStrKey) + 1, pWCStrKey, pSize);
					if (!CreateProcess(NULL, pWCStrKey, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
					{
						std::cout << "Create Fail!" << std::endl;
						exit(1);
					}
					string exe = "taskkill /f /t /im "+app1;
					WinExec(exe.c_str(), SW_HIDE);
					string exe1 = "taskkill /f /t /im "+app2;
					WinExec(exe1.c_str(), SW_HIDE);
				}
			}
			else //接受数据失败
			{
				closesocket(sock_server);
				WSACleanup();
				Sleep(5000);
				return 0;
			}
			memset(buffer, 0, sizeof(buffer)); //初始化缓冲区,用于下一次数据的接收

			//发送数据
			//printf("发送服务器数据:");
			//gets_s(buffer, 1024);
			//isend = send(sock_client, buffer, sizeof(buffer), 0); //发送数据
			//if (isend == SOCKET_ERROR)
			//{
			//	closesocket(sock_server);
			//	WSACleanup();
			//	Sleep(5000);
			//	return 0;
			//}
			//memset(buffer, 0, sizeof(buffer)); //初始化缓冲区,用于下一次数据的接收
		}
	}
	//6、通信完毕,释放套接字资源(closesocket)
	printf("通信结束n");
	closesocket(sock_server);
	closesocket(sock_client);
	WSACleanup();
	//system("puase");
	return 0;
}


本程序实现功能:
接收到1打开:git-bash.exe ,同时关闭另外两个打开的程序
接收到2打开:YoudaoDict.exe ,同时关闭另外两个打开的程序
接收到3打开:notepad++.exe ,同时关闭另外两个打开的程序

最后

以上就是时尚夏天为你收集整理的win创建TCP客户端,远程接收客户端命令打开本地应用的全部内容,希望文章能够帮你解决win创建TCP客户端,远程接收客户端命令打开本地应用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部