代码之家  ›  专栏  ›  技术社区  ›  Borealid

同时使用accept()和select()?

  •  20
  • Borealid  · 技术社区  · 14 年前

    目前,我有一个 while(1) 调用的循环 accept() 然后生成一个线程来处理新连接。读取消息后,每个连接都将关闭。在远程端,发送消息后连接关闭。

    接受() poll() select() ,但我想同时通过 接受() 监听所有缓存的连接。

    投票() 一个在上面 接受() 接受() call returns(一个新的连接被打开),我必须唤醒另一个线程在等待旧的连接集。我知道我可以用信号和 pselect() ,但对于这么简单的事情来说,整个混乱似乎太多的工作了。

    是否有一个调用或高级方法可以让我同时处理打开的新连接和在旧连接上发送的数据?

    3 回复  |  直到 14 年前
        1
  •  26
  •   mvds    14 年前

    listen 在插座上,然后 select poll 看看是否有联系。如果是的话, accept 信息技术;它不会阻挡(但你 你可能想

        2
  •  6
  •   toblerone_country niux    4 年前

    您可以使用listen然后使用select或者poll然后accept

    if (listen(socket_fd, Number_connection) < 0 )
    {
        perror("listen");
        return 1;
    }
    fd_set set;
    struct timeval timeout;
    int rv;
    FD_ZERO(&set); /* clear the set */
    FD_SET(socket_fd, &set); /* add our file descriptor to the set */
    
    timeout.tv_sec = 20;
    timeout.tv_usec = 0;
    
    rv = select(socket_fd + 1, &set, NULL, NULL, &timeout);
    if (rv == -1)
    {
        perror("select"); /* an error occurred */
        return 1;
    }
    else if (rv == 0)
    {
        printf("timeout occurred (20 second) \n"); /* a timeout occurred */
        return 1;
    }
    else
    {
        client_socket_fd = accept (socket_fd,(struct sockaddr *) &client_name, &client_name_len);
    }
    
        3
  •  1
  •   toblerone_country niux    4 年前

    我会把一个监听器放在单独的进程(线程)中,以免把事情搞砸。并在另一个上运行工作进程以处理现有套接字。实际上,没有必要使用非阻塞侦听器。没有线程开销运行2个线程。

    它应该是这样工作的:您在侦听器线程上接受,直到它返回客户机套接字的描述符,并将其传递给正在对其执行所有脏读/写操作的worker。

    如果您想侦听多个端口,并且不想为每个侦听器保留一个进程,我建议您将套接字设置为O\u NONBLOCK并执行以下操作:

    // loop through listeners here and poll'em for read
    // when read is successful call accept, get descriptor,
    // pass it to worker and continue listen
    while(1){
        foreach( serverSocket in ServerSockets ){
             if( serverSocket.Poll( 10, SelectRead ) ){
                  clientSocket = serverSocket.Accept();
                  // pass to worker here and release
             }
        }
    }