源码文档案例可在交流群下载:QQ-75375912

* 本篇讲解的是TcpServer的使用 *

环境Ubuntu 18.04.3     编辑工具IDE QT5.13.2

在群里可以下载相关源码目录如下

我们需要的是Linux目录下的东西 将里面的东西都复制到Linux系统内

鉴于我们是简单利用TCP 开发Server 我们只需要

include,lib不过良心的作者为我们做了个install.sh和compile.sh

安装如下:

include和lib会安装在 /usr/local/include 和  /usr/local/lib64  两个目录下

打开Qt Creator 新建一个项目 Qt Widgets Application 命名为HpSocketDemo

更改Pro文件如下:

新建类MyTcpListener 包含头文件hpsocket/HPSocket.h  继承CTcpServerListener

将MyTcpListener变成单例类,再加上自己实现的事件回调类ISocketView 代码如下:

#ifndef ISOCKETVIEW_H

#define ISOCKETVIEW_H

//此处仅当教程使用 具体回传参数由各位根据需求来定

classISocketView

{

public:

virtual void onPrepareListen()=0;

virtual void onAccept()=0;

virtual void onHandShake() = 0;

virtual void onReceive()=0;

virtual void onSend()=0;

virtual void onShutdown()=0;

virtual void onClose()=0;

};

#endif // ISOCKETVIEW_H

Server执行顺序如下:

执行startServer()  导致 OnPrepareListen触发   可进行发送数据的行为

外部Client接入连接 导致onAccept触发    可进行接受数据的行为

外部Client发送数据 导致onReceive触发

外部Client断开连接导致onClose触发

执行stopServer() 导致onClose onShutdown 触发

#ifndef MYTCPLISTENER_H

#define MYTCPLISTENER_H#include "hpsocket/HPSocket.h"#include "ISocketView.h"#include #include

//这个类的需求请自行添加

classMySocketBuffer

{

public:

static MySocketBuffer* newBuffer(){ return newMySocketBuffer();}

MySocketBuffer(){}

};

classMyTcpListener:CTcpServerListener

{

public:

static MyTcpListener*getInstance();

CTcpPackServerPtr mServer;

//1.开启服务器

boolstartServer();

//2.关闭服务器

boolstopServer();

void registerView(ISocketView*view);

voidunRegisterView();

public:

//监听成功时触发

EnHandleResult OnPrepareListen(ITcpServer *pSender, SOCKET soListen);

//接受到连接时触发

EnHandleResult OnAccept(ITcpServer *pSender, CONNID dwConnID, UINT_PTR soClient);

//握手成功时触发

EnHandleResult OnHandShake(ITcpServer *pSender, CONNID dwConnID);

//收到数据时触发

EnHandleResult OnReceive(ITcpServer* pSender, CONNID dwConnID, const BYTE* pData, intiLength);

//发送数据成功触发

EnHandleResult OnSend(ITcpServer *pSender, CONNID dwConnID, const BYTE *pData, intiLength);

//服务器关闭时触发

EnHandleResult OnShutdown(ITcpServer *pSender);

//关闭某个连接时触发

EnHandleResult OnClose(ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, intiErrorCode);

private:

ISocketView *mView;

private:

//单例实现

MyTcpListener();

MyTcpListener(const MyTcpListener&);

MyTcpListener& operator=(const MyTcpListener&);

virtual ~MyTcpListener();

class CGarbo //

{

public:

CGarbo(){}

~CGarbo()

{

if(MyTcpListener::mServerListener)

{

deleteMyTcpListener::mServerListener;

}

}

};

staticCGarbo mCGarbo;

private:

static MyTcpListener*mServerListener;

staticQMutex mMutex;

};

#endif // MYTCPLISTENER_H

#include "MyTcpListener.h"MyTcpListener* MyTcpListener::mServerListener=nullptr;

QMutex MyTcpListener::mMutex;

MyTcpListener::MyTcpListener()

:mServer(this)//要想监听生效 这个必须传入监听者对象

,mView(nullptr)

{

}

MyTcpListener::~MyTcpListener()

{

}

MyTcpListener *MyTcpListener::getInstance()

{

MyTcpListener* tmp =mServerListener;

if (tmp ==nullptr)

{

QMutexLocker locker(&mMutex);

tmp =mServerListener;

if (tmp ==nullptr)

{

tmp = newMyTcpListener();

mServerListener =tmp;

}

}

returnmServerListener;

}

boolMyTcpListener::startServer()

{

//mServer ->SetSocketBufferSize(2048);

return mServer->Start("0,0,0,0",12000);

}

boolMyTcpListener::stopServer()

