C中的队列套接字连接

queue socket connections in C

在客户端-服务器架构中,我有一个服务器接受来自客户端的连接。我希望服务器接受 3 个同时连接,其余连接(如果可用)将被搁置,以 FIFO 方式提供服务。 这样做的正确方法是什么?

我想到的一种可能的方法是

创建一个计数器并检查它是否小于 3,接受,在新线程中为客户端服务,并递增计数器。当计数器大于 3 时,只接受套接字描述符并将其保存在队列中。当客户完成他的工作时,停止线程(例如通过加入)并减少计数器以允许为另一个客户提供服务。如果队列不为空,则弹出一个套接字描述符,创建一个线程并为客户端提供服务。

感谢您的反馈。

因为listen函数有一个你可以设置的积压,即。它会将所有连接保存在一个队列中,当调用 accept 时,队列中等待的第一个元素实际上被接受,从这方面的解决方案如下。

在无限循环中,只要计数器小于特定数字(同时服务的最大客户端数),就只接受连接。 声明一个 mutex 来保护每次接受连接时递增的计数器。 向 b 声明一个条件变量,用于在线程完成任务时发出信号。 使用该条件变量和互斥量,如果计数器大于 X,则等待。 当为客户端服务的线程完成其任务时,递减计数器并发出条件信号。因此无限循环将再次循环并接受已经暂停的客户端。

一个可能的实现方式是:

// global variable 
pthread_mutex_t lock;
pthread_cond_t cv;
int number_of_connected_client = 0;

// a function executed by a thread to handle each user
void *client_thread(void *arg) {

  /* some code */

  // thread is about to finish and return
  // client disconnected --> decrement number of connected clients 
  // signal that a client disconnected
  pthread_mutex_lock(&lock);
  number_of_connected_client-- ;
  pthread_cond_signal(&cv);
  pthread_mutex_unlock(&lock);
  return 0;
}

// infinte loop for accepting connections
while (1) {

  // serve 2 users at a time, queue the rest of the clients in the listen's queue 
  if( number_of_connected_client >= 2 ) {
    pthread_mutex_lock(&lock);      
    pthread_cond_wait(&cv, &lock);
    pthread_mutex_unlock(&lock);
  }

  connfd = accept(listenfd, (struct sockaddr *) NULL, NULL );

  // create a thread and serve the client 
  if( pthread_create( &thread_id , NULL , client_thread, (void*)connfd) <0)
    {
     // error in creating thread
     // do something 
    }

  // client is served --> increment number of connected clients 
  else {
    pthread_mutex_lock(&lock);
    number_of_connected_client ++;
    pthread_mutex_unlock(&lock);
  }

}

这只是一个简单的解决方法,可以让私人测试或硬件等工作......处理这个问题的正确方法是池线程,工作线程分配任务,如 Inspired 的评论所提供的。