2013-07-08 66 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