当前位置: 首页 > news >正文

淘宝 做网站空间 条件域名注册要多少钱

淘宝 做网站空间 条件,域名注册要多少钱,写作网站,seo网站平台本项目使用C实现具备多个客户端和服务器端即时通信聊天功能软件 一#xff1a;项目内容 使用C实现一个具备多客户端和一个服务器端即时通信功能的聊天软件。 本项目的目的是 学习在windows平台下#xff0c;进行C网络开发的基本概念#xff1a;TCP/IP socket通信#xff0…本项目使用C实现具备多个客户端和服务器端即时通信聊天功能软件 一项目内容 使用C实现一个具备多客户端和一个服务器端即时通信功能的聊天软件。 本项目的目的是 学习在windows平台下进行C网络开发的基本概念TCP/IP socket通信多线程编程文件配置读写和通信协议制定等 二需求分析 这个聊天室主要有两个程序 1.服务端能够接受新的客户连接并将每个客户端发来的信息转发给对应的目标客户端。 2.客户端能够连接服务器并向服务器发送消息同时可以接收服务器发来的消息。 属于C/S模型。 三抽象与细化 服务端类需要支持 1.支持多个客户端接入实现聊天室基本功能。 2.启动服务建立监听端口等待客户端连接。 3.使用epoll机制实现并发增加效率。 4.客户端连接时发送欢迎消息并存储连接记录。 5.客户端发送消息时根据消息类型广播给所有用户(群聊)或者指定用户(私聊)。 6.客户端请求退出时对相应连接信息进行清理。 客户端类需要支持 1.连接服务器。 2.支持用户输入消息发送给服务端。 3.接受并显示服务端发来的消息。 4.退出连接。 四C/S模型 五涉及数据读写、转发等操作所以需要使用Windows 下IOCP模型  IOCP 全称I/O Completion Port中文译为I/O完成端口。IOCP是一个异步I/O的Windows API它可以高效地将I/O事件通知给应用程序类似于Linux中的Epoll详细信息请参考linux之epoll。  I/O 完成端口可以充分利用 Windows 内核来进行 I/O 调度相较于传统的Winsock模型IOCP的优势主要体现在两方面独特的异步I/O方式和优秀的线程调度机制。   IOCP模型通信机制主要过程为1、socket关联iocp2、在socket上投递I/O请求3、事件完成返回完成通知封包4、工作线程在iocp上处理事件。IOCP的这种工作模式程序只需要把事件投递出去事件交给操作系统完成后工作线程在完成端口上轮询处理。该模式充分利用了异步模式高速率输入输出的优势能够有效提高程序的工作效率。完成端口可以抽象为一个公共消息队列当用户请求到达时完成端口把这些请求加入其抽象出的公共消息队列。这一过程与多个工作线程轮询消息队列并从中取出消息加以处理是并发操作。这种方式很好地实现了异步通信和负载均衡因为它使几个线程“公平地”处理多客户端的I/O并且线程空闲时会被挂起不会占用CPU周期。     IOCP模型充分利用Windows系统内核可以实现仅用少量的几个线程来处理和多个client之间的所有通信消除了无谓的线程上下文切换最大限度的提高了网络通信的性能。 软件运行效果如下图 客户端详细代码如下 /******************************************************Copyright (c) 2024, GhY, All rights reserved.*文件 PublicDefine.h*描述 公共数据结构定义**作者 GhY*日期 2024年7月24日*版本 v1.0.0*****************************************************/ #pragma once #includestdio.h #include iostream #includewinerror.h #define WIN32_LEAN_AND_MEAN #includeWinsock2.h#define OutErr(a) std::cout error (a) std::endl \ 出错代码 WSAGetLastError() std::endl \ 出错文件 __FILE__ std::endl \ 出错行数 __LINE__ std::endl \#define OutMsg(a) std::cout (a) std::endl;#define PORT 5050 // 监听端口 #define LOCAL_HOST 127.0.0.1 // 本地回路地址 #define DATA_BUFSIZE 8192#define MAX_LISTEN_QUEUE 200#define MAX_CONNECT 3000#define MAX_DATA_LEN 2048 // 数据包长度#define SEND_DATA_LEN 4096 // 发送数据包长度/// 结构体定义 /**brief 用于IOCP的特定函数*author GhY*date 2024/07/24*/ typedef struct {OVERLAPPED Overlapped;WSABUF DataBuf;CHAR Buffer[DATA_BUFSIZE]; } PER_IO_OPERATION_DATA, *LPPER_IO_OPERATION_DATA;/**brief 用于IOCP的特定结构*author GhY*date 2024/07/24*/ typedef struct _PER_HANDLE_DATA {SOCKET _socket;CHAR _ip[32];int _port;_PER_HANDLE_DATA(){_socket NULL;memset(_ip, 0, 32);_port -1;} } PER_HANDLE_DATA, *LPPER_HANDLE_DATA;#pragma pack(1) /**brief 数据包头*author GhY*date 2024/07/24*/ typedef struct _DataHead {unsigned short _type; // 0上传数据 1转发数据2请求数据unsigned int _node; // 客户端IDunsigned long _time;_DataHead(){memset(this, 0, sizeof(_DataHead));}} TcpHead, Udp_Head;/**brief 数据包体*author GhY*date 2024/07/24*/ typedef struct _DataBody {char _srcName[32];int _length;char _data[MAX_DATA_LEN];_DataBody(){memset(this, 0, sizeof(_DataBody));}} TcpBody, UdpBody;/**brief 发送数据*author GhY*date 2024/07/24*/ typedef struct _SendData {TcpHead _head;TcpBody _body; } Tcp_SendData, Udp_SendData;#pragma pack()/**brief socket连接管理*author GhY*date 2024/07/24*/ struct ClientManager {unsigned int _id;char _name[32];SOCKET _socket;char _addr[16];int _port;ClientManager(){memset(this, 0, sizeof(ClientManager));}};/**brief 通信消息*author GhY*date 2024/07/24*/ struct Message {unsigned int _sendId;char _send_name[32];unsigned int _receiverId;char _receiverName[32];char _data[MAX_DATA_LEN];Message(){memset(this, 0, sizeof(Message));} }; /******************************************************Copyright (c) 2024, GhY, All rights reserved.*文件 application.h*描述 app基类**作者 GhY*日期 2024年7月24日*版本 v1.0.0*****************************************************/ #ifndef __APPLICATION_H__ #define __APPLICATION_H__class application { public:application();virtual ~application();/**brief Do some initialize before application lanuch*/virtual bool initinstance();/**brief Run application*/virtual int run();/**brief Exit application*/virtual bool exitinstance();};#endif // !__APPLICATION_H__#include application.happlication::application() { }application::~application() { }bool application::initinstance() {return true; }int application::run() {if (initinstance()) {run();}return exitinstance(); }bool application::exitinstance() {return true; }/******************************************************Copyright (c) 2024, GhY, All rights reserved.*文件 client.h*描述 客户端类声明**作者 GhY*日期 2024年7月24日*版本 v1.0.0*****************************************************/ #ifndef __CLIENT_H__ #define __CLIENT_H__#includestdio.h #includeiostream #include MySocket.h #include MyReceive.h #include application.h #include string #include vector #include listclass CCinData;/**描述: 客户端类*作者: GhY*日期: 2024/07/24*历史:*/ class CAppClient : public application, public sigslot::has_slots { public:CAppClient();~CAppClient();/**brief 关联信号槽*author GhY*date 2024/07/24*/void InitSigslot();/**brief 初始化*author GhY*date 2024/07/24*/bool initinstance();/**brief 退出*author GhY*date 2024/07/24*/bool exitinstance();int run();/**desc 发送数据*param: sdata 待传输数据*return void*author GhY*date 2024/07/24*version v1.0.0*history:*/void SendData(std::string* sdata);public:MySocket* m_mysocket;std::liststd::string* m_sendBufs;CCinData* m_sendData;bool m_exitFlag; // 退出标志protected:private:MyReceive* m_myrev; };/**描述: 获取输入数据类*作者: GhY*日期: 2024/07/24*历史:*/ class CCinData : public sigslot::has_slots { public:typedef sigslot::signal1std::string* SendDataEvent;SendDataEvent OnSendEvent;public:CCinData(CAppClient* app);~CCinData();void Run();private:CAppClient* m_appClient;bool m_exitFlag; };#endif //!__CLIENT_H__ /******************************************************Copyright (c) 2024, GhY, All rights reserved.*文件 client.cpp*描述 客户端类实现**作者 GhY*日期 2024年7月24日*版本 v1.0.0*****************************************************/ #include client.hDWORD WINAPI ClientCinProcess(LPVOID lpParam) {CAppClient* appclient (CAppClient*)lpParam;if (!appclient) {return 1;}if (appclient-m_sendData) {appclient-m_sendData-Run();}return 0; }DWORD WINAPI RunSendBufProcess(LPVOID lpParam) {CAppClient* appclient (CAppClient*)lpParam;if (!appclient) {return 1;}while (true) {if (appclient-m_exitFlag) {break;}if (appclient-m_sendBufs.empty()) {Sleep(300);continue;}if (appclient-m_sendBufs.size() 0) {std::string* strBuf appclient-m_sendBufs.front();appclient-m_sendBufs.pop_front();if (appclient-m_mysocket !strBuf-empty()) {appclient-m_mysocket-SendData(*strBuf);delete strBuf;}}}return 0; }CAppClient::CAppClient() {m_exitFlag false;m_mysocket new MySocket();std::string sIp g_ConfigPtr.getConfigValueWithKey(net, ip);std::string sPort g_ConfigPtr.getConfigValueWithKey(net, port);int iPort sPort.empty() ? PORT : atoi(sPort.c_str());m_mysocket-InitData(sIp, iPort);m_mysocket-ClientConnect();m_myrev new MyReceive(m_mysocket);m_sendBufs.clear();m_sendData new CCinData(this);InitSigslot(); }CAppClient::~CAppClient() {this-disconnect_all();if (m_myrev) {delete m_myrev;m_myrev nullptr;}if (m_mysocket) {m_mysocket-Close();delete m_mysocket;m_mysocket nullptr;}if (m_sendData) {delete m_sendData;m_sendData nullptr;} }bool CAppClient::initinstance() {return true; }bool CAppClient::exitinstance() {return true; }int CAppClient::run() {std::cout 使用说明输入 quit 退出程序 std::endl;std::string currentName g_ConfigPtr.getConfigValueWithKey(base, name);if (currentName.empty()) {char nameT[64] { 0 };std::cout 请输入名字;std::cin nameT;g_ConfigPtr.SetConfigValue(base, name, nameT);} else {std::cout 当前用户名 currentName.c_str() std::endl;}static int nCnt 0;char sendBuf[2000] { 0 };int recvdata 0;HANDLE hProcessIO CreateThread(NULL, 0, ClientCinProcess, this, 0, NULL);if (hProcessIO) {CloseHandle(hProcessIO);}HANDLE hProcessIO2 CreateThread(NULL, 0, RunSendBufProcess, this, 0, NULL);if (hProcessIO2) {CloseHandle(hProcessIO2);}while (true) {if (m_exitFlag) {break;}recvdata m_mysocket-ReceiveData();if (recvdata 0) {Sleep(500);} else {recvdata 0;}}return 0; }void CAppClient::SendData(std::string* sdata) {std::string* tmpdata sdata;if (tmpdata-empty()) {return;}if (tmpdata-compare(quit) 0) {m_exitFlag true;m_mysocket-Close();delete tmpdata;return;}m_sendBufs.push_back(tmpdata); }void CAppClient::InitSigslot() {if (m_sendData) {m_sendData-OnSendEvent.connect(this, CAppClient::SendData);} }CCinData::CCinData(CAppClient* app): m_appClient(app), m_exitFlag(false) {}CCinData::~CCinData() {m_exitFlag true; }void CCinData::Run() {std::cout please cin message: std::endl;std::string* sendTest new std::string(上线);OnSendEvent.emit(sendTest);while (true) {if (m_exitFlag) {break;}std::string* sendBuf new std::string();//std::cin sendBuf;getline(std::cin, *sendBuf);if (!sendBuf-empty() sendBuf-compare(quit) 0) {m_exitFlag true;}if (sendBuf-size() 0) {OnSendEvent.emit(sendBuf);} else {Sleep(500);}} }/******************************************************Copyright (c) 2024, GhY, All rights reserved.*文件 MyReceive.h*描述 处理数据类声明**作者 GhY*日期 2024年7月24日*版本 v1.0.0*****************************************************/ #ifndef __MYRECEIVE_H__ #define __MYRECEIVE_H__ #include MySocket.h/**描述: 接收数据处理类*作者: GhY*日期: 2024/07/24*历史:*/ class MyReceive : public sigslot::has_slots { public:MyReceive(MySocket* s);~MyReceive();/**brief 关联信号槽*author GhY*date 2024/07/24*/void InitSigslot();/**desc 接收数据*param: sdata 待接收数据*return void*author GhY*date 2024/07/24*version v1.0.0*history:*/void ReceiveData(Tcp_SendData* sdata);private:MySocket* m_mysocket;};#endif //!__MYRECEIVE_H__ /******************************************************Copyright (c) 2024, GhY, All rights reserved.*文件 MyReceive.cpp*描述 处理数据类实现**作者 GhY*日期 2024年7月24日*版本 v1.0.0*****************************************************/ #include MyReceive.hMyReceive::MyReceive(MySocket* s): m_mysocket(s) {InitSigslot(); }MyReceive::~MyReceive() {if (m_mysocket) {m_mysocket-disconnect_all();} }void MyReceive::InitSigslot() {if (m_mysocket) {m_mysocket-OnSelectEvent.connect(this, MyReceive::ReceiveData);} }void MyReceive::ReceiveData(Tcp_SendData* sdata) {if (!sdata) {return;}do {if (sdata-_head._type 2) {std::string tmp sdata-_body._data;g_ConfigPtr.SetConfigValue(base, id, tmp);} else {std::string tmpName sdata-_body._srcName;std::string tmp sdata-_body._data;std::cout send: tmpName.c_str() -- message: tmp.c_str() std::endl;}} while (0);} 注意 文章中依赖的文件.h.cpp请参见本专栏其他文章。 源代码下载地址源代码
http://www.hkea.cn/news/14459561/

