完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 cwfwh 于 2016-12-11 22:53 编辑 前面发布的试用体验,已经介绍过如何编译一个完整的应用程序以及测试。 今天在此基础上编译一个网络通讯应用程序,采用用户数据报协议UDP来实现。 实现的功能: 完成一个UDP服务器端程序,实现接收客户端的报文,在串口终端打印出来,同时将报文返回给客户端。 1 硬件介绍 Rico Board 只引出了一路以太网,使用 RMII 协议的信号。Rico Board 带有一个千兆以太网口,即 J5,RJ45座集成网络隔离变压器, PHY芯片为KSZ9031,连接到 AM437x的RGMII1端口,25MHz时钟,PHY地址 PHYAD[0:2]设为0x00。 2 TCP和UDP介绍 TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。 这里将介绍常用的UDP网络编程。 3 UDP编程介绍 UDP编程的服务器端一般步骤是: 1、创建一个socket,用函数socket(); 2、设置socket属性,用函数setsockopt();* 可选 3、绑定IP地址、端口等信息到socket上,用函数bind(); 4、循环接收数据,用函数recvfrom(); 5、关闭网络连接; UDP编程的客户端一般步骤是: 1、创建一个socket,用函数socket(); 2、设置socket属性,用函数setsockopt();* 可选 3、绑定IP地址、端口等信息到socket上,用函数bind();* 可选 4、设置对方的IP地址和端口等属性; 5、发送数据,用函数sendto(); 6、关闭网络连接; 4 程序代码简单分析 嵌入式UDP网络编程,按照上面写的步骤,一步一步往下写就能实现。这个不是很难,网上也有很多例程。方便排版,这里只介绍部分代码 : 1 定义通讯端口号 6666 #define SERVER_PORT 6666 2 设置socket属性,绑定IP地址、端口等信息到socket上 tSocketServerAddr.sin_family = AF_INET; tSocketServerAddr.sin_port = htons(SERVER_PORT); tSocketServerAddr.sin_addr.s_addr = INADDR_ANY; memset(tSocketServerAddr.sin_zero, 0, 8); iRet = bind(iSocketServer, (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr)); if (-1 == iRet) { printf("bind error!n"); return -1; } 3 接收数据,用函数recvfrom() iRecvLen = recvfrom(iSocketServer, ucRecvBuf, 999, 0, (struct sockaddr *)&tSocketClientAddr, &iAddrLen); if (iRecvLen > 0) { ucRecvBuf[iRecvLen] = ' |