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

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

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

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

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

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

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

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

評(píng)論