gpt4 book ai didi

c++ - 如何在 Windows 上取消等待 select()

转载 作者:可可西里 更新时间:2023-11-01 12:57:40 24 4
gpt4 key购买 nike

在我的程序中有一个线程(接收线程)负责接收来自TCP套接字的请求,还有许多线程(工作线程)负责处理接收到的请求。处理请求后,我需要通过 TCP 发送答复。

这是一个问题。我想在用于接收数据的同一线程中发送 TCP 数据。这个线程在接收到数据后通常会在select()中等待新的数据。因此,一旦工作线程完成请求处理并将答案放入输出队列,它就必须通知接收线程有数据要发送。问题是我不知道如何取消 select() 中的等待,以便退出等待并调用 send()

或者我应该使用另一个线程专门用于通过 TCP 发送数据吗?

已更新

MSalters,Artyom 谢谢你的回答!

MSalters,阅读您的回答后我找到了这个网站:Winsock 2 I/O Methods并阅读有关 WSAWaitForMultipleEvents() 的内容。事实上,我的程序必须在 HP-UX 和 Windows 上都能运行我最终决定使用 Artyom 建议的方法。

最佳答案

您需要使用类似于安全管道技巧的东西,但在您的情况下,您需要使用一对连接的 TCP 套接字。

  1. 创建一对套接字。
  2. 将一个添加到选择中并等待它
  3. 通过从其他线程写入其他套接字来通知。
  4. Select 被立即唤醒,因为其中一个套接字是可读的,读取所有这个特殊套接字中的数据并检查队列中的所有数据以发送/接收

如何在Windows下创建一对socket?

inline void pair(SOCKET fds[2])
{
struct sockaddr_in inaddr;
struct sockaddr addr;
SOCKET lst=::socket(AF_INET, SOCK_STREAM,IPPROTO_TCP);
memset(&inaddr, 0, sizeof(inaddr));
memset(&addr, 0, sizeof(addr));
inaddr.sin_family = AF_INET;
inaddr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
inaddr.sin_port = 0;
int yes=1;
setsockopt(lst,SOL_SOCKET,SO_REUSEADDR,(char*)&yes,sizeof(yes));
bind(lst,(struct sockaddr *)&inaddr,sizeof(inaddr));
listen(lst,1);
int len=sizeof(inaddr);
getsockname(lst, &addr,&len);
fds[0]=::socket(AF_INET, SOCK_STREAM,0);
connect(fds[0],&addr,len);
fds[1]=accept(lst,0,0);
closesocket(lst);
}

当然应该为返回值添加一些检查。

关于c++ - 如何在 Windows 上取消等待 select(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3333361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com