arm linux 远程链接,ARM Linux环境下多连接TCP服务器编程示例

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

TCP Socket编程

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

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

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

uid-22670933-id-1771637.html

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串口通讯的C++设计》中有相关的说明,在该例程中也是采取的同样方式。

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

uid-22670933-id-1771637.html

同样的需要注意的是,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连接数据的处理也是在该函数中实现,在本例程中处理为简单的数据回发,用户可结合实际的应用修改此处代码,流程如下:

uid-22670933-id-1771637.html

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值