嵌入式Linux工控主板EM9160的主要功能之一就是作为网络平台,工控领域中比较常见的网络应用是利用TCP/IP协议进行数据通讯。在网络应用中,通常都实现多连接的应用需求,本文主要介绍EM9160作为TCP服务器方式的应用——支持多连接的TCP服务器示例程序:Step3_TCPServer。

TCP Socket编程

在进行网络应用程序开发方面大多是采用套接字Socket技术,嵌入式Linux的系统平台上也是如此。Socket编程的基本函数有socket( )、bind( )、listen( )、accept( )、send( )、sendto( )、recv( )、recvfrom( )、connect( )等。

支持多连接的TCP服务器应用示例

Step3_TCPServe是一个支持多个客户端的连接TCPServer示例,该例程采用了面向对象的C++编程,创建了CTCPServer和CTCPCustom两个类,其中CTCPServer类负责侦听客户端的连接,一旦有客户端请求连接,它就负责接受此连接,并创建一个新的CTCPCustom类对象与客户端进行通讯,然后CTCPServer类接着监听客户端的连接请求,其流程如下:

CTCPServer类

CTCPServer类定义在TCPServer.h文件下,该类提供了3个公共函数,以及一个Socket侦听线程,公共的函数中Open( )、Close( )用于启动或是关闭TCP服务。

class CTCPServer

{

private:

pthread_t m_thread; //通讯线程标识符ID

//Socket侦听线程

static int SocketListenThread( void*lparam );

public:

intm_sockfd; //TCP服务监听socket

int m_ExitThreadFlag;

intm_LocalPort; //设置服务端口号

CTCPServer();

virtual~CTCPServer();

int Open(); // 打开TCP服务

int Close(); // 关闭TCP服务

// 删除一个客户端对象连接 释放资源

int RemoveClientSocketObject(void* lparam );

};

在Open( )函数中实现了打开套接字,将套接字设置为侦听套接字,并创建侦听客户端连接线程。在Linux应用程序中创建线程的方法在《嵌入式Linux串口通讯的C++设计》中有相关的说明,在该例程中也是采取的同样方式。

SocketListenThread函数中调用select( )侦听客户端的TCP连接,流程如下:

同样的需要注意的是,select( )函数中的时间参数在Linux下每次都需要重新赋值,否则会自动归0。CTCPServer类的实现代码请参见TCPServer.CPP文件。

CTCPCustom类

CTCPCustom的定义在TCPCustom.h文件下。

class CTCPCustom

{

public:

CTCPCustom();

virtual ~CTCPCustom();

public:

char m_RemoteHost[100]; //远程主机IP地址

int m_RemotePort; //远程主机端口号                intm_socketfd; //通讯socket

int m_SocketEnable;

int m_ExitThreadFlag;

CTCPServer* m_pTCPServer;

private:

// 通讯线程函数

pthread_t m_thread; //通讯线程标识符ID

static void* SocketDataThread(void* lparam); //TCP连接数据通讯线程

public:

int RecvLen;

charRecvBuf[1500];

// 打开socket,创建通讯线程                int Open(void* lparam);

// 关闭socket,关闭线程,释放Socket资源

int Close();

// 向客户端发送数据

int SendData(const char * buf , int len );

};

其中的SocketDataThread函数是实现TCP连接数据通讯的核心代码,在该函数中调用select( )等待TCP连接的通讯数据,对于接收的TCP连接数据的处理也是在该函数中实现,在本例程中处理为简单的数据回发,用户可结合实际的应用修改此处代码,流程如下:

CTCPServer类的调用

CTCPSerer类的具体使用也比较简单,主要是调用对于类中定义Open函数来启动各个TCP通讯线程,反而在主循环中需要实现的功能代码不多了,在本例程中仅仅为每隔1s输出提示信息。以下为Step3_TCPServer.cpp中的相关代码。

class CTCPServer m_TCPServer;

int main()

{

int i1;

printf( 'Step3_TCPTest V1.0\n' );

// 给TCP服务器端口赋值

m_TCPServer.m_LocalPort = 1001;

// 创建Socket,启动TCP服务器侦听线程

i1 = m_TCPServer.Open( );

if( i1<0 )

{

printf( 'TCP Server start fail\n');

return -1;

}

// 进入主循环,主要是负责管理工作

for( i1=0; i1<10000;i1++) //实际应用时,可设置为无限循环

{

sleep(1);

printf( '%d \n', i1+1);

}

m_TCPServer.Close( );

return 0;

}

