在我的程序中,有一个线程(接收线程)负责接收来自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); }
当然,应该为返回值添加一些检查.