概述
通过在本地创建一个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客户端,远程接收客户端命令打开本地应用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复