arm linux tcp,ARM Linux多连接TCP服务器的应用程序设计相关推荐

  1. Linux下连接Mysql服务器的方式

    一:mysql连接简介 1.linux下mysql的连接方式有三种: 本地mysql命令连接 客户端命令连接 脚本语言封装方法连接 2.linux下mysql的连接方法有两种: TCP/IP协议连接 ...

  2. 在linux中连接mysql数据库服务器_Linux下连接Mysql服务器的方式

    一:mysql连接简介 1.linux下mysql的连接方式有三种: 本地mysql命令连接 客户端命令连接 脚本语言封装方法连接 2.linux下mysql的连接方法有两种: TCP/IP协议连接 ...

  3. linux踢出多余tty连接终端

    linux踢出多余tty连接终端 服务器连接终端查看并踢出 [root@localhost ~]# who -------查看当前有那么多终端正在连接中 root tty1 2022-02-17 11 ...

  4. linux上mysql允许远程连接,linux下mysql允许远程连接

    1. MySql安装教程 https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html 默认情况下mysq的 roo ...

  5. 华为手机连接电脑显示无法连接服务器,无法连接到服务器电脑

    无法连接到服务器电脑 内容精选 换一换 系统提示无法下载脚本或使用Linux系统方式二安装Agent时失败.原因1:DNS无法正常解析obs.myhuaweicloud.com域名.原因2:目标云服务 ...

  6. linux qt wifi连接,贡献自己写的,在linux,arm下的屏幕搜索wifi并连接(qt,多选择,wifi按信号排列)...

    当前位置:我的异常网» Linux/Unix » 贡献自己写的,在linux,arm下的屏幕搜索wifi并连接 贡献自己写的,在linux,arm下的屏幕搜索wifi并连接(qt,多选择,wifi按信 ...

  7. linux 限制连接时间,linux抵御DDoS攻击方法 通过iptables限制TCP连接和频率

    cc攻击一到就有点兵临城下的感觉,正确的设置防护规则可以做到临危不乱,这里给出一个iptables对ip进行连接频率和并发限制,限制单ip连接和频率的设置规则的介绍,下面我们来详细了解linux抵御 ...

  8. 从Linux源码看Socket(TCP)的listen及连接队列

    从Linux源码看Socket(TCP)的listen及连接队列 前言 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 今天笔者就来从Linux源码的角度看 ...

  9. qt linux wifi,在linux,arm上的屏幕搜索wifi并连接(qt,多选择,wifi按信号排列)转...

    先上代码!! #include "widget.h" #include "ui_widget.h" #include #include Widget::Widg ...

最新文章

  1. 常用的图像特征颜色特征、纹理特征、形状特征、空间关系特征
  2. Netty介绍 与第一个Netty实例
  3. Android复习09【内容提供者、音乐播放器(附完整工程文件)】
  4. opengl加载显示3D模型PLY类型文件
  5. DataKeyNames
  6. POJ1265(Pick定理的应用)
  7. hiveserver或者hive启动出现Expected authority at index 7问题解决
  8. hibernate(nested transactions not supported)异常
  9. Codeforces Round #684 (Div. 2)
  10. 实模式切换到保护模式,为什么要开启A20地址线(系统升级产生的兼容性问题)
  11. 21OGNL与ValueStack(VS)-静态方法访问
  12. Java服务器 dm Server
  13. AspxTreeList获取选中项的值
  14. 微波遥感SNAP(二)——基于Sentinel-1雷达数据反演矿区地表形变
  15. 2019 支付宝App支付 --- PHP
  16. ERP的模块流程/组织架构和其他基础知识
  17. oracle匹配excel数据,ORACLE与excel的数据互传方法
  18. 融资2500万美元,#Spatial从协作办公进化到元宇宙产品,#NFT创作生态
  19. WIN10 kernel security check failure蓝屏解决策略
  20. 找玩具 概率 dfs

热门文章

  1. UTF-8 和 Unicode 的区别
  2. C++11多线程のfuture,promise,package_task
  3. Laravel Homestead安装笔记
  4. C#计算程序的运行时间
  5. 程序人生:初学者最常问的几个问题
  6. 删除git中缓存的用户名和密码
  7. 踩坑:VScode 集成 eslint 插件
  8. bootstrap table 主子表 局部数据刷新(刷新子表)
  9. Uncaught RangeError: Maximum call stack size exceeded解决思路
  10. jQuery 1.11 / 2.1 beta 版发布