C++网络编程(二)--客户端服务器程序

简介:

这是一个基于windows的,用C++编写的客户端服务器程序,适合初学者,高手误入.源码必共享

思路是这样的.启动服务器,服务器启动后会创建一个子线程,用于向客户端发送信息.用一个死循环用于接收客户端的请求,客户端请求成功后,会将客户端的连接保存到一个集合中,下面会详细介绍这个保存客户端连接的类.客户端连接成功后,服务器会创建一个子线程用于接收客户端的信息,客户端同样也会创建一个子线程接收服务器的信息.这样客户端和服务器就能进行通讯,如果有哪一方退出,另一方对应的接收数据的线程就会自动终止.

退出一个客户端后,服务器对应的接收数据的线程自动终止.如下图:

服务器保存客户端连接的集合中会删除对应的客户端连接,由于这个删除操作是在子线程中发生的,也就是说会有多个线程操作这个集合,那么针对这个集合的操作必须是线程安全的.保证线程安全的方法又很多,我的这篇博客《多线程编程--5种方法实现线程同步》介绍了5中方法实现线程同步,我这里用的是关键段,还有一点值得说明的是,保存客户端连接的集合肯定只能有一份,我用一个类封装了这个集合,这个类中的每个方法都是线程安全的,且只能有一个实例,这里用了比较暴力的方法,将相关的方法设为private,提供一个public的方法返回这个对象的一个静态实例,唯一的一个实例。

保存客户端连接的类如下:

复制代码
//ClientList.h 存放客户端的请求,只能有一个实例
#ifndef _CLIENTLIST_H_
#define _CLIENTLIST_H_
#include <vector>
#include "CSocket.h" 
#include <assert.h>
class CSocket;
class ClientList
{
public : 
    typedef vector<CSocket*>::iterator Iter;
     
    void Add(CSocket* socket);

    int Count() const;

    CSocket* operator[](size_t index);

    void Remove(CSocket* socket);

    Iter Find(CSocket* socket); 

    void Clear(); 

    static ClientList* GetInstance()
    {
        static ClientList instance;
        return &instance;
    }

    ~ClientList();
private:
    static CRITICAL_SECTION g_cs;
    static vector<CSocket*> _list; 
    ClientList(); 
    ClientList(const ClientList&);
    ClientList& operator=(const ClientList&); 
};
 
#endif
      
复制代码
复制代码
#include "ClientList.h"
typedef vector<CSocket*>::iterator Iter; 

ClientList::ClientList()
{
    InitializeCriticalSection(&g_cs);//初始化g_cs的成员 
}

ClientList::~ClientList()
{
    DeleteCriticalSection(&g_cs);//删除关键段 
}

void ClientList::Add(CSocket* socket)
{
    if(socket!=NULL)
    {
        EnterCriticalSection(&g_cs);//进入关键段
        _list.push_back(socket);
        LeaveCriticalSection(&g_cs);//退出关键段  
    }
}

int ClientList::Count() const
{
    return _list.size();
}

CSocket* ClientList::operator[](size_t index)
{ 
    assert(index>=0 && index<_list.size()); 
    return _list[index];
}

void ClientList::Remove(CSocket* socket)
{ 
    Iter iter=Find(socket);
    EnterCriticalSection(&g_cs);//进入关键段
    if(iter!=_list.end())
    { 
        delete *iter; 
        _list.erase(iter);
    }
    LeaveCriticalSection(&g_cs);//退出关键段  
}

Iter ClientList::Find(CSocket* socket)
{
    EnterCriticalSection(&g_cs);//进入关键段
    Iter iter=_list.begin();
    while(iter!=_list.end())
    {
        if(*iter==socket)
        {
            return iter;
        }
        iter++;
    }
    LeaveCriticalSection(&g_cs);//退出关键段  
    return iter;
}

void ClientList::Clear()
{
    EnterCriticalSection(&g_cs);//进入关键段
    for(int i=_list.size()-1;i>=0;i--)
    {
        delete _list[i];
    }
    _list.clear();
    LeaveCriticalSection(&g_cs);//退出关键段  
}

CRITICAL_SECTION ClientList::g_cs;
vector<CSocket*> ClientList::_list ;
复制代码

C++网络编程(一)



本文转自啊汉博客园博客,原文链接:http://www.cnblogs.com/hlxs/archive/2013/05/19/3087036.html

目录
相关文章
|
2月前
|
机器学习/深度学习 人工智能 运维
企业内训|LLM大模型在服务器和IT网络运维中的应用-某日企IT运维部门
本课程是为某在华日资企业集团的IT运维部门专门定制开发的企业培训课程,本课程旨在深入探讨大型语言模型(LLM)在服务器及IT网络运维中的应用,结合当前技术趋势与行业需求,帮助学员掌握LLM如何为运维工作赋能。通过系统的理论讲解与实践操作,学员将了解LLM的基本知识、模型架构及其在实际运维场景中的应用,如日志分析、故障诊断、网络安全与性能优化等。
97 2
|
7天前
|
缓存 负载均衡 监控
HTTP代理服务器在网络安全中的重要性
随着科技和互联网的发展,HTTP代理IP中的代理服务器在企业业务中扮演重要角色。其主要作用包括:保护用户信息、访问控制、缓存内容、负载均衡、日志记录和协议转换,从而在网络管理、性能优化和安全性方面发挥关键作用。
27 2
|
27天前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
38 2
|
2月前
|
存储 安全 数据可视化
提升网络安全防御有效性,服务器DDoS防御软件解读
提升网络安全防御有效性,服务器DDoS防御软件解读
57 1
提升网络安全防御有效性,服务器DDoS防御软件解读
|
1月前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
828 2
|
2月前
|
Kubernetes 应用服务中间件 nginx
搭建Kubernetes v1.31.1服务器集群,采用Calico网络技术
在阿里云服务器上部署k8s集群,一、3台k8s服务器,1个Master节点,2个工作节点,采用Calico网络技术。二、部署nginx服务到k8s集群,并验证nginx服务运行状态。
976 1
|
2月前
|
安全 区块链 数据库
|
29天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
50 2
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
103 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
90 4