微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用winsock 2异步接受套接字并从中读取数据?

如何解决如何使用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 举报,一经查实,本站将立刻删除。