网络编程(四)TCP IO多路转接服务器编程(select)多线程

本文介绍了如何将基于select的TCP多路转接服务器改写为多线程形式,以提高处理效率。主要改动包括在主线程的while循环中处理监听和通信文件描述符的就绪情况,通过创建子线程来处理连接和通信。文章还强调了在多线程环境下对fd_set和maxfd变量进行互斥访问的重要性,并提到了C++11的多线程编程和互斥量的使用。示例代码展示了具体的实现。
摘要由CSDN通过智能技术生成

一,select多路转接服务器

网络编程(三)TCP IO多路转接服务器编程(select)

二,select多路转接服务器(多线程)

前面介绍的select多路转接服务器已经可以实现处理多个客户端的服务器,为了进一步提高效率,我们还可以将上面的select多路转接服务器改写为多线程的形式。与前面普通的select多路转接服务器相比,要修改为多线程主要是要在主线程的while(1)的循环中做些处理:

在select检测完读集合过后,
1,如果检查到有监听文件描述符准备就绪,则开一个子线程让其去处理该次的连接;
2,如果检测到有通信文件描述符准备就绪,则开一个子线程让其去处理该次的通信。

注意:本次使用多线程改造该服务器的多线程方法仍然是C++11标准的跨平台方法。同时,需注意:
1,在监听文件描述符就绪以后连接客户端过程中,要添加accept成功以后返回的客户端进入待检测集合中,方便下一次的检测,所以需要传入的fd_set参数为指针类型,且该子线程与主线程detach以后,子线程与主线程在运行过程中可能同时访问该fd_set数据,所以要互斥访问。maxfd这个变量同理。也要互斥访问。
2,在处理客户端通信的子线程中,同样子线程与主线程detach,所以要注意该子线程中的fd_set数据也可能与主线程对fd_set的访问发生冲突,所以也要注意互斥访问。
关于C++11跨平台多线程编程的方法与互斥量的应用在我前面的博客中有介绍:
1)C++新特性(六)多线程(1)线程启动、结束,创建线程、join,detach,线程传参详解
2)C++新特性(六)多线程(2)线程中互斥量的使用,mutex对象使用,lock_guard类模板,死锁的解决

下面是多线程select多路转接服务器一个例子代码:
服务端

//server_thread.cpp
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <thread>
#include <mutex>
using namespace std;

mutex fdset_mutex;
mutex maxfd_mutex;
void Connection(int lfd,fd_set*rdset,int*maxfd)//监听文件描述符,待检测的读集合,集合中的最大文件描述符
{
   
      // 接受连接请求, 这个调用不阻塞
        struct sockaddr_in cliaddr;
        int cliLen = sizeof(cliaddr);
        int cfd = accept(lfd, (struct sockaddr*)&cliaddr, (socklen_t*)&cliLen);

        // 得到了有效的文件描述符
        // 通信的文件描述符添加到读集合
        // 在下一轮select检测的时候, 就能得到缓冲区的状态

        fdset_mutex.lock();
        FD_SET(cfd, rdset);
        fdset_mutex.unlock();


        // 重置最大的文件描述符
        maxfd_mutex.lock();
        *maxfd = cfd > *maxfd ? cfd : *maxfd;
        maxfd_mutex.
项目简介: 采用I/O复用技术select实现socket通信,采用多线程负责每个客户操作处理,完成Linux下的多客户聊天室! OS:Ubuntu 15.04 IDE:vim gcc make DB:Sqlite 3 Time:2015-12-09 ~ 2012-12-21 项目功能架构: 1. 采用client/server结构; 2. 给出客户操作主界面(注册、登录、帮助和退出)、登录后主界面(查看在线列表、私聊、群聊、查看聊天记录、退出); 3. 多客户可同时连接服务器进行自己操作; ##服务器端## 1. server.c:服务器端主程序代码文件; 2. config.h:服务器端配置文件(包含需要的头文件、常量、数据结构及函数声明); 3. config.c:服务器端公共函数的实现文件; 4. list.c:链表实现文件,用于维护在线用户链表的添加、更新、删除操作; 5. register.c:服务器端实现用户注册; 6. login.c:服务器端实现用户登录; 7. chat.c:服务器端实现用户的聊天互动操作; 8. Makefile:服务器端make文件,控制台执行make命令可直接生成可执行文件server ##客户端## 1. client.c:客户端主程序代码文件; 2. config.h:客户端配置文件(包含需要的头文件、常量、数据结构及函数声明); 3. config.c:客户端公共函数的实现文件; 4. register.c:客户端实现用户注册; 5. login.c:客户端实现用户登录; 6. chat.c:客户端实现用户的聊天互动操作; 7. Makefile:客户端make文件,控制台执行make命令可直接生成可执行文件client;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值