Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Select区分套接字_C_Sockets_Select_Tcp - Fatal编程技术网

使用Select区分套接字

使用Select区分套接字,c,sockets,select,tcp,C,Sockets,Select,Tcp,我正在制作一个TCP/IP服务器,它监听多个端口。我选择使用select来启用多个事件的处理 现在,我有两个插座,它们连接到两个不同的端口3000,3001 一旦进入select循环,我希望服务器根据当前处理的端口做出不同的响应。一旦进入select,我如何知道我在哪个插座上 我正在为我的选择循环添加代码,希望你们能给我指出正确的方向。请注意,这是在我将两个文件描述符都添加到集合之后开始的 while(1) { /* Block until input arrives on one

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

现在,我有两个插座,它们连接到两个不同的端口3000,3001

一旦进入select循环,我希望服务器根据当前处理的端口做出不同的响应。一旦进入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。当客户机连接到时间套接字时,我希望以当前时间发送该客户机。当客户端连接到远程时,我希望执行远程执行。我该如何区分这一点

感谢您的帮助。

select处理文件描述符,它不知道端口号


例如,您需要自己通过文件描述符键入的映射来跟踪此信息,或者简单地使用多组文件描述符,其中每一组都特定于一个端口,并在每一组上使用零超时非阻塞调用select

检查,似乎它回答了您的问题。简言之,select返回后,相应的描述符包含在相应的集合中。有关详细信息,请访问链接

请发布一些代码,这将有助于给出更准确的答案。由于你还没有列出你的编程语言,很可能会导致含糊不清的答案。哎呀,我完全忘记了语言标签,哦!我编辑添加了我的选择代码,希望你们能帮我:好的,我有选择设置,在设置中有两个套接字,每个套接字都有自己的相关端口。那么,我如何区分集合中的套接字呢?你不能——正如Brian所说,你必须自己将每个套接字的文件描述符编号与所需的行为相关联。你可以使用getsockname和getpeername从套接字文件描述符中提取本地和远程地址和端口。但这比你自己跟踪要慢得多。我完全忘记了那些已经存在的。哎呀,记忆已经不是以前的样子了。虽然我不能说我曾经使用过它们,但我一直在跟踪自己。这不仅不能解决他的问题,而且这是一段非常可怕的代码,由一个似乎并不真正了解如何使用select的人编写。。虽然他对发现它的存在似乎很兴奋。是它使用的一个实际例子,但OP已经知道了。@Brian。。。现在让我们来听OP