{

return mServer->Stop();

}

void MyTcpListener::registerView(ISocketView *view)

{

mView =view;

}

voidMyTcpListener::unRegisterView()

{

mView=nullptr;

}

EnHandleResult MyTcpListener::OnPrepareListen(ITcpServer *pSender, SOCKET soListen)

{

//回调触发 注意不能直接改UI Qt建议采用信号槽

if(mView!=nullptr)

{

mView->onPrepareListen();

}

//获取监听的ip port信息

TCHAR lpszAddress[30];

intiAddressLen;

USHORT unPort;

pSender->GetListenAddress(lpszAddress,iAddressLen,unPort);

returnHR_OK;

}

EnHandleResult MyTcpListener::OnAccept(ITcpServer *pSender, CONNID dwConnID, UINT_PTR soClient)

{

//回调触发 注意不能直接改UI Qt建议采用信号槽

if(mView!=nullptr)

{

mView->onAccept();

}

//为每一个新接入的连接 附加一个对象 因为我们是根据ID来区分连接的

pSender->SetConnectionExtra(dwConnID,MySocketBuffer::newBuffer());

returnHR_OK;

}

EnHandleResult MyTcpListener::OnHandShake(ITcpServer *pSender, CONNID dwConnID)

{

//回调触发 注意不能直接改UI Qt建议采用信号槽

if(mView!=nullptr)

{

mView->onHandShake();

}

returnHR_OK;

}

EnHandleResult MyTcpListener::OnReceive(ITcpServer *pSender, CONNID dwConnID, const BYTE *pData, intiLength)

{

//特别注意这个回调触发的方式 当同一个ID触发时是按照顺序触发

//如果是不同ID触发则是线程触发 所以在这里不能做阻塞处理

//特别是不能加锁做同步处理

//如果想高速处理数据 请采用线程池方式

//回调触发 注意不能直接改UI Qt建议采用信号槽

if(mView!=nullptr)

{

mView->onReceive();

}

//这里就可以采用Accept时附加的对象做处理,比如定义方法 数据缓存等

MySocketBuffer * pSocketBuffer=nullptr;

pSender->GetConnectionExtra(dwConnID,(PVOID*)pSocketBuffer);

if(pSocketBuffer!=nullptr)

{

//可在此对pSocketBuffer做操作

}

returnHR_OK;

}

EnHandleResult MyTcpListener::OnSend(ITcpServer *pSender, CONNID dwConnID, const BYTE *pData, intiLength)

{

//回调触发 注意不能直接改UI Qt建议采用信号槽

if(mView!=nullptr)

{

mView->onSend();

}

returnHR_OK;

}

EnHandleResult MyTcpListener::OnShutdown(ITcpServer *pSender)

{

//回调触发 注意不能直接改UI Qt建议采用信号槽

if(mView!=nullptr)

{

mView->onShutdown();

}

returnHR_OK;

}

EnHandleResult MyTcpListener::OnClose(ITcpServer *pSender, CONNID dwConnID, EnSocketOperation enOperation, intiErrorCode)

{

//回调触发 注意不能直接改UI Qt建议采用信号槽

if(mView!=nullptr)

{

mView->onClose();

}

//当一个连接关闭时 我们需要自己将onAccept 时 new出来的对象delete掉

MySocketBuffer * pSocketBuffer=nullptr;

pSender->GetConnectionExtra(dwConnID,(PVOID*)pSocketBuffer);

if(pSocketBuffer!=nullptr){ deletepSocketBuffer;}

returnHR_OK;

}

一个简单的TCP服务器就搭建好了

linux 网络通信框架,Linux下 C++ HPSocket通信框架的简单使用相关推荐

  1. .net3.5下的Socket通信框架

    .net3.5下的Socket通信框架 1:前言 写博客时间不短了但是一直不知道怎么开头.索性就开门见山吧. 这篇文章主要给大家介绍.net3.5下的Socket通信,主要从事件池,缓冲区以及协议三个 ...

  2. 高可靠性的php通信框架,跨平台PHP高可靠性通信框架,OHSCE_V0.1.25 发布

    Open HI-REL Signal Communication Engine(简称OHSCE)是一款高可靠性跨平台的PHP通信框架,对Windows友好且同时支持Linux和OS X.对TCP.UD ...

  3. 【EventBus】事件通信框架 ( 总结 | 手写事件通信框架完整代码示例 | 测试上述框架 )

    文章目录 一.消息中心 二.订阅方法时的注解 三.订阅方法封装 四.订阅对象-方法封装 五.线程模式 六.Activity 中测试上述框架 七.博客源码 一.消息中心 该消息中心是事件通信框架的核心代 ...

  4. win8手动添加linux启动项,Win8下添加开机启动项的简单办法

    Win8的用户越来越多,大家会发现任务管理器新添加了一个"启动"的功能,我们可以在其中随意删减开机启动项,以达到提高开机效率的目的.但是怎样才能添加我们平时经常用到的软件作为开机启 ...

  5. Linux和Windows系统下:安装Anaconda、Paddle、tensorflow、pytorch,GPU[cuda、cudnn]、CPU安装教学,以及查看CPU、GPU内存使用情况

    Linux和Windows系统下安装深度学习框架所需支持:Anaconda.Paddlepaddle.Paddlenlp.pytorch,含GPU.CPU版本详细安装过程 1.下载 Anaconda ...

  6. ctk编译linux,CTK插件框架学习5-插件间通信(Netlink实现热拔插监控)

    本章来写一个插件,插件功能为通过NETLINK读取linux系统中的hotplug信息,比如usb.SD卡.磁盘等设备的插拔事件产生的信息,将读到的信息通过插件间通信的方式发出. 1. eventad ...

  7. Linux操作系统下的串口通信

    1 Linux操作系统下的串口通信学习笔记   一.什么是串口通信 串口通信是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送.使用 串口通信时,发送和接收到的每一个字符实际上都是一次一 ...

  8. linux下的socket通信

    linux下的socket通信 在linux下,无论多么复杂的服务器或客户端程序,无论什么编程语言实现的,其底层都离不开linux内核提供的系统调用(也就十多个函数),其网络通信的基本流程一定如下所述 ...

  9. Linux第二次试验:Linux下的进程通信实验

    Linux第二次试验:Linux下的进程通信实验 前言 一.实验目的 二.实验工具与设备 三.实验预备知识 三.实验内容和步骤 五.实验代码及步骤截图 六.实验总结 前言 为了帮助同学们完成痛苦的实验 ...

  10. STM32串口通信代码、ASCII码、XU4串口通信,printf只会转换为无符号类型,linux下的串口通信程序

    1.其里面的的通信协议是是自己定的,这里 是检测到数据的结尾是以0x0d.0x0a结尾,则表示接受的数据完成了,这个数据是我想要的,这样子就不会出现一些错乱的数据信息.其中的0x8000.0x4000 ...

最新文章

  1. webpack从入门到精通(四)优化打包配置总结②
  2. 现代支付行号查询系统_旅游景区智能管理系统-景区智能导航软件
  3. 匿名内部类和匿名类_匿名schanonymous
  4. 倒N字形排列java_Java排序8大算法实现
  5. 弹出菜单快捷键的使用方法
  6. withRouter有什么用?干嘛用?为啥要用它啊???一分钟理解!
  7. 《网上图书销售系统》功能需求
  8. 2015年3月计算机二级vb题库,2015年计算机二级vb机试试题
  9. C语言递归求圆周率,python中的递归问题,求圆周率
  10. 201671030111 词频统计软件项目报告
  11. 汇编语言中的start有什么用?(start只是一个标号,程序不一定非要从这儿才开始执行)
  12. b站《史上最全unity3D教程》笔记1-04
  13. 魔百盒CM201-2_YS(易视腾代工)_MV300/300H芯片_蓝牙语音版_卡刷通刷_刷机固件
  14. OpenCV合并图片cv2.add、无缝连接图片cv2.addWeighted、图片克隆cv2.seamlessClone 效果对比、按位运算bitwise_and
  15. 好看的皮囊 · 也是大自然的杰作 · 全球高质量 · 美图 · 集中营 · 美女 · 2017-08-23期...
  16. 简洁新颖风格Emlog模板程序源码
  17. 2022年4月语音合成(TTS)和语音识别(ASR)论文月报
  18. Android之Fragment回退栈详解
  19. 模电数电自动控制原理实验台QY-MS301C
  20. 台式计算机不休眠,台式机不休眠的解决方法

热门文章

  1. html文档用什么浏览器打开,用什么打开HTML文件?
  2. cholesky分解java代码_cholesky分解
  3. Flink在bilibili的优化与实践
  4. 阿里云大学:云端搭建Linux学习环境
  5. 高等数学在计算机领域的应用,计算机专业高等数学应用性改革探索论文
  6. 中小企业生产信息化:私有系统还是云方案?
  7. 分析图片相似度的软件,图片相似度比对算法
  8. iptables如何删除一条规则
  9. Linux文件|菜鸟教程
  10. 过滤文本或字符串中的emoji表情(包括微信自带表情处理)