嵌入式网络编程实现与测试
时间:10-02
整理:3721RD
点击:
前面发布的试用体验,已经介绍过如何编译一个完整的应用程序以及测试。
今天在此基础上编译一个网络通讯应用程序,采用用户数据报协议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] = '\0';
}
4 串口打印数据,将接收到的数据打印
printf("Get Msg From %s : %s\n", inet_ntoa(tSocketClientAddr.sin_addr), ucRecvBuf);
5 接收发送,将接收到的数据发送出去
sendto(iSocketServer, ucRecvBuf, strlen(ucRecvBuf), 0, (struct sockaddr *)&tSocketClientAddr, sizeof(struct sockaddr_in));
}
6、关闭网络连接
close(iSocketServer);
5 嵌入式应用程序编译与测试
编译:
arm-linux-gnueabihf-gcc -o server server.c ,如下截图,生成server可执行文件。将
其拷贝到Rico Board主板中去。
测试:
在终端运行可执行程序,在没有收到数据前,程序是处于阻塞状态。
截图:
收到数据后,将会打印收到的数据,如图:
上位机截图:
上位机发送的报文 。同时接受到 Rico Board开发板 发送回来的报文。显示出来 。
到此,一个嵌入式网络UDP程序已经完成,并且应用程序测试成功,
能收能发,达到预期的目的。
学习中