21xrx.com
2024-12-27 18:59:26 Friday
登录
文章检索 我的文章 写文章
C++监听:如何在程序中实现监听功能
2023-07-03 22:44:52 深夜i     --     --
C++ 监听 程序实现 功能 编程技巧

在程序设计中,监听是一个非常常见的功能,它可以让程序实时响应某些事件而无需用户的干预。而C++作为一门高级编程语言,也提供了丰富的库函数来让开发者轻松实现监听功能。

下面将介绍两种常见的监听方式,分别是通过Socket连接和通过Windows消息。这些方式都能够在程序中实现监听功能。

1. 使用Socket连接实现监听

Socket连接是一种数据交换方式,可以通过网络协议来实现跨越网络通信。因此,通过Socket连接实现监听功能非常常见。下面是一个使用Socket连接实现监听的简单示例代码:


#include <iostream>

#include <WinSock2.h>

#include <Windows.h>

int main()

{

  WSADATA wsaData;

  WSAStartup(MAKEWORD(2, 2), &wsaData);

  SOCKET server_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  SOCKADDR_IN server_addr;

  server_addr.sin_family = AF_INET;

  server_addr.sin_port = htons(80);

  server_addr.sin_addr.s_addr = htonl(INADDR_ANY);

  bind(server_sock, (SOCKADDR*)&server_addr, sizeof(SOCKADDR));

  listen(server_sock, SOMAXCONN);

  while (true)

  {

    SOCKET client_sock = accept(server_sock, NULL, NULL);

    std::cout << "new client connected" << std::endl;

    char buf[256];

    int len = recv(client_sock, buf, 256, 0);

    if (len > 0)

    {

      buf[len] = '\0';

      std::cout << buf << std::endl;

    }

    else

    {

      std::cout << "recv error" << std::endl;

    }

    closesocket(client_sock);

  }

  closesocket(server_sock);

  WSACleanup();

  return 0;

}

这段代码创建了一个Socket服务器,并监听了端口号为80的连接。然后在while循环中等待客户端连接,一旦连接建立成功,就接收客户端发送的信息,并在控制台上输出。需要注意的是,这是一个非常简单的示例代码,实际应用中需要更加完善的处理逻辑。

2. 使用Windows消息实现监听

除了使用Socket连接,C++还可以通过Windows消息来实现监听。这种方式适用于Windows平台的GUI应用程序,比如Windows窗口程序。

Windows的消息机制可以让程序能够接收和处理不同的消息类型,比如键盘输入、鼠标移动、窗口关闭等等。可以使用Windows API提供的函数来定义窗口的消息回调函数,并在其中实现监听的逻辑。

下面是一个简单的Windows消息监听示例代码:


#include <Windows.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

  switch (message)

  {

  case WM_KEYDOWN:

  {

    MessageBox(hWnd, "key pressed", "message", MB_OK);

    break;

  }

  case WM_LBUTTONDOWN:

  {

    MessageBox(hWnd, "mouse left button pressed", "message", MB_OK);

    break;

  }

  case WM_RBUTTONDOWN:

  {

    MessageBox(hWnd, "mouse right button pressed", "message", MB_OK);

    break;

  }

  case WM_DESTROY:

  {

    PostQuitMessage(0);

    break;

  }

  default:

    return DefWindowProc(hWnd, message, wParam, lParam);

  }

  return 0;

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

  WNDCLASSEX wcex;

  wcex.cbSize = sizeof(WNDCLASSEX);

  wcex.style = CS_HREDRAW | CS_VREDRAW;

  wcex.lpfnWndProc = WndProc;

  wcex.cbClsExtra = 0;

  wcex.cbWndExtra = 0;

  wcex.hInstance = hInstance;

  wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);

  wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

  wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);

  wcex.lpszMenuName = NULL;

  wcex.lpszClassName = "Win32App";

  wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);

  RegisterClassEx(&wcex);

  HWND hWnd = CreateWindow("Win32App", "Windows app", WS_SYSMENU | WS_VISIBLE,

    100, 100, 400, 300, NULL, NULL, hInstance, NULL);

  MSG msg;

  while (GetMessage(&msg, NULL, 0, 0))

  {

    TranslateMessage(&msg);

    DispatchMessage(&msg);

  }

  return (int)msg.wParam;

}

这段代码创建了一个Windows窗口,并定义了消息回调函数WndProc。在窗口被创建后,在消息循环(while循环)中通过函数GetMessage获取消息,并通过函数DispatchMessage分发消息到相应的处理函数中。在回调函数WndProc中,可以根据不同的消息类型实现相应的监听逻辑。

结语

以上就是在C++程序中实现监听功能的几种方法。无论是Socket连接还是Windows消息,都是程序设计中非常基础的知识,掌握这些技巧将会对C++编程有很大帮助。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复