您的位置 首页 主动

PXA270嵌入式体系在Socket通讯的使用

1引言英特尔公司于2003年底推出了性能最为强劲的PXA27x系列嵌入式处理器,PXA27x系列嵌入式处理器基于ARMv5E的Xscale核心,最高频率可达624MHz.作为一款性能极其强劲的嵌入式处

1 导言

英特尔公司于2003年末推出了功用最为微弱的PXA27x系列嵌入式处理器,PXA27x系列嵌入式处理器依据ARMv5E的Xscale中心,最高频率可达624MHz.作为一款功用极端微弱的嵌入式处理器,合作嵌入式Linux或Wince操作体系,PXA270理论上能够支撑任何媒体格式,并经过软件晋级,支撑未来媒体格式。它最初出现在PDA(比方惠普HP4700)和智能手机(如MOTO E680)上。因而它的扩展接口适当丰厚,扩展接口有SD/SDIO/MMC、CF/PCMCIA、CMOS/CCD CAMERA、蓝牙、USB1.1、OTG等。

Socket接口是TCP/IP网络的API,socket接口界说了许多函数或例程,程序员能够用它们来开发TCP/IP网络上的使用程序。要学Internet上的TCP/IP网络编程,有必要了解Socket接口。Socket接口规划者最先是将接口放在Unix操作体系里边的。假如了解Unix体系的输入和输出的话,就很简略了解Socket了。网络的Socket数据传输是一种特别的I/O,Socket也是一种文件描述符。

2 体系规划

体系的规划分为服务器端和客户端规划两部分,服务器端为运转Linux操作体系的PC机,客户端为PXA270体系,在该体系中移植和构建Linux嵌入式操作体系,两者经过Switch交换机进行网络通讯。

2.1 体系作业原理

在Linux 操作体系中,Socket 归于文件体系的一部分,网络通讯能够被看作是对文件的读取。Linux 具有POSIX 规范库函数,Socket()、Bind()、Sendto()、Recvfrom()等库函数能够方便地完结客户/ 服务器模型中数据的传送与接纳。体系规划首要的意图是完结服务器和客户端网络通讯的完结。首要发动宿主机和客户机的操作体系Linux,然后每个模块加载网络设备驱动程序,最终经过TCP/IP协议树立两边的通讯链路,完结Socket通讯,详细情况如图1所示。

2.2 嵌入式TCP/IP协议架构

TCP/IP(TransmissionControlProtocol/InternetProtocol)的简写,中文译名为传输操控协议/因特网互联协议,又名网络通讯协议,这个协议是Internet最根本的协议、Internet国际互联网络的根底,简略地说,便是由网络层的IP协议和传输层的TCP协议组成的。TCP/IP界说了电子设备(比方计算机)怎么连入因特网,以及数据怎么在它们之间传输的规范。TCP/IP是一个四层的分层体系结构。高层为传输操控协议,它担任集合信息或把文件拆分红更小的包。低层是网际协议,它处理每个包的地址部分,使这些包正确的抵达意图地。

嵌入式体系作为TCP服务器,在三次握手树立衔接的过程中,嵌入式体系作为监听状况的服务器,处于LISTEN状况,等候对方建议衔接。当它接纳到SYN数据片,当即宣布SYN+ACK的数据片承认收到对方的SYN,此刻变为SYN_ RECEIVED状况。再接纳到对方回来的一个包括ACK的空数据片则三次握手完结,进入ESTABLISHED状况,最终进行TCP数据通讯。

图1 体系的原理示意图

嵌入式体系树立衔接时初始化序列号,然后依据对方发包中的值来承认序列号,不回忆序列号,不能辨认重复报文。嵌入式服务器仅仅在服务器端呼应客户端的恳求,接纳一个发送一个承认答复,不考虑失序问题。一起接纳到TCP恳求后,将存储于发送缓冲区中的数据当即发送即可,只需一个数据包就能完结,也不需考虑失序问题。

由于嵌入式体系选用滑动窗口为1的传输方法,即发送一次数据包就等候回来应对,因而当接纳不到承认包,就以为自己发送的包丢掉,直接发送前次发送的数据。TCP的衔接中,当客户机反常导致衔接溃散时,嵌入式体系发数据时会被回复复位信号,回到初始状况。嵌入式TCP/IP协议如图2所示。

嵌入式体系是”操控、监督或许辅佐设备、机器和设备运转的设备”(devicesusedtocontrol,monitor,orassisttheoperationofequipment,machineryorplants)。从中能够看出嵌入式体系是软件和硬件的综合体,还能够包括机械等隶属设备。目前国内一个遍及被认同的界说是:以使用为中心、以计算机技术为根底、软件硬件可裁剪、习惯使用体系对功用、可靠性、本钱、体积、功耗严格要求的专用计算机体系。

