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

目录
相关文章
|
15天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
30天前
|
存储 缓存 算法
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
114 0
|
1月前
|
编解码 Linux C语言
探索C++与Live555实现RTSP服务器的艺术(一)
探索C++与Live555实现RTSP服务器的艺术
82 1
|
15天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
39 6
|
1月前
|
Linux Shell 网络安全
【Shell 命令集合 网络通讯 】Linux 与SMB服务器进行交互 smbclient命令 使用指南
【Shell 命令集合 网络通讯 】Linux 与SMB服务器进行交互 smbclient命令 使用指南
52 1
|
18天前
|
Python
Python网络编程基础(Socket编程)UDP服务器编程
【4月更文挑战第8天】Python UDP服务器编程使用socket库创建UDP套接字,绑定到特定地址(如localhost:8000),通过`recvfrom`接收客户端数据报,显示数据长度、地址和内容。无连接的UDP协议使得服务器无法主动发送数据,通常需应用层实现请求-响应机制。当完成时,用`close`关闭套接字。
|
25天前
|
存储 缓存 C++
C++链表常用的函数编写(增查删改)内附完整程序
C++链表常用的函数编写(增查删改)内附完整程序
|
1月前
|
Shell Linux 网络安全
【Shell 命令集合 网络通讯 】Linux 管理Apache HTTP服务器 httpd命令 使用指南
【Shell 命令集合 网络通讯 】Linux 管理Apache HTTP服务器 httpd命令 使用指南
30 0
|
1月前
|
Shell Linux Apache
【Shell 命令集合 网络通讯 】Linux 管理Apache HTTP服务器 apachectl命令 使用教程
【Shell 命令集合 网络通讯 】Linux 管理Apache HTTP服务器 apachectl命令 使用教程
162 1
|
1月前
|
编解码 C++ 流计算
探索C++与Live555实现RTSP服务器的艺术(三)
探索C++与Live555实现RTSP服务器的艺术
24 1

热门文章

最新文章