嵌入式Linux系统 TCP数据转发服务器

本章节的代码在目录:…\tutorials\Patchs\5. TCP转发服务器

《嵌入式Linux系统 TCP数据转发服务器》

1 link

对应的源码link.h 和 link.c,用来快速搭建TCP服务器/客户端的程序,基于前面TCP和epoll的章节,基本架构:

《嵌入式Linux系统 TCP数据转发服务器》

Network Worker指的是TCP服务器/客户端,接收到的数据会经由Parser再到Handler。

接口文件link.h内容如下:

全局初始化link_init,使用完需要释放资源的link_release

《嵌入式Linux系统 TCP数据转发服务器》

创建TCP服务器link_build_tcp_server以及客户端link_connect_tcp_server

《嵌入式Linux系统 TCP数据转发服务器》

单次轮询link_loop,无限轮询link_loop_forever

《嵌入式Linux系统 TCP数据转发服务器》

2 linker

linker体现在源码文件:linker.h linker.cpp,是对link的C++封装。

《嵌入式Linux系统 TCP数据转发服务器》

其中成员函数establish就是建立TCP连接,connect是连接服务器。

主框架是C++时可以包含linker进行使用。

3 基本应用

3.1服务器

基于link来构建TCP服务器是非常简单的,源码见tcp_server.c :

《嵌入式Linux系统 TCP数据转发服务器》

补充说明两个地方,parser和handler:

parser:由于TCP传输的是流数据,因此我们需要在这个地方截取出完整的报文出来;

hansler: 完整报文最终处理的函数。

继续往后面看,我们会有一个实例(基于linker)讲解如何从流数据中截取出JSON格式的报文进行处理。

编译命令:make server

3.2客户端

客户端也很简单:

《嵌入式Linux系统 TCP数据转发服务器》

同样的,有数据过来时会经过parser再到handler。

编译命令:make client

 

编译完成后,输出可执行文件:c_server 和 c_client

程序可以直接运行~

4  代理服务器

代理服务器的功能是接收数据,通过parser解析出JSON报文给handler进行处理,我们可以基于6.4的tcp_server.c来完成;但这里我们选择用c++来实现,大同小异,大家可以移植cJSON进来,然后基于tcp_server.c完成这个功能。

c++的实现代码在tcp_task.cpp中:

《嵌入式Linux系统 TCP数据转发服务器》

定义了两个类:tcp_task和json_task,继承关系:linker -> tcp_task -> json_task,然后json_task重写packet和handle,实际上packet就是parser;主函数通过json_task完成TCP服务器的搭建:

《嵌入式Linux系统 TCP数据转发服务器》

当我们收到数据时,会进入到json_task的packet中,因此我们需要在packet中对流数据进行解析。

《嵌入式Linux系统 TCP数据转发服务器》

这段代码完成流数据截取JSON报文的逻辑,接着到达handle中:

 

《嵌入式Linux系统 TCP数据转发服务器》

JSON报文包含did和behavior,behavior取值是register和send;假设我们有一台设备(TCP客户端)连接进来,首先需要进行register然后才能向已经注册的设备发送数据报文。

编译:直接 make 即可,编译完成输出文件cpp_server:

《嵌入式Linux系统 TCP数据转发服务器》

运行cpp_server和c_client:

《嵌入式Linux系统 TCP数据转发服务器》

客户端发送:{“did”:”123456″,”behavior”:”register”}

服务端回复:{“ack”:”ok”}

我们可以在手机上下载一个TCP的终端,然后尝试连接到这个服务器上发送数据;需要注意的是,手机需要和终端保持在同一个局域网下,查看终端的ip可以用ifconfig:

《嵌入式Linux系统 TCP数据转发服务器》

比如我查到的IP是192.168.10.228

因此手机APP连接TCP也需要指定这个IP地址:

《嵌入式Linux系统 TCP数据转发服务器》

手机发送:

{“did”:”333333″,”behavior”:”send”,”target”:”123456″,”message”:”Hi, my did is 333333″}

这个JSON报文会被服务器解析,由于behavior是send,目标target是123456,因此会把message也就是:”Hi, my did is 333333″转发出去;同时服务器回复手机APP响应信息ack。

另一个终端会收到来自服务器转发的数据如下:

《嵌入式Linux系统 TCP数据转发服务器》

5  补充说明

link和linker的源码具体实现大家可以看link.c和linker.cpp,有疑问的地方或者不理解的地方可以找技术人员咨询,该版本的源码比较老,最新的程序应用在产品当中了,可以找技术人员咨询获取更多支持和更新版本的程序源码~

 

===================================================================================================================================================================

如果觉得对您有帮助并想进一步深入学习交流可以扫描以下微信二维码或加入QQ群:928840648

欢迎共同学习成长,有一群爱学习的小伙伴一起勉励!!一起加油!!也可点击

《嵌入式Linux系统 TCP数据转发服务器》

 

笔者基于嵌入式系统框架内容如下整理编辑:

 

《嵌入式Linux系统 TCP数据转发服务器》

    原文作者:HomeByte
    原文地址: https://blog.csdn.net/HomeByte/article/details/109553585
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