相关文章:

  • 安安网站建设手机网站建设设计服务
  • 益阳高端网站建设网站规划书包括哪些内容
  • 建设网站应注意什么google 浏览器
  • 网站维护说明网站做的像会侵权吗
  • 沧县做网站北京装修价格
  • wordpress子主题视频wordpress 国内 优化
  • 专业的培训行业网站模板上海网站建设润滋
  • 中建八局第三建设有限公司网站北京造价信息网官网
  • 延庆宜昌网站建设网站目录怎么做301重定向
  • 建筑培训网站网站建设案例展示
  • 电子商务网站建设的过程wordpress 崩溃
  • 旅游类网站如何做推广wordpress样式错乱
  • 固定ip做网站路由设置微商城网站建设如何
  • 指数 网站权重我要网站建设
  • 怎样建设一个自己的网站开封网络推广公司
  • 网站集约化建设 要求wordpress 管理员密码
  • 票务系统网站模板百度知道app
  • 海口网站排名提升常州网站排名优化
  • 网站推广计划书怎么写免费ppt模板下载 简约
  • 楼盘网站建设方案专业全网推广建站公司
  • 磁县专业做网站wordpress apple主题
  • 重庆有那些制作网站的公司微信推广怎么做
  • 做电商不不得不知道的网站网站图片怎么做优化
  • 动漫在线制作网站南宁seo结算
  • 企业网站建站费用wordpress 显示全部分类
  • 西安手机网站开发广州做网站哪家好公司
  • 深圳商城网站哪家做的好网站后台删除二级栏目
  • 网站建设代理渠道家具网站php源码
  • 网站空间名词解释商务网站建设管理思路
  • 面料详情页设计模板厦门seo新站策划