PXA270嵌入式系統在Socket通信的應用
1 引言
本文引用地址:http://dyxdggzs.com/article/201612/327788.htm英特爾公司于2003年底推出了性能最為強勁的PXA27x系列嵌入式處理器,PXA27x系列嵌入式處理器基于A(yíng)RMv5E的Xscale核心,最高頻率可達624MHz.作為一款性能極其強勁的嵌入式處理器,配合嵌入式Linux或Wince操作系統,PXA270理論上可以支持任何媒體格式,并通過(guò)軟件升級,支持未來(lái)媒體格式。它最初出現在PDA(比如惠普HP4700)和智能手機(如MOTO E680)上。因此它的擴展接口相當豐富,擴展接口有SD/SDIO/MMC、CF/PCMCIA、CMOS/CCD CAMERA、藍牙、USB1.1、OTG等。
Socket接口是TCP/IP網(wǎng)絡(luò )的API,socket接口定義了許多函數或例程,程序員可以用它們來(lái)開(kāi)發(fā)TCP/IP網(wǎng)絡(luò )上的應用程序。要學(xué)Internet上的TCP/IP網(wǎng)絡(luò )編程,必須理解Socket接口。Socket接口設計者最先是將接口放在Unix操作系統里面的。如果了解Unix系統的輸入和輸出的話(huà),就很容易了解Socket了。網(wǎng)絡(luò )的Socket數據傳輸是一種特殊的I/O,Socket也是一種文件描述符。
2 系統設計
系統的設計分為服務(wù)器端和客戶(hù)端設計兩部分,服務(wù)器端為運行Linux操作系統的PC機,客戶(hù)端為PXA270系統,在該系統中移植和構建Linux嵌入式操作系統,兩者通過(guò)Switch交換機進(jìn)行網(wǎng)絡(luò )通信。
2.1 系統工作原理
在Linux 操作系統中,Socket 屬于文件系統的一部分,網(wǎng)絡(luò )通信可以被看作是對文件的讀取。Linux 擁有POSIX 標準庫函數,Socket()、Bind()、Sendto()、Recvfrom()等庫函數可以方便地實(shí)現客戶(hù)/ 服務(wù)器模型中數據的傳送與接收。系統設計主要的目的是完成服務(wù)器和客戶(hù)端網(wǎng)絡(luò )通信的實(shí)現。首先啟動(dòng)宿主機和客戶(hù)機的操作系統Linux,然后每個(gè)模塊加載網(wǎng)絡(luò )設備驅動(dòng)程序,最后通過(guò)TCP/IP協(xié)議建立雙方的通信鏈路,完成Socket通信,詳細情況如圖1所示。
2.2 嵌入式TCP/IP協(xié)議架構
TCP/IP(TransmissionControlProtocol/InternetProtocol)的簡(jiǎn)寫(xiě),中文譯名為傳輸控制協(xié)議/因特網(wǎng)互聯(lián)協(xié)議,又叫網(wǎng)絡(luò )通訊協(xié)議,這個(gè)協(xié)議是Internet最基本的協(xié)議、Internet國際互聯(lián)網(wǎng)絡(luò )的基礎,簡(jiǎn)單地說(shuō),就是由網(wǎng)絡(luò )層的IP協(xié)議和傳輸層的TCP協(xié)議組成的。TCP/IP定義了電子設備(比如計算機)如何連入因特網(wǎng),以及數據如何在它們之間傳輸的標準。TCP/IP是一個(gè)四層的分層體系結構。高層為傳輸控制協(xié)議,它負責聚集信息或把文件拆分成更小的包。低層是網(wǎng)際協(xié)議,它處理每個(gè)包的地址部分,使這些包正確的到達目的地。
嵌入式系統作為T(mén)CP服務(wù)器,在三次握手建立連接的過(guò)程中,嵌入式系統作為監聽(tīng)狀態(tài)的服務(wù)器,處于LISTEN狀態(tài),等待對方發(fā)起連接。當它接收到SYN數據片,立即發(fā)出SYN+ACK的數據片確認收到對方的SYN,此時(shí)變?yōu)镾YN_ RECEIVED狀態(tài)。再接收到對方返回的一個(gè)包含ACK的空數據片則三次握手完成,進(jìn)入ESTABLISHED狀態(tài),最后進(jìn)行TCP數據通訊。

圖1 系統的原理示意圖
嵌入式系統建立連接時(shí)初始化序列號,然后根據對方發(fā)包中的值來(lái)確定序列號,不記憶序列號,不能識別重復報文。嵌入式服務(wù)器僅僅在服務(wù)器端響應客戶(hù)端的請求,接收一個(gè)發(fā)送一個(gè)確認回答,不考慮失序問(wèn)題。同時(shí)接收到TCP請求后,將存儲于發(fā)送緩沖區中的數據立即發(fā)送即可,只需一個(gè)數據包就能完成,也不需考慮失序問(wèn)題。
因為嵌入式系統采用滑動(dòng)窗口為1的傳輸方式,即發(fā)送一次數據包就等待返回應答,因此當接收不到確認包,就認為自己發(fā)送的包丟失,直接發(fā)送上次發(fā)送的數據。TCP的連接中,當客戶(hù)機異常導致連接崩潰時(shí),嵌入式系統發(fā)數據時(shí)會(huì )被回復復位信號,回到初始狀態(tài)。嵌入式TCP/IP協(xié)議如圖2所示。
嵌入式系統是"控制、監視或者輔助裝置、機器和設備運行的裝置"(devicesusedtocontrol,monitor,orassisttheoperationofequipment,machineryorplants)。從中可以看出嵌入式系統是軟件和硬件的綜合體,還可以涵蓋機械等附屬裝置。目前國內一個(gè)普遍被認同的定義是:以應用為中心、以計算機技術(shù)為基礎、軟件硬件可裁剪、適應應用系統對功能、可靠性、成本、體積、功耗嚴格要求的專(zhuān)用計算機系統。
3 客戶(hù)端/服務(wù)器端功能設計
在TCP/IP網(wǎng)絡(luò )中,通信的兩個(gè)進(jìn)程間相互作用的主要模式是客戶(hù)/服務(wù)器模式,即客戶(hù)端向服務(wù)器端發(fā)出服務(wù)請求,服務(wù)器接收到請求后,提供相應的服務(wù)??蛻?hù)/服務(wù)器模式在操作過(guò)程中采取的是主動(dòng)請求方式。

圖2 嵌入式TCP/IP圖解
3.1 客戶(hù)端程序設計
socket是面向客戶(hù)/服務(wù)器模型而設計的,針對客戶(hù)和服務(wù)器程序提供不同的socket系統調用??蛻?hù)隨機申請一個(gè)socket(相當于一個(gè)想打電話(huà)的人可以在任何一臺入網(wǎng)電話(huà)上撥號呼叫),系統為之分配一個(gè)socket號;服務(wù)器擁有全局公認的socket,任何客戶(hù)都可以向它發(fā)出連接請求和信息請求(相當于一個(gè)被呼叫的電話(huà)擁有一個(gè)呼叫方知道的電話(huà)號碼)。
客戶(hù)端可以向服務(wù)器端發(fā)送連接請求,并且客戶(hù)端也可以接收到來(lái)自服務(wù)器端發(fā)送回來(lái)的數據??蛻?hù)端可以判斷當前自己的工作狀態(tài),如連接的建立,啟動(dòng)的成功和數據包通信的個(gè)數等??蛻?hù)端程序設計主要按以下的步驟完成函數的調用:
①建立自己的Socket(并驗證建立成功);
②啟動(dòng)連接(并驗證建立成功);
③返回連接信息;
④接收收到的數據;
⑤判斷數據的屬性。
客戶(hù)端程序設計的程序基本流程如圖3所示。

圖3 客戶(hù)端程序簡(jiǎn)單示意圖
客戶(hù)端打開(kāi)通信通道,并連接到服務(wù)器所在主機的特定端口,向服務(wù)器發(fā)送請求報文,等待并接收應答,請求結束后關(guān)閉通信通道并終止通信??蛻?hù)端主要程序如下:
Int main(int argc,char *argv[])
if(argc!=3)
printf("error!!!please enter the remote IP and PORT please!!! the form like 192.168.0.* 4000");
mysocket=socket(AF_INET,SOCK_STREAM,0); //建立一個(gè)套接字
if(mysocket==-1)
printf("error!!! failed to created the new socket,program end here");
printf("OK-- you have successful created a socket named mysocket");
return(0); //socket 建立不成功,回初始位置
connectcheck=connect(mysocket,(struct sockaddr*)&addr_remote,sizeof(struct sockaddr));
//調用connect函數連接服務(wù)器端
if(connectcheck==-1)
printf("error!!!sorry you have failed to connect the remote server!!try again !program end here");
// connect不成功回初始位置
printf("OK-- Now you have successful connect the server,this server IP =%s,and it's PORT =%s,now you can communicat with this server!!!!!!!",argv[1],argv[2])
//打印服務(wù)器IP地址和端口號
while(1)
bzero(gotbuffer,long);
number=recv(mysocket,gotbuffer,long,0);
//調用阻塞函數
if(number==-1)
printf("error!!! some thing wrong !let you can not got the data form server,program end here");
return(0);
gotbuffer[number]='国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放