2013-07-08 65 views
0

我正在写一个单线程选择服务器,用户可以动态添加侦听套接字。问题是,如果有人想添加一个侦听套接字,服务器将不会选择这个新的套接字,除非在其他套接字上发生了一些事情。我想到的动态选择服务器

一个解决办法是假的插座增加时,以强制服务器添加新的监听套接字到列表中添加了一个新的侦听套接字,我可能预示列表。这个解决方案对我来说似乎有些“黑客”,我想知道其他人是否有任何想法。

+0

你是否正在'select()'运行'accept()'?为什么不接受'select()'中的连接,那么就没有同步问题 –

+0

我接受select上的连接...并且没有同步问题......我不确定你的评论有什么用我的问题吗? – marler8997

回答

0

是的,但为了增加一个监听套接字,我想你必须先连接到服务器,然后告诉它添加另一个插座。

此外,您可能要设置在socket()调用的超时值。如果这样,服务器不忙响应请求,它可以在超时做一些低优先级的活动,如删除过期文件等

+0

其实我不使用这个线程上的任何套接字来告诉服务器添加一个监听套接字。你提到的超时实际上与我的问题无关......我正在寻找一种方法来弹出一个select调用......我可以使用超时,但超时时间越长,需要添加侦听器,越短,表现越好。在我的情况下,我可能会有很长时间没有活动,然后当我需要添加侦听套接字时,我需要它立即开始接受。这台服务器没有任何理由持续投票数周... – marler8997

+0

选择弹出/返回有三种方法。收到一个信号,计时器到期,或者其中一个套接字描述符发生事件。如果你喜欢使用信号,你可以使用HUP。你如何告诉服务器添加另一个套接字(假设它是单线程服务器)? –

+0

它实际上是一个多线程程序,我只是不想包含任何不必要的细节......但是您提到了......收到了一个信号?我不知道是否有信号我没有? Theres接受信号... DataAvailable信号...写信号....?哦,你提到了HUP?那是什么? – marler8997

0

您对假插座想法是不坏。我将其重命名为控制套接字,因为您可以使用它将不同类型的命令或请求发送到服务器。 而且它会比投票超时select更实时。

控制插座的类型也可以比其他插座不同。例如,使用UDP或unix域套接字将控制消息发送到本地服务器程序比使用TCP套接字更容易。

+0

雅,从我看到它看起来像一个特殊的插座用于弹出选择呼叫可能是最好的选择...感谢帮助确认我的想法... – marler8997