EM9160具有豐富的通訊接口,可以支持基于以太網(wǎng)和PPP(如GPRS/CDMA)的網(wǎng)絡(luò)應(yīng)用。本文主要介紹EM9160作為TCP客戶端方式的應(yīng)用示例:Step4_TCPClient。
TCP客戶端Socket編程流程
在利用Socket進(jìn)行TCP客戶端編程時,建立TCP連接的過程一般比較簡單,首先客戶端調(diào)用socket()函數(shù)建立流式套接字,然后調(diào)用connect()函數(shù)請求服務(wù)器端建立TCP連接,成功建立連接后即可與服務(wù)器端進(jìn)行TCP/IP數(shù)據(jù)通訊,流程如下:
TCPClient應(yīng)用示例
Step4_TCPClient是一個具有自動管理功能的TCP客戶端應(yīng)用示例。作為TCP客戶端主動和服務(wù)器端建立TCP連接的過程編程相對簡單,直接調(diào)用相關(guān)的Socket函數(shù)即可,建立TCP連接的功能封裝在CTCPClient類中。嵌入式的應(yīng)用場合大多是處于長期運(yùn)行無人值守的狀態(tài),可能會遇到需要一直保持TCP客戶端連接的情況,Step4_TCPClient例程基于這種需求,專門封裝了一個CTCPClientManager管理類對TCPClient的連接進(jìn)行自動管理,包括啟動建立TCP的客戶端連接、查詢TCP連接的狀態(tài)、添加多個TCP客戶端連接等功能。
CTCPClient類
CTCPClient類定義在TCPClient.H文件下,該類提供了4個公共函數(shù),以及一個數(shù)據(jù)通訊線程,調(diào)用該類中的相關(guān)函數(shù)與TCP服務(wù)器端建立連接。
class CTCPClient
{
private:
pthread_t m_thread; //通訊線程標(biāo)識符ID
//數(shù)據(jù)通訊處理線程函數(shù)
static int SocketThreadFunc( void*lparam );
public:
// TCP通訊Socket
int m_sockfd;
int m_sockclose;
int m_ExitThreadFlag;
//遠(yuǎn)程主機(jī)IP地址
char m_remoteHost[255];
//遠(yuǎn)程主機(jī)端口
int m_port;
char RecvBuf[1500];
int m_nRecvLen;
public:
CTCPClient();
virtual ~CTCPClient( );
//打開創(chuàng)建客戶端socket
int Open( char* ServerIP, int ServerPort );
//關(guān)閉客戶端socket
int Close( );
//與服務(wù)器端建立連接 并創(chuàng)建數(shù)據(jù)通訊處理線程
int Connect();
//向服務(wù)器端發(fā)送數(shù)據(jù)
int SendData( char * buf , int len);
};
Open函數(shù)執(zhí)行創(chuàng)建打開socket操作,并設(shè)置遠(yuǎn)端TCP服務(wù)器的IP和端口。
Connect函數(shù)調(diào)用connect( )與遠(yuǎn)端TCP服務(wù)器建立連接,調(diào)用select( )等待TCP連接的建立,TCP連接建立成功,則創(chuàng)建TCP數(shù)據(jù)通訊處理線程。
SocketThreadFunc函數(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)用修改此處代碼。流程如下:
CTCPClientManager類
TCP客戶端連接定義為四個狀態(tài):
enum CONNSTATE{ csWAIT, csINIT, csCLOSED, csOPEN };其中csOPEN表明TCP客戶端連接建立。
CTCPClientManager所封裝的功能函數(shù)就是根據(jù)連接的各個狀態(tài)對TCP客戶端連接進(jìn)行管理,CTCPClientManager類定義在TCPClientManager.H文件下。
class CTCPClientManager
{
private:
// TCPClient連接管理線程
static int TCPClientThreadFunc( void* lparam );
public:
TCPCLIENT_INFO m_TCPClientInfo[TCPCLIENT_MAX_NUM];
pthread_t m_thread[TCPCLIENT_MAX_NUM];
int m_nTCPClientNum;
public:
CTCPClientManager( );
~CTCPClientManager();
//添加TCP客戶端連接對象,輸入?yún)?shù)為TCP服務(wù)器的IP和端口
int AddTCPClientObject( char* pHostIP, int nHostPort );
//刪除所有TCP客戶端連接對象
int DeleteAllTCPClient( );
//設(shè)置TCP客戶端連接對象為csINIT狀態(tài)
int Open( int Idx );
//獲取TCP客戶端連接狀態(tài)
int GetTCPClientState( int Idx );
//啟動TCPClient連接管理操作,并創(chuàng)建TCPClient連接管理線程
int Start( );
//關(guān)閉TCPClient連接管理操作
int Stop( );
};
TCPClientThreadFunc函數(shù)是實現(xiàn)對TCP連接狀態(tài)管理操作的核心代碼,由于Linux下sleep的最小單位為秒,對于毫秒級的延時等待,在該函數(shù)中利用調(diào)用select( )設(shè)置相關(guān)的時間參數(shù)來實現(xiàn)。流程如下:
CTCPClientManager類的調(diào)用
CTCPClientManager類的具體使用過程:首先調(diào)用類中定義AddTCPClientObject加載TCP連接對象,然后調(diào)用類中定義Start函數(shù)來啟動TCP連接自動管理線程,Open函數(shù)將TCP連接狀態(tài)設(shè)置為csINIT狀態(tài)。本例程中主循環(huán)的操作為每隔1s查詢TCPClient連接的狀態(tài),如果狀態(tài)為csWait,程序調(diào)用Open函數(shù)將其設(shè)置為csINIT狀態(tài),則TCPC連接管理線程將自動進(jìn)行與TCP服務(wù)器端建立連接的操作。
以下為Step4_TCPClient.cpp中的相關(guān)代碼。
class CTCPClientManager TCPClntManager;
int main()
{
int i1, i2, i3;
//添加一個TCP客戶端連接對象
TCPClntManager.AddTCPClientObject( ‘192.168.201.121’, 1001 );
//啟動TCPClient連接管理操作,并創(chuàng)建TCPClient連接管理線程
TCPClntManager.Start();
for( i1=0; i1 {
//設(shè)置TCP客戶端連接初始狀態(tài),連接管理線程將自動進(jìn)行TCP的連接操作
TCPClntManager.Open(i1);
}
for(i1=0; i1《10000; i1++)
{
sleep(1);
for( i2=0; i2 {
// 查詢TCP客戶端連接狀態(tài)
i3 = TCPClntManager.GetTCPClientState(i2);
printf( ‘TCP Connect%d State: %d \n’, i2+1, i3 );
if( i3==0 )
{
//設(shè)置TCP客戶端連接初始狀態(tài),連接管理線程將自動進(jìn)行TCP連接操作
TCPClntManager.Open( i2 );
}
}
}
return 0;
}
-
Linux
+關(guān)注
關(guān)注
87文章
11511瀏覽量
213801 -
嵌入式主板
+關(guān)注
關(guān)注
7文章
6101瀏覽量
36306
發(fā)布評論請先 登錄
Linux嵌入式和單片機(jī)嵌入式的區(qū)別?
Linux的作用
嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-Linux設(shè)備驅(qū)動的分類
婦女節(jié)|從程序設(shè)計的先驅(qū)到嵌入式系統(tǒng)的革新者!

嵌入式工程師都在找的【Linux內(nèi)核調(diào)試技術(shù)】建議收藏!
嵌入式linux開發(fā)的基本步驟有哪些?
嵌入式linux開發(fā)板怎么操作
嵌入式linux開發(fā)板芯片的工作原理
C28x嵌入式應(yīng)用程序二進(jìn)制接口

開啟全新AI時代 智能嵌入式系統(tǒng)快速發(fā)展——“第六屆國產(chǎn)嵌入式操作系統(tǒng)技術(shù)與產(chǎn)業(yè)發(fā)展論壇”圓滿結(jié)束
MSP430嵌入式應(yīng)用程序二進(jìn)制接口

C6000嵌入式應(yīng)用程序二進(jìn)制接口

評論