2011-04-03 33 views
1

我正在製作一個偵聽多個端口的TCP/IP服務器。我選擇使用select來啓用處理多個事件。區分使用選擇的套接字

所以目前,我有兩個插座,連接到兩個不同的端口(3000,3001)。

一旦我進入select循環,我希望服務器根據它當前處理的端口作出不同的響應。我怎麼能說出我選擇的插座?


我爲我的選擇循環添加了代碼,希望你們能指點我正確的方向。請注意,這是在將兩個文件描述符都添加到集合後開始的。

while(1) 

{ 

    /* Block until input arrives on one or more active sockets. */ 

    readfds = activefds; 

    if (select (FD_SETSIZE, &readfds, NULL, NULL, NULL) < 0) 

    { 

     perror ("select"); 

     exit (EXIT_FAILURE); 

    } 



    /* Service all the sockets with input pending. */ 

    for (i = 0; i < FD_SETSIZE; ++i) 

    { 

     if (FD_ISSET (i, &readfds)) 

     { 

      if (i == S_time) 

      { 


       if ((NS = accept(S_time,NULL,NULL)) < 0) 

        ERROR("server: accept"); 

       FD_SET(NS, &activefds); //add the new socket desc to our active connections set 

       send_time(NS); 



      } 

      else if (i == S_remote)// i == S_remote 

      { 

       fprintf(stderr,"Remote"); 

       int status = recieve_request(S_remote); 

       /* Data arriving on an already-connected socket. */ 



      } 

      else 

      { 

       break; 

      } 

     } 

    } /* //end of for */ 

} /* //end of while */ 

所以我的兩個插座是S_time和S_remote。當客戶端連接到時間套接字時,我想發送當前時間的客戶端。當客戶端連接到遠程時,我想要執行遠程執行。我怎樣才能做出這個區別?

感謝您的幫助。

+0

請張貼一些代碼去與此,它將有助於給出更準確的答案。由於您沒有列出您的編程語言,因此可能導致模糊的答案。 – BugFinder 2011-04-03 17:23:33

+0

哎呀,我完全忘了語言標籤,哦! – Blackbinary 2011-04-03 18:11:12

+0

我編輯添加我的選擇代碼,我希望你們可以幫助:) – Blackbinary 2011-04-03 19:42:00

回答

2

select()處理文件描述符,它不知道端口號。

您需要自己跟蹤這些信息(例如,通過文件描述符作爲關鍵字的映射),或者簡單地使用多組文件描述符(其中每個文件描述符都是特定於某個端口的),然後調用select零組超時(非阻塞)。

+0

好吧,所以我確實有選擇設置,在設置有兩個套接字,每個都有自己的端口關聯。那麼,我如何區分集合中的套接字呢? – Blackbinary 2011-04-03 18:05:49

+1

你不能 - 正如Brian所說的,你必須將每個套接字的文件描述符號與你想要的行爲聯繫起來。 – Alnitak 2011-04-03 18:19:36

+1

您可以使用'getsockname'和'getpeername'從套接字文件描述符中提取本地和遠程地址和端口。但是這比自己追蹤它們要慢很多。 – 2011-04-03 19:21:34

0

檢查this explanation and sample code,似乎它回答你的問題。簡而言之,在select()返回後,相應的描述符將包含在相應的集合中。有關詳情,請點擊鏈接。

+0

這不僅沒有解決他的問題,它是一個由似乎並不真正理解如何使用'select()'的人編寫的非常可怕的代碼片段,儘管他似乎對發現它的存在感到非常興奮。 http://www.gnu.org/s/libc/manual/html_node/Server-Example.html是其使用的實際示例,但OP已經知道這一點。 – 2011-04-03 19:26:38

+0

@Brian ...現在讓我們來聽聽OP – 2011-04-03 19:28:44