问题描述
我记得当我在 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 (将#修改为@)