3 客户端/服务器端功用规划

在TCP/IP网络中,通讯的两个进程间相互效果的首要形式是客户/服务器形式,即客户端向服务器端宣布服务恳求,服务器接纳到恳求后,供给相应的服务。客户/服务器形式在操作过程中采纳的是自动恳求方法。

图2 嵌入式TCP/IP图解

3.1 客户端程序规划

socket是面向客户/服务器模型而规划的,针对客户和服务器程序供给不同的socket体系调用。客户随机恳求一个socket(适当于一个想打电话的人能够在任何一台入网电话上拨号呼叫),体系为之分配一个socket号;服务器具有大局公认的socket,任何客户都能够向它宣布衔接恳求和信息恳求(适当于一个被呼叫的电话具有一个呼叫方知道的电话号码)。

客户端能够向服务器端发送衔接恳求,而且客户端也能够接纳到来自服务器端发送回来的数据。客户端能够判别当时自己的作业状况,如衔接的树立,发动的成功和数据包通讯的个数等。客户端程序规划首要按以下的过程完结函数的调用:

①树立自己的Socket(并验证树立成功);

②发动衔接(并验证树立成功);

③回来衔接信息;

④接纳收到的数据;

⑤判别数据的特点。

客户端程序规划的程序根本流程如图3所示。

图3 客户端程序简略示意图

客户端翻开通讯通道,并衔接到服务器地点主机的特定端口,向服务器发送恳求报文,等候并接纳应对,恳求完毕后封闭通讯通道并停止通讯。客户端首要程序如下:

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); //树立一个套接字

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函数衔接服务器端

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])

//打印服务器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]=’\0′;

close(mysocket);3.2 服务器端程序规划

服务器端能够快速的做出客户端的衔接恳求反映,服务器端反映来自客户端的衔接参数,如衔接的IP、衔接时间、衔接的当时状况等。服务器发动后依据恳求供给以下服务:

①翻开通讯通道并奉告本地主机,在某一公认地址上接纳客户恳求;

②等候客户恳求抵达该端口;

③接纳到重复服务恳求,处理该恳求并发送应对信号;

④回来第二步,等候另一客户恳求;

⑤封闭服务器。

服务器端程序规划的流程如图4所示。

客户端与服务器端进程的效果对错对称的,因而编码不同。一起,服务器进程一般是先于客户恳求恳求而发动的,只需体系运转,该服务进程一向存在,直到正常或逼迫停止。服务器端首要程序如下:

mysocket=socket(AF_INET,SOCK_STREAM,0);

//树立新的套接字

if(mysocket==-1)

printf(“error!!! failed to created mysocket”);

return(0); //socket树立不成功,回初始方位

mybindcheck=bind(mysocket,(struct sockaddr*)&addr_local,sizeof(struct sockaddr));

if(mybindcheck==-1)

printf(“error!!!failed to bind the IP and port with mysocket”);

return(0);

图4 服务器端程序简略示意图

{ printf(“OK–you have successed bind your IP with port %d”,port);

listencheck=listen(mysocket,howmany);

if(listencheck==-1)

printf(“error!!! you have failed listen this port,program end here”);

return(0); //调用监听函数

sin_size=sizeof(struct sockaddr_in);

newsocket=accept(mysocket,(struct sockaddr*)&addr_remote,&sin_size);

//调用接纳函数

if(newsocket==-1)

printf(“error!!!failed to got remote connect this server,program end here”);

return(0); //树立新的socket失利回来

printf(“OK– now have created the newsocket to use this own connection,use this communicate with clint%s”,inet_ntoa(addr_remote.sin_addr),port);

printf(“OK– server have successed got connect from clint IP = %s,port = %d,now connecting is running;”,inet_ntoa(addr_remote.sin_addr),port)

pid_t pid;

pid=fork(); //调用fork()树立子进程

if(pid>0)

printf(“OK– i am a father procces,child proccess will continue for you,it’s ID= %d,now end newsock and use old socket to listen again…… “,pid);

close(newsocket);

printf(“OK– i am a child procces,i am responsible for this new communicate,blow i will do for connect”);

printf(“OK– please enter your data which you want to send n”);

while(1)

bzero(sendbuffer,long);

scanf(“%s”,sendbuffer);

sendcheck=send(newsocket,sendbuffer,strlen(sendbuffer),0); //发送数据

if(sendcheck==-1)

printf(“error!!!failed to send to remote”);

close(newsocket);

else

printf(“OK–now you have send %d byte data to remote!!!pleases send again!!!!”,sendcheck);

4 使用与测验

图5 数据发送验证客户端

体系测验前,服务器端经过以太网和客户端完结衔接。客户端构建了li

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/242501.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部