如何使用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);

如果目录改变了,或者取消事件被触发,这个函数会停止阻塞并告诉我发生了哪一件事情。

所以我的问题是如何用 winsock 做到这一点。现在,我有一个基于这个例子的程序:Complete Winsock Server Code

这就是我等待连接的方式,这会阻塞:

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,0);
   WINSOCKEVENT* acceptNewEvent = accept(_private->ListenSocket,NULL);
   DWORD result = WinsockWaitForMultipleEvents(... like in the example above...);

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

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)