c – 如何取消在Windows上的select()中等待

前端之家收集整理的这篇文章主要介绍了c – 如何取消在Windows上的select()中等待前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的程序中,有一个线程(接收线程)负责接收来自TCP套接字的请求,并且有许多线程(工作线程)负责处理接收到的请求.处理完请求后,我需要通过TCP发送答案.

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

或者我是否应该仅使用另一个线程通过TCP发送数据?

更新

MSalters,Artyom谢谢你的答案!

MSalters,在阅读了你的答案后,我找到了这个网站:Winsock 2 I/O Methods并阅读了有关WSAWaitForMultipleEvents()的信息.我的程序实际上必须在HP-UX和Windows上工作我最终决定使用Artyom建议的方法.

解决方法

您需要使用类似于safe-pipe技巧的东西,但在您的情况下,您需要使用一对连接的TCP套接字.

>创建一对套接字.
>在选择中添加一个并等待它
>通过从其他线程写入其他套接字来通知.
>选择立即被唤醒,因为其中一个套接字是可读的,读取全部
此特殊套接字中的数据并检查队列中的所有数据以发送/ recv

如何在Windows下创建一对套接字?

inline void pair(SOCKET fds[2])
{
    struct sockaddr_in inaddr;
    struct sockaddr addr;
    SOCKET lst=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    memset(&inaddr,sizeof(inaddr));
    memset(&addr,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,0);
    connect(fds[0],len);
    fds[1]=accept(lst,0);
    closesocket(lst);
}

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

猜你在找的C&C++相关文章