使用 Select 区分套接字

问题描述 投票:0回答:2

我正在制作一个监听多个端口的 TCP/IP 服务器。我选择使用 select 来启用多个事件的处理。

所以,目前我有两个套接字,它们连接到两个不同的端口(3000、3001)。

一旦进入选择循环,我希望服务器根据当前正在处理的端口做出不同的响应。一旦进入选择,我如何知道我在哪个套接字上?


我正在为我的选择循环添加代码,希望你们能为我指出正确的方向。请注意,这是在我将两个文件描述符添加到集合中之后开始的。

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。当客户端连接到时间套接字时,我想向该客户端发送当前时间。当客户端连接到远程时,我想要进行远程执行。我该如何区分?

c sockets tcp posix-select
2个回答
2
投票

select()
处理文件描述符,它不知道有关端口号的任何信息。

您需要自己跟踪此信息(例如,通过由文件描述符键入的映射)或简单地使用多组文件描述符(其中每组特定于一个端口)并使用零调用

select
每组超时(非阻塞)。


-1
投票

检查这个解释和示例代码,似乎它回答了你的问题。简而言之,select()返回后,相应的描述符就被包含在相应的集合中。有关详细信息,请点击链接。

© www.soinside.com 2019 - 2024. All rights reserved.