【问题标题】:Client Server multiple connections in CC中的客户端服务器多个连接
【发布时间】:2015-10-06 07:53:37
【问题描述】:

我试图解释一个用 C 语言实现的带有套接字的简单服务器如何处理并发客户端。假设一个简单的服务器等待客户端连接,然后读取客户端发送的消息。 read() 是一个阻塞函数,因此服务器将阻塞,直到客户端写入它。如果我们假设两个客户端同时写入服务器。服务器将唤醒其中一个,但另一个会发生什么?在处理来自第一个客户端的请求时,服务器是否仍在“监听”?我知道 bind 函数将 int 作为第二个参数指定积压(默认为 5)。这是否意味着只有 5 个客户端可以同时连接到服务器?如果是这样,那么处理多个并发连接的服务器是如何实现的?

【问题讨论】:

    标签: c sockets client-server server


    【解决方案1】:

    你应该穿线。通常服务器有一个主线程来监听连接。如果建立了连接,则主线程创建另一个线程并将该连接传递给新创建的线程。这样在主线程仍然能够侦听新连接的同时响应连接。

    编辑: 这是听():

    listen(int socket_fd, int backlog)

    对于给定的监听套接字,内核维护两个队列。

    • SYN 已到达但三次握手 (TCP) 未完全完成的不完整连接队列。 (SYN_RCV 状态) 一个完整的连接队列
    • 完成三次握手。 (ESTABLISHED 状态)积压参数历史上指定两个队列的总和。但是对于积压的含义没有正式的定义。

    【讨论】:

    • 这正是我实现它的方式。我的问题是,如果在主线程将连接分派给线程之前发生多个连接怎么办。
    • @Keeto 所以当建立连接时。创建一个新线程,然后将连接传递给它。如果在此过程中出现新连接,它将排队等待该过程空闲。
    • 是的,您可以为每个连接使用一个线程。然后是时候同时拥有更多的客户端,然后是盒子中的核心。
    • @NikolaiNFetissov True
    【解决方案2】:

    发明了select(2)poll(2) 系统调用来处理这种确切的情况(使用non-blocking sockets)。

    然后有fork(2)的多进程方法,然后当然可以用threads实现服务器。

    您的案例的最佳解决方案取决于您的具体要求。

    【讨论】:

      【解决方案3】:

      在服务器中使用这个函数:

      int listen(int sockfd, int backlog); 
      

      “积压”表示一次可以尝试连接多少未完成的客户端。

      当这个函数返回时:

      int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);  
      

      然后立即将'sockfd'参数传递给

      int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                            void *(*start_routine) (void *), void *arg);  
      

      让线程处理与客户端的通信。

      注意:创建线程既昂贵又缓慢,因此应首先创建一个线程“池”并为每个客户端连接激活一个,当客户端断开连接时,将线程返回池

      【讨论】:

        猜你喜欢
        • 2012-05-22
        • 2021-08-17
        • 2012-12-14
        • 2012-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        相关资源
        最近更新 更多