0 导言
跟着人工智能的运用,ARM产品现已遍及到各个范畴:工业操控、无线通讯范畴、消费类电子产品、成像和安全产品,包括现在盛行的数码相机和打印机中绝大部分选用ARM技能,手机中的32位SIM智能卡也选用了ARM技能。除此以外,ARM微处理器及技能还运用到许多不同的范畴,并会在将来获得愈加广泛的运用,因而,ARM与其它渠道之间通讯就显得尤为重要。
1.UDP协议实质
UDP协议是英文User Datagram Protocol的缩写,即用户数据报协议,首要用来支撑那些需求在核算机之间传输数据的网络运用。包括网络视频会议体系在内的很多客户/服务器形式的网络运用都需求运用UDP协议。UDP协议从面世至今现已被运用了很多年,尽管其开始的光荣现已被一些相似协议所掩盖,但即使是在今日,UDP依然不失为一项十分有用和可行的网络传输层协议。
UDP协议运用端口号为不同的运用保存其各自的数据传输通道。UDP和TCP协议正是选用这一机制完成对同一时间内多项运用一起发送和接纳数据的支撑。数据发送一方(可所以客户端或服务器端)将UDP数据报经过源端口发送出去,而数据接纳一方则经过方针端口接纳数据。有的网络运用只能运用预先为其预留或注册的静态端口;而别的一些网络运用则能够运用未被注册的动态端口。由于UDP报头运用两个字节寄存端口号,所以端口号的有用规模是从0到65535.一般来说,大于49151的端口号都代表动态端口。
数据报的长度是指包括报头和数据部分在内的总的字节数。由于报头的长度是固定的,所以该域首要被用来核算可变长度的数据部分(又称为数据负载)。数据报的最大长度依据工作环境的不同而各异。从理论上说,包括报头在内的数据报的最大长度为65535字节。不过,一些实践运用往往会约束数据报的巨细,有时会降低到8192字节。
UDP协议运用报头中的校验值来确保数据的安全。校验值首要在数据发送方经过特别的算法核算得出,在传递到接纳方之后,还需求再从头核算。
假如某个数据报在传输进程中被第三方篡改或许由于线路噪音等原因遭到损坏,发送和接纳方的校验核算值将不会相符,由此UDP协议能够检测是否犯错。其实在UDP协议中校验功用是可选的,假如将其封闭能够使体系的功能有所提高。这与TCP协议是不同的,后者要求有必要具有校验值。
2.完成事例
完成事例如下:在接触屏进行画图,使其在液晶屏上显现,一起经过网络传输数据,使其在核算机屏幕上显现,并由核算机操控铲除液晶屏上的图形。
过程如下:
(1)新建工程
(2)在main.c文件中修改初始化网络函数void InitNetWork()//初始化网络{
U32 ipaddr32,ipmaskaddr32,ipgateaddr32;
U8 *Mac;
ipaddr32=Get_ipaddr(); //获取IP地址
ipmaskaddr32=Get_maskaddr();//获取子网掩码
ipgateaddr32=Get_gwaddr(); //获取网关
Mac=Get_mac(); //获取网卡地址NetPortChoose(0);
//挑选网口,有必要在装备网络曾经进行
initOSNet(ipaddr32, ipmaskaddr32,
ipgateaddr32,Mac);//装备网络
OSTimeDly(1000);//使命挂起1秒
printk(“init Ethernet and UDP is
ok!\n”);
}
(3)界说核算机端套接字,全局变量(4)编写Main_Task使命及音讯循环首要担任呼应接触屏音讯,在屏幕上画图,然后将数据传输到核算机上。
对接触屏音讯的处理和键盘音讯相似,其音讯类型pMsg-》Message为OSM_TOUCH_SCREEN,音讯参数pMsg-》LParam中包括了接触屏的动作信息,界说如下:
#define TCHSCR_ACTION_NULL
0
#define TCHSCR_ACTION_CLICK 1 //接触
屏单击
#define TCHSCR_ACTION_DBCL%&&&&&%K 2 //触
摸屏双击
#define TCHSCR_ACTION_DOWN 3 //接触
屏按下
#define TCHSCR_ACTION_UP 4 //接触
屏抬起
#define TCHSCR_ACTION_MOVE 5 //接触
屏移动
音讯参数pMsg-》WParam中则包括了接触
点的坐标信息,低16位是X坐标值,高16位是Y坐标值。这儿当接触屏发生“按下”动作后选用MoveTo()函数设置绘图起始点坐标,当发生“移动”动作后选用LineTo()函数制作线段。
3.解决方案
3.1 树立Socket
为了树立树立S o c k e t,程序能够调用socket函数,该函数回来一个相似于文件描述符的句柄。socket函数原型为:
int socket(int domain, int type,intprotocol);
domain指明所运用的协议族,一般为PF_INET,表明互联网协议族(TCP/IP协议族);type参数指定socket的类型:SOCK_STREAM或SOCK_DGRAM,Socket接口还界说了原始 Socket(SOCK_RAW),答应程序运用低层协议;protocol一般赋值“0”.Socket()调用回来一个整型socket描述符,你能够在后面的调用运用它。
Socket描述符是一个指向内部数据结构的指针,它指向描述符表进口。调用Socket函数时,socket履行体将树立一个Socket,实践上“树立一个Socket”意味着为一个Socket数据结构分配存储空间。Socket履行体为你办理描述符表。
两个网络程序之间的一个网络衔接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包括这五种信息。
3.2 装备Socket
经过socket调用回来一个socket描述符后,在运用socket进行网络传输曾经,有必要装备该socket.面向衔接的socket客户端经过调用Connect函数在socket数据结构中保存本地和远端信息。无衔接socket的客户端和服务端以及面向衔接socket的服务端经过调用bind函数来装备本地信息。
Bind函数将socket与本机上的一个端口相关联,随后你就能够在该端口监听服务恳求。
Bind函数原型为:
int bind(int sockfd,struct sockaddr*my_addr,int addrlen);
Sockfd是调用socket函数回来的socket描述符,my_addr是一个指向包括有本机IP地址及端口号等信息的sockaddr类型的指针;addrlen常被设置为3.3 树立衔接
面向衔接的客户程序运用Connect函数来装备socket并与远端服务器树立一个TCP衔接,其函数原型为:
int connect(int sockfd,struct sockaddr*serv_addr,int addrlen);
Sockfd是socket函数回来的socket描述符;serv_addr是包括远端主机IP地址和端口号的指针;addrlen是远端地址结构的长度。
Connect函数在呈现错误时回来-1,而且设置errno为相应的错误码。进行客户端程序设计无须调用bind(),由于这种状况下只需知道意图机器的IP地址,而客户经过哪个端口与服务器树立衔接并不需求关怀,socket履行体为你的程序主动挑选一个未被占用的端口,并告诉你的程序数据什么时候抵达端口。
Connect函数发动和远端主机的直接衔接。只要面向衔接的客户程序运用socket时才需求将此socket与远端主机相连。无衔接协议从不树立直接衔接。面向衔接的服务器也从不发动一个衔接,它仅仅被迫的在协议端口监听客户的恳求。
Listen函数使socket处于被迫的监听形式,并为该socket树立一个输入数据行列,将抵达的服务恳求保存在此行列中,直到程序处理它们。
int listen(int sockfd,int backlog);
首要,当accept函数监督的socket收到衔接恳求时,socket履行体将树立一个新的 socket,履行体将这个新socket和恳求衔接进程的地址联系起来,收到服务恳求的初始socket仍能够持续在曾经的socket上监听,一起能够在新的socket描述符进步行数据传输操作。
3.4 传输数据
Send()和recv()这两个函数用于面向衔接的socket进步行数据传输。
Sockfd是你用来传输数据的socket描述符;msg是一个指向要发送数据的指针;Len是以字节为单位数据的长度;flags一般状况下设置为0(关于该参数的用法可参照man手册)。
Send()函数回来实践上发送出的字节数,可能会少于你期望发送的数据。在程序中应该将send()的回来值与欲发送的字节数进行比较。当send()回来值与len不匹配时,应该对这种状况进行处理。
3.5 传输完毕
当一切的数据操作完毕今后,你能够调用close()函数来开释该socket,然后中止在该socket上的任何数据操作。