C中的队列套接字连接

道明

在客户端-服务器体系结构中,我有一台服务器,它接受来自客户端的连接。我希望服务器接受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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Linux中的套接字连接

来自分类Dev

基于C#中Mac地址的套接字连接

来自分类Dev

连接错误:Ubuntu中C语言的简单套接字编程

来自分类Dev

连接列表在C套接字编程中显示0.0.0.0

来自分类Dev

C:套接字管理(套接字信息被新连接的套接字覆盖)

来自分类Dev

在Android中连接和断开套接字

来自分类Dev

Java中的密钥SSL套接字连接

来自分类Dev

在Python中打开SSL套接字连接

来自分类Dev

OpenShift中的网络套接字连接

来自分类Dev

连接中的Lua套接字错误

来自分类Dev

iOS:在套接字中读写(TCP连接)

来自分类Dev

在Android中连接和断开套接字

来自分类Dev

连接中未定义的套接字

来自分类Dev

节点js中的套接字连接

来自分类Dev

在原始套接字中连接功能?

来自分类Dev

无法在本机反应中连接套接字

来自分类Dev

如何关闭python中的套接字连接?

来自分类Dev

套接字始终断开C ++的连接

来自分类Dev

C:套接字连接和数据丢失

来自分类Dev

PHP和C ++之间的套接字连接

来自分类Dev

C:套接字连接和数据丢失

来自分类Dev

通过代理的C ++套接字连接

来自分类Dev

C ++中的套接字接收

来自分类Dev

linux套接字:在C中关闭套接字

来自分类Dev

C中的套接字:关闭套接字的正确方法

来自分类Dev

通过 C/C++ 中的阻塞/非阻塞 TCP 套接字连接的超时问题

来自分类Dev

返回打开的套接字连接/使套接字连接保持打开状态C ++

来自分类Dev

套接字连接超时

来自分类Dev

套接字TCP连接