select模型处理超过FD_SETSIZE的连接

lsgt 2006-04-10 08:17:23
使用select模型的时候,如果需要处理的连接超过FD_SETSIZE,看网上的说法都是用多个线程来select,不过具体实现我还有一些疑惑:

由于连接数目事先无法确定,所以我打算用这样的方式处理:
1 线程1,创建监听SOCKET,并加入FD_READ,然后进入select循环,接下来的连接,只要不大于FD_SETSIZE-1,就加入FD_READ,等待接收数据(接收到数据之后的处理略);
2 如果新来一个连接的时候线程池的select队列已满,就新建线程2,并加入线程2的select队列。

这样一来,就有以下问题:

1 如何在有新的连接进入的时候让线程2的select暂时中断,以便可以把新的连接加入到select队列中?
2 当服务器需要停止的时候,如何告诉线程2的select返回?

当然,如果线程2的select给定一个超时值,则可以做到,不过这样一来,又带来问题:
当新的连接进入的时候,必须等待这个超时值结束才可能被接受,这样如果超时值过长,就会影响响应速度,如果超时值过短,大概会降低服务器性能(这个不是太确定,请大虾们解释一下)。

这个问题困惑我已久,请大家帮忙看一下。
...全文
418 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
vc_asm 2006-04-12
  • 打赏
  • 举报
回复
这样也不错:D
lsgt 2006-04-12
  • 打赏
  • 举报
回复
查了半天,发现最简便的办法是创建一个socket加入队列,需要唤醒时close就可以了:

SOCKET s=socket(AF_INET,SOCK_STREAM,0);
FD_SET(&s,&fdread);
select(0,&fdread,0,0,0);

closesocket(s)就可以唤醒select了。再次select的时候,重新创建该socket就OK了。在windows2003下测试通过。
lsgt 2006-04-11
  • 打赏
  • 举报
回复
这个倒也是个办法。

我也这么想过。也不用单独做一个socket了,把监听socket放进去就可以了。

不知道还有没有其他的办法?
vc_asm 2006-04-11
  • 打赏
  • 举报
回复
这样吧,自已的想法,呵呵
你给每个select队列放一个同步用的socket,当想把新连接放入此队列时,向这个同步socket写个字节,select自然返回:)
lsgt 2006-04-11
  • 打赏
  • 举报
回复
to vc_asm(哥俩好):

上面的例子中,线程1的FD_READ队列中有监听socket,能在有连接请求时退出select状态,问题在于,线程2怎么办,如何让线程2也在有连接请求时退出select状态?

比如有连接请求到来时,监听socket将使线程1退出select状态,并接收连接,如果此时线程1的select队列已满,而线程2的select队列未满,但正处于select状态,这时候怎样使线程2退出select状态,以便把新的连接加入到select队列里面?
xx_jj 2006-04-11
  • 打赏
  • 举报
回复
up
vc_asm 2006-04-11
  • 打赏
  • 举报
回复
你真聪明!一个队列满后,把listen socket移到新的队列里,再满后,再移,哼,哼~~~~~
vc_asm 2006-04-10
  • 打赏
  • 举报
回复
呵呵,The parameter readfds identifies the sockets that are to be checked for readability. If the socket is currently in the listen state, it will be marked as readable if an incoming connection request has been received such that an accept is guaranteed to complete without blocking. For other sockets, readability means that queued data is available for reading such that a call to recv, WSARecv, WSARecvFrom, or recvfrom is guaranteed not to block.
意思是说当socket在listen状态时,有客户连接请求,你的readfds就会可用。
lsgt 2006-04-10
  • 打赏
  • 举报
回复
自己up

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