2011-04-03 124 views
0

所以我試圖做一個服務器,偵聽多個端口。 我在選擇頭部時遇到問題。選擇幫助?

有人可以給我一點點的僞代碼,我做事情的原因和原因。

我知道我將兩個獨立的套接字綁定到不同的端口。當然。但是,我可以在兩個端口上調用listen嗎?

在我的客戶端上,我是否只需調用connect,並且listen會注意到連接嘗試?我如何選擇接受它?

對不起,有新手問題。我嘗試了beejs指南和其他一些,但它們並沒有真正涵蓋多個端口(它們似乎都使用相同的示例)。

謝謝!

回答

0

在服務器上調用bindlisten之後,套接字的fd只是另一個可用於調用select的fd。當select返回並指示該fd上的數據時,可以在fd上調用accept開始接收數據。

編輯:此外,您收到的FD當您連接accept是另一個fd可以傳遞給select調用。

+0

所以在我的選擇中,我有2個可能的套接字。當select返回時,我怎麼知道它返回的是哪個套接字? – Blackbinary 2011-04-03 20:57:00

+0

@Blackbinary:使用FD_ISSET – Heisenbug 2011-04-03 21:07:08

+0

@Blackbinary - 它可以返回,因爲其中一方或雙方(或者沒有,但讓我們離開那一天)。選擇將返回多少個套接字(文件描述符)準備就緒。你通過調用FD_ISSET()來循環。如果描述符已準備就緒,並且您調用accept(),則返回true。你需要跟蹤FD的情況。 – Duck 2011-04-03 21:07:44

0

客戶端: 您只需調用connect即可。

服務器端的步驟都或多或少如下:

  1. 創建套接字
  2. 綁定插座
  3. 開始聽
  4. 添加監聽套接字的文件描述符選擇
  5. 當監聽套接字上的選擇返回時,在其上調用accept函數。它會返回另一個文件描述符(記得將這個新的文件描述符添加到FD的列表中,通過FD_SET它必須返回)
+0

所以當你說「開始聆聽」時,這意味着我可以進行多個聽力調用?就像我可以說'聽(sock1,QUEUE_SIZE)'和'listen(sock2,QUEUE_SIZE)'並且他們不會互相攻擊? – Blackbinary 2011-04-03 20:55:50

+0

@Blackbinary:沒有,你可以讓一個人打聽聽筒 – Heisenbug 2011-04-03 21:05:22

+1

@ 0verbose - 他是指兩個獨立的聽筒。@Blackbinary - 是的,您可以在兩個獨立的套接字上打聽電話。你應該讓它們在發生任何這種情況之前都是非阻塞的。 – Duck 2011-04-03 21:10:52