EM9160的主要功能之一就是作為網(wǎng)絡(luò)平臺,工控領(lǐng)域中比較常見的網(wǎng)絡(luò)應(yīng)用是利用TCP/IP協(xié)議進行數(shù)據(jù)通訊。在網(wǎng)絡(luò)應(yīng)用中,通常都實現(xiàn)多連接的應(yīng)用需求,本文主要介紹EM9160作為TCP服務(wù)器方式的應(yīng)用——支持多連接的TCP服務(wù)器示例程序:Step3_TCPServer。
TCP Socket編程
在進行網(wǎng)絡(luò)應(yīng)用程序開發(fā)方面大多是采用套接字Socket技術(shù),嵌入式Linux的系統(tǒng)平臺上也是如此。Socket編程的基本函數(shù)有
socket( )、bind( )、listen( )、accept( )、send( )、sendto( )、recv( )、recvfrom( )、connect( )等。
支持多連接的TCP服務(wù)器應(yīng)用示例
Step3_TCPServe是一個支持多個客戶端的連接TCPServer示例,該例程采用了面向?qū)ο蟮?a href="http://www.brongaenegriffin.com/tags/C++/" target="_blank">C++編程,創(chuàng)建了CTCPServer和CTCPCustom兩個類,其中CTCPServer類負(fù)責(zé)偵聽客戶端的連接,一旦有客戶端請求連接,它就負(fù)責(zé)接受此連接,并創(chuàng)建一個新的CTCPCustom類對象與客戶端進行通訊,然后CTCPServer類接著監(jiān)聽客戶端的連接請求,其流程如下:
CTCPServer類
CTCPServer類定義在TCPServer.h文件下,該類提供了3個公共函數(shù),以及一個Socket偵聽線程,公共的函數(shù)中Open( )、Close( )用于啟動或是關(guān)閉TCP服務(wù)。
class CTCPServer
{
private:
pthread_t m_thread; //通訊線程標(biāo)識符ID
//Socket偵聽線程
static int SocketListenThread( void*lparam );
public:
int m_sockfd; //TCP服務(wù)監(jiān)聽socket
int m_ExitThreadFlag;
int m_LocalPort; //設(shè)置服務(wù)端口號
CTCPServer();
virtual ~CTCPServer();
int Open(); // 打開TCP服務(wù)
int Close(); // 關(guān)閉TCP服務(wù)
// 刪除一個客戶端對象連接 釋放資源
int RemoveClientSocketObject( void* lparam );
};
在Open( )函數(shù)中實現(xiàn)了打開套接字,將套接字設(shè)置為偵聽套接字,并創(chuàng)建偵聽客戶端連接線程。在Linux應(yīng)用程序中創(chuàng)建線程的方法在《嵌入式Linux串口通訊的C++設(shè)計》中有相關(guān)的說明,在該例程中也是采取的同樣方式。
SocketListenThread函數(shù)中調(diào)用select( )偵聽客戶端的TCP連接,流程如下:
同樣的需要注意的是,select( )函數(shù)中的時間參數(shù)在Linux下每次都需要重新賦值,否則會自動歸0。CTCPServer類的實現(xiàn)代碼請參見TCPServer.CPP文件。
CTCPCustom類
CTCPCustom的定義在TCPCustom.h文件下。
class CTCPCustom
{
public:
CTCPCustom();
virtual ~CTCPCustom();
public:
char m_RemoteHost[100]; //遠程主機IP地址
int m_RemotePort; //遠程主機端口號
int m_socketfd; //通訊socket
int m_SocketEnable;
int m_ExitThreadFlag;
CTCPServer* m_pTCPServer;
private:
// 通訊線程函數(shù)
pthread_t m_thread; //通訊線程標(biāo)識符ID
static void* SocketDataThread(void* lparam); //TCP連接數(shù)據(jù)通訊線程
public:
int RecvLen;
char RecvBuf[1500];
// 打開socket,創(chuàng)建通訊線程
int Open(void* lparam);
// 關(guān)閉socket,關(guān)閉線程,釋放Socket資源
int Close();
// 向客戶端發(fā)送數(shù)據(jù)
int SendData(const char * buf , int len );
};
其中的SocketDataThread函數(shù)是實現(xiàn)TCP連接數(shù)據(jù)通訊的核心代碼,在該函數(shù)中調(diào)用select( )等待TCP連接的通訊數(shù)據(jù),對于接收的TCP連接數(shù)據(jù)的處理也是在該函數(shù)中實現(xiàn),在本例程中處理為簡單的數(shù)據(jù)回發(fā),用戶可結(jié)合實際的應(yīng)用修改此處代碼,流程如下:
CTCPServer類的調(diào)用
CTCPSerer類的具體使用也比較簡單,主要是調(diào)用對于類中定義Open函數(shù)來啟動各個TCP通訊線程,反而在主循環(huán)中需要實現(xiàn)的功能代碼不多了,在本例程中僅僅為每隔1s輸出提示信息。以下為Step3_TCPServer.cpp中的相關(guān)代碼。
class CTCPServer m_TCPServer;
int main()
{
int i1;
printf( ‘Step3_TCPTest V1.0\n’ );
// 給TCP服務(wù)器端口賦值
m_TCPServer.m_LocalPort = 1001;
// 創(chuàng)建Socket,啟動TCP服務(wù)器偵聽線程
i1 = m_TCPServer.Open( );
if( i1《0 )
{
printf( ‘TCP Server start fail\n’);
return -1;
}
// 進入主循環(huán),主要是負(fù)責(zé)管理工作
for( i1=0; i1《10000;i1++) //實際應(yīng)用時,可設(shè)置為無限循環(huán)
{
sleep(1);
printf( ‘%d \n’, i1+1);
}
m_TCPServer.Close( );
return 0;
}
-
Linux
+關(guān)注
關(guān)注
88文章
11579瀏覽量
217060 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6107瀏覽量
36813
發(fā)布評論請先 登錄
英創(chuàng)支持Linux高級客戶自行移植內(nèi)核
英創(chuàng)Eclipse支持在線調(diào)試Linux應(yīng)用程序
英創(chuàng)串口WiFi方案使用說明
采用嵌入式處理器PXA270與ARM-Linux相結(jié)合的Web服務(wù)器構(gòu)建
如何使用tcp連接自己搭建的服務(wù)器?
英創(chuàng)信息技術(shù)ARM9工控主板WinCE應(yīng)用程序遠程控制應(yīng)用
英創(chuàng)信息技術(shù)ARM9主板上運行案例解析

英創(chuàng)信息技術(shù)工控主板網(wǎng)絡(luò)變壓器連接方法

英創(chuàng)信息技術(shù)Qt開發(fā)環(huán)境的搭建介紹

英創(chuàng)信息技術(shù)Linux工控主板支持3G網(wǎng)卡介紹

英創(chuàng)信息技術(shù)高性能FTP服務(wù)器Linux工控主板上的移植

英創(chuàng)信息技術(shù)Windows下STM32單片機eclipse編譯環(huán)境搭建簡介

卓嵐信息技術(shù)普通單串口服務(wù)器ZLAN5102概述

Linux下網(wǎng)絡(luò)編程TCP并發(fā)服務(wù)器和TCP客戶端程序免費下載

Linux下TCP網(wǎng)絡(luò)編程-創(chuàng)建服務(wù)器與客戶端

評論