12.4 组播鼠标批量执行

这篇具有很好参考价值的文章主要介绍了12.4 组播鼠标批量执行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

组播模式相比单播模式可以提高网络的效率和带宽利用率,因为组播数据包只需要发送一次,就可以被多个接收者接收,而不需要每个接收者都单独发送一份数据包。这在需要同时向多个接收者发送相同数据的场景下特别有用,如视频会议、在线教育、流媒体等。组播模式可以减少网络拥塞,降低网络延迟,并且可以减少网络中的冗余数据。

通过构建组播服务器端与客户端,并配合键盘鼠标控制接口,当服务器端执行一个操作时客户端同步执行,通过此方法读者可轻易的实现一个简单的镜像服务器,当服务器规模庞大而主机系统版本相同时,该功能可实现服务器端执行一次客户端即可实现批量部署的效果。

先来看服务端是如何实现的功能,首先服务端定义umsg结构体,该结构用于存储鼠标坐标值以及鼠标按键状态,当服务器运行后开启组播模式等待客户端上线,当客户端上线则我们通过动态获取本机鼠标位置并封装成结构体传输给上线的客户端,以此来实现镜像功能。

#include <winsock.h>
#include <iostream>

#pragma comment(lib, "WSOCK32.lib")

using namespace std;

// 鼠标状态结构体
typedef struct umsg
{
  int cursor_pos_x;           // 鼠标X坐标
  int cursor_pos_y;           // 鼠标Y坐标
  int cursor_key_state;       // 鼠标按键状态

  umsg() :cursor_pos_x(), cursor_pos_y(), cursor_key_state()
  {
    cursor_pos_x = 0;
    cursor_pos_y = 0;
    cursor_key_state = 0;
  }
}umsg;

// 获取鼠标按键
int GetKeyState()
{
  if (GetAsyncKeyState(VK_LBUTTON) & 0x8000)
  {
    Sleep(15);
    return 1;
  }
  if (GetAsyncKeyState(VK_RBUTTON) & 0x8000)
  {
    Sleep(15);
    return 2;
  }
  return 0;
}

int main(int argc, char *argv[])
{
  WSADATA wsaData;
  struct sockaddr_in addr;
  int fd;
  struct ip_mreq mreq;

  // 初始化套接字
  if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  {
    std::cout << "初始化失败" << std::endl;
    return 0;
  }

  // 创建套接字 SOCK_DGRAM 采用UDP
  if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
  {
    std::cout << "套接字创建失败" << std::endl;
    return 0;
  }

  // 设置套接字为组播模式
  u_int yes = 1;
  if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&yes, sizeof(yes)) < 0)
  {
    std::cout << "设置组播模式失败" << std::endl;
    return 0;
  }

  // 0-同一台主机,1-跨主机
  UCHAR uLoop = 1;

  setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, (char*)&uLoop, sizeof(uLoop));

  memset(&addr, 0, sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = htonl(INADDR_ANY);
  addr.sin_port = htons(9999);

  // 绑定套接字
  if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0)
  {
    std::cout << "绑定失败" << std::endl;
    return 0;
  }

  // 设置组播模式中的组信息
  mreq.imr_multiaddr.s_addr = inet_addr("228.2.3.1");
  mreq.imr_interface.s_addr = htonl(INADDR_ANY);
  if (setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq)) < 0)
  {
    int err = GetLastError();
    std::cout << "设置组失败: " << err << std::endl;
    return 0;
  }

  // 循环
  while (1)
  {
    char recv_buffer[4096] = { 0 };
    char send_buffer[4096] = { 0 };
    int addrlen = sizeof(addr);
    int nbytes;

    // 接收组播数据
    if ((nbytes = recvfrom(fd, recv_buffer, 4096, 0, (struct sockaddr *) &addr, (int *)&addrlen)) < 0)
    {
      std::cout << "接收数据包失败" << std::endl;
      return 0;
    }
    recv_buffer[nbytes] = '\0';
    std::cout << "接收组播数据包: " << recv_buffer << std::endl;

    umsg msg;

    // 获取鼠标状态
    POINT pt;
    BOOL ref = GetCursorPos(&pt);

    // 设置鼠标坐标
    msg.cursor_pos_x = pt.x;
    msg.cursor_pos_y = pt.y;

    // 获取鼠标状态值
    int key_flag = GetKeyState();
    if (key_flag == 0)
    {
      msg.cursor_key_state = 0;
    }
    else if (key_flag == 1)
    {
      msg.cursor_key_state = 1;
    }
    else if (key_flag == 2)
    {
      msg.cursor_key_state = 2;
    }

    std::cout << "鼠标X = " << msg.cursor_pos_x << " 鼠标Y = " << msg.cursor_pos_y << std::endl;
    std::cout << "鼠标键位 = " << msg.cursor_key_state << std::endl;

    // 发送组播数据包
    sendto(fd, (char *)&msg, 4096, 0, (struct sockaddr *) &addr, sizeof(addr));
  }
  return 0;
}

与服务端功能类似,对于客户端来说,收到数据包以后,将其转换为umsg格式结构体,读取其中坐标信息,并执行指定函数对鼠标的状态进行设置,实现鼠标的同步执行。

#include <winsock.h>
#include <iostream>

#pragma comment(lib, "WSOCK32.lib")

using namespace std;

// 鼠标状态结构体
typedef struct umsg
{
  int cursor_pos_x;           // 鼠标X坐标
  int cursor_pos_y;           // 鼠标Y坐标
  int cursor_key_state;       // 鼠标按键状态

  umsg() :cursor_pos_x(), cursor_pos_y(), cursor_key_state()
  {
    cursor_pos_x = 0;
    cursor_pos_y = 0;
    cursor_key_state = 0;
  }
}umsg;

int main(int argc, char *argv[])
{
  WSADATA wsaData;
  struct sockaddr_in addr;
  int fd;

  // 初始化套接字
  if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  {
    std::cout << "初始化失败" << std::endl;
    return 0;
  }

  // 创建套接字 SOCK_DGRAM 采用UDP
  if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
  {
    std::cout << "套接字创建失败" << std::endl;
    return 0;
  }

  UCHAR uLoop = 1; // 0-同一台主机,1-跨主机

  setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, (char*)&uLoop, sizeof(uLoop));

  // 设置组播模式组信息
  memset(&addr, 0, sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = inet_addr("228.2.3.1");
  addr.sin_port = htons(9999);

  // 循环
  while (1)
  {
    // 发送组播数据包
    char send_buffer[4096] = "Hello, World!";
    if (sendto(fd, send_buffer, strlen(send_buffer), 0, (struct sockaddr *) &addr, sizeof(addr)) < 0)
    {
      std::cout << "发送失败" << std::endl;
      return 0;
    }

    // 接收组播数据
    int addrlen = sizeof(addr);
    char recv_buffer[4096] = { 0 };
    recvfrom(fd, recv_buffer, 4096, 0, (struct sockaddr *) &addr, (int *)&addrlen);
    std::cout << "接收组播数据包: " << recv_buffer << std::endl;

    // 格式化数据包为umsg格式
    umsg* recv_message = (umsg*)recv_buffer;
    int pos_x = recv_message->cursor_pos_x;
    int pos_y = recv_message->cursor_pos_y;
    int key_stat = recv_message->cursor_key_state;

    // 判断键位并设置
    if (key_stat == 0)
    {
      std::cout << "鼠标X: " << pos_x << " 鼠标Y: " << pos_y << endl;
      SetCursorPos(pos_x, pos_y);
    }
    else if (key_stat == 1)
    {
      std::cout << "左键按下" << std::endl;
      mouse_event(MOUSEEVENTF_LEFTUP | MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
      key_stat = 0;
    }
    else if (key_stat == 2)
    {
      std::cout << "右键按下" << std::endl;
      mouse_event(MOUSEEVENTF_RIGHTUP | MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);
      key_stat = 0;
    }
  }
  return 0;
}

读者可以编译上方两段代码,并首先在物理机内启动服务端,在虚拟机内启动客户端,此时当服务端鼠标发生移动时客户端也会跟随移动,服务端执行的操作客户端也会被执行,如下图所示;

12.4 组播鼠标批量执行,《灰帽黑客:攻守道》,c++,Visual C++,c语言,开发语言,算法文章来源地址https://www.toymoban.com/news/detail-741735.html

到了这里,关于12.4 组播鼠标批量执行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vxe-table 鼠标滑动选择多行,鼠标区域选中批量操作

    该功能存在bug哦,移步我的新博客:vxe-table 鼠标滑动选择多行,鼠标区域选中批量操作[2]_wanghanlu_的博客-CSDN博客 在看vxe-table 文档时,发现一个功能,鼠标区域选中,觉得这个功能很好。  但是仔细发现,这个功能不是免费的。我就想想,为啥不能自己实现呢。 下面给你看看我的最终

    2024年02月15日
    浏览(39)
  • vxe-table 鼠标滑动选择多行,鼠标区域选中批量操作[2]

    前几天写了一个关于 vxe-table 鼠标滑动选择多行 的博客,在项目上线的过程中,发现这个功能还是有点bug,在经过我对vxe-table pro版本 的演示后vxe-table PRO,认真调试后,终于解决了bug,并且这个功能和pro版本可以说是几乎一模一样。注意:我是说这个滑动选择的功能,不是说是

    2024年02月05日
    浏览(149)
  • Python灰帽编程——初识Python上

    常用安全工具语言 示例 perl joomscan whatweb ruby metasploit-framework python sqlmap pocsuite3 go goby 1.1.1 语言的作者 贵铎·范·罗萨姆(Guido van Rossum)荷兰人于1989 年圣诞节始创了python。 大神就是大神,假期还写代码。 使用C 语言创建了Python。 1991 年初,python 发布了第一个公开发行版。

    2024年02月09日
    浏览(34)
  • Python灰帽编程——网页信息爬取

    1.1 requests 模块 requests 模块:主要是用来模拟浏览器行为,发送HTTP 请求,并处理HTTP 响应的功能。 requests 模块处理网页内容的基本逻辑: 定义一个URL 地址。 发送HTTP 请求。 处理HTTP 响应。 1.1.1 模块中的请求方法 请求方法 说明 requests.get() 常规的请求方法 (GET 方法) reque

    2024年02月07日
    浏览(40)
  • 12 万元接私活【外卖换电柜】项目,造黑客攻击,柜门被暴力打开,IoT 安全不容小觑...

    0 1 外卖换电柜造黑客攻击 去年小团队接了深圳一家硬件企业的外卖换电柜后台系统和小程序开发项目,不含换电柜硬件设备,2 个月轻松到手 12 万元。 此次外卖电瓶车换电柜智能系统项目不包含硬件设备,后台系统基于团队早期一个共享充电宝项目做了二次开发,技术栈是

    2024年01月18日
    浏览(50)
  • postman-接口批量执行、接口串联

    1、点击postman左侧Collections下面有个添加文件夹图标,就可以创建测试项目   2、该目录下还可以创建子目录,进行测试用例的细分  3、创建测试用例。         创建接口测试用例,即新建http请求,选择请求方式、写好url、请求头、请求体 4、设置变量 postman的变量和Jmet

    2024年02月07日
    浏览(34)
  • mybatis配置批量执行SQL

    foreach 标签插入数据量大时,明显影响效率,个人倾向以下配置  applicationcontext 配置文件 Java代码 mybatis文件没什么可说的,就是普通单条插入的insert 标签即可

    2024年02月12日
    浏览(40)
  • jquery批量执行任务实时返回状态

    PHP后端处理脚本 ( process_tasks.php ): 在与HTML文件相同的目录下创建一个名为 process_tasks.php 的文件,用于处理批量任务的后端逻辑:

    2024年01月18日
    浏览(35)
  • 12.3 实现模拟鼠标录制回放

    本节将向读者介绍如何使用键盘鼠标操控模拟技术,键盘鼠标操控模拟技术是一种非常实用的技术,可以自动化执行一些重复性的任务,提高工作效率,在Windows系统下,通过使用各种键盘鼠标控制函数实现动态捕捉和模拟特定功能的操作。 有时我们经常需要进行重复性的鼠

    2024年02月08日
    浏览(48)
  • 12.1 使用键盘鼠标监控钩子

    本节将介绍如何使用 Windows API 中的 SetWindowsHookEx 和 RegisterHotKey 函数来实现键盘鼠标的监控。这些函数可以用来设置全局钩子,通过对特定热键挂钩实现监控的效果,两者的区别在于 SetWindowsHookEx 函数可以对所有线程进行监控,包括其他进程中的线程,而 RegisterHotKey 函数只能

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包