在客户端-服务器体系结构中,我有一台服务器,它接受来自客户端的连接。我希望服务器接受3个同时连接,其余的连接(如果可用)将被搁置以FIFO方式提供服务。正确的做法是什么?
我想到的一种可能的方法是
创建一个计数器,并检查其是否小于3,接受,在新线程中为客户端提供服务,然后递增计数器。当counter大于3时,只需接受套接字描述符并将其保存在队列中即可。当一个客户完成工作时,停止线程(例如通过加入线程)和递减计数器以允许为另一个客户提供服务。如果队列不为空,则弹出一个套接字描述符,创建一个线程并为客户端提供服务。
感谢您的反馈。
由于listen
功能有待定的积压,即。它会将所有连接保留在一个队列中,当accept
被调用时,实际上等待队列中的第一个元素被接受,这方面的解决方案如下。
在无限循环中,只要计数器小于特定数量(要同时服务的最大客户端数量),则仅接受连接。声明一个mutex
保护计数器的计数器,该计数器在每次接受连接时都会增加。向b声明一个条件变量,用于在线程完成其任务时发出信号。使用该条件变量和一个互斥量,如果counter大于X,则等待。为客户端提供服务的线程完成其任务后,递减counter并发出条件信号。因此,无限循环将再次循环并接受已经保留的客户端。
一种可能的实现方式可能是:
// 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注释所提供的任务。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句