c++ - 如何使用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)上可用的依赖项。
解决方案
推荐阅读
- pytorch - 在pytorch中广播元素明智的乘法
- flutter - 如何在 Dart 中使用 StreamZip 合并流
- python - 使用 Wget 时如何正确解析 Web 链接以避免 403 错误?
- mediawiki - 英语维基词典 API:输出中缺少变格表
- android - 如何在对话框中显示 recyclerVIew?
- linux - 将 C 语言中的 Linux 系统调用表重写为程序集
- loops - Julia Jump 约束的嵌套迭代
- r - For循环:如何为特定迭代应用不同的命令
- windows - 批处理窗口:获取文件名前的最后两个文件夹
- azure - Azure 数据工厂访问问题