首页 > 解决方案 > 如何使用winsock 2 异步接受套接字并从中读取数据?

问题描述

我记得当我在 WinAPI 中编写代码来监视目录更改时,我会为每个“侦听器”获取一个事件,添加一个额外的事件来取消观看并执行以下操作:

// used to cancel the waiting (eg. program shutting down)
HANDLE* cancelEvent = ... create it somehow ...;
// Waiting for dir changes in dir 1
HANDLE* dirOneWatch = ...;
// Waiting for dir changes in dir 2
HANDLE* dirTwoWatch = ...;

//  array of handles
HANDLE* handles[] = {cancelEvent, dirOneWatch, dirTwoWatch};
DWORD result = WaitForMultipleObjects(3, events, false, INFINITE);

如果 dir 更改或触发了取消事件,此函数将停止阻塞并告诉我发生了哪一件事。

所以我的问题是如何用winsock做到这一点。现在,我有一个基于这个例子的程序:完整的 Winsock 服务器代码

所以这就是我等待连接的方式,这块:

SOCKET ClientSocket = accept(_private->ListenSocket, NULL, NULL);

从套接字读取也是阻塞的:

   constexpr size_t len = 64;
   const char buffer[len];
   recv(ClientSocket, buffer, len, 0);

为了能够一次做更多的事情,我需要每个客户端一个线程加上一个线程来接受它们。我一点也不喜欢那样。相反,我想要类似的东西:

   WINSOCKEVENT* recvEvent = recv(ClientSocket, buffer, len, 0);
   WINSOCKEVENT* acceptNewEvent = accept(_private->ListenSocket, NULL, NULL);
   DWORD result = WinsockWaitForMultipleEvents(... like in the example above...);

有没有办法做到这一点?或者是否有另一个本机 Windows 库可以在没有一堆线程的情况下进行套接字通信?

请注意,我正在编写代码作为制作简单服务器的学习练习,因此我不想使用任何外部依赖项,除了给定操作系统(目前是 windows)上可用的依赖项。

标签: c++windowswinapiwinsock2

解决方案


推荐阅读