首页 理论教育UDP通信实例-ARM嵌入式系统原理与应用

UDP通信实例-ARM嵌入式系统原理与应用

【摘要】:图8.6UDP通信流程5.UDP通信例程UDP通信模型本身没有服务器和客户端的概念,通信双方地位完全是平等的。

1.UDP协议与TCP协议的不同

TCP协议是面向连接的传输协议,建立连接时要经过三次握手,断开连接时要经过四次握手,中间传输数据时也要回复ACK包确认,多种机制保证了数据能够正确到达,不会丢失或出错。

UDP协议是非连接的传输协议,没有建立连接和断开连接的过程,它只是简单地把数据塞到网络中,不需要ACK包确认。

因此TCP协议数据传输的可靠性高,UDP协议结构简洁、不发送ACK应答信息,传输效率高。

2.sendto()函数

在Linux环境下,用UDP协议发送数据的函数sendto,函数原型为:

ssize_t sendto(int sockfd,void∗buf,size_t nbytes,int flags,struct sockaddr∗to,socklen_t addrlen);

具体参数如下:

sockfd:用于传输UDP数据的套接字;

buf:保存待传输数据的缓冲区地址;

nbytes:带传输数据的长度(以字节计);

flags:可选项参数,若没有可传递0;

to:存有目标地址信息的sockaddr结构体变量的地址;

addrlen:传递给参数to的地址值结构体变量的长度。

3.recvfrom()函数

在Linux环境下,用UDP协议接收数据的函数recvfrom,函数原型为:

ssize_t recvfrom(int sockfd,void∗buf,size_t nbytes,int flags,struct sockadr∗from,socklen_t∗addrlen);

具体参数如下:

sockfd:用于接收UDP数据的套接字;

buf:保存接收数据的缓冲区地址;

nbytes:可接收的最大字节数(不能超过buf缓冲区的大小);

flags:可选项参数,若没有可传递0;(www.chuimin.cn)

from:存有发送端地址信息的sockaddr结构体变量的地址;

addrlen:保存参数from的结构体变量长度的变量地址值。

4.UDP程序流程

由于在UDP通信中没有理解的概念,可以随时使用任何一个socket向对方发送数据,而接收数据还是需要先将socket与一个地址绑定,其程序流程如图8.6所示。

图8.6 UDP通信流程

5.UDP通信例程

UDP通信模型本身没有服务器和客户端的概念,通信双方地位完全是平等的。但在实际应用中常常把等待接收数据并及时作出响应的一方称为服务器,而将主动发送数据并等待对方响应的一方称为客户端。

例程由两个文件组成:udpserver.c是服务器端程序,udpclient.c是客户端程序。

udpserver.c源码如下:

#include<stdio.h>

#include<std lib.h>

#include<string.h>

#include<unistd.h>

#include<sys/types.h>

#include<sys/socket.h>

#include<netinet/in.h>

#include<arpa/inet.h>

intmain()