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 的评论所提供的。
在客户端-服务器架构中,我有一个服务器接受来自客户端的连接。我希望服务器接受 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 的评论所提供的。