2011-04-03 31 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