讯为4412开发板嵌入式学习(八)网络通信之UDP

本文详细介绍了在嵌入式系统中使用Linux进行UDP网络通信的过程,包括服务端和客户端的创建套接字、设置地址属性、发送与接收数据及关闭连接的步骤。重点讲解了sendto()、recvfrom()等关键函数的使用。
摘要由CSDN通过智能技术生成

用户数据报协议(User Datagram Protocol,UDP)是OSI(Open System Interconnection,开放式系统互联)参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。


一、服务端server

(一)、创建套接字

int socket(int domain, int type, int protocol);
参数说明:

  • domain:套接字(socket)通信作用域,具体选择见下表domain参数选择
  • type:socket通信语义,具体选择见下表type参数选择
  • protocol:指定了与套接字一起使用的特定协议。通常,在给定的协议族中只有一个协议支持特定的套接字类型,在这种情况下可以将协议指定为0。但是,可能存在许多协议,在这种情况下,必须以这种方式指定特定的协议(如ip、tcp、udp)。所使用的协议编号是特定于要进行通信的“通信域”的。

返回值:

  • 如果成功,将返回新套接字的文件描述符。如果出现错误,则返回-1,并相应地设置errno。

注意:domain和type需要搭配使用,并非都可一一对应。

domain参数选择

参数 作用 手册页
AF_UNIX, AF_LOCAL 本地通信 / Local communication unix(7)
AF_INET IPv4互联网协议 / IPv4 Internet protocols ip(7)
AF_INET6 IPv6互联网协议 / IPv6 Internet protocols ipv6(7)
AF_IPX IPX -Novell协议 / IPX - Novell protocols -
AF_NETLINK 内核用户接口设备 / Kernel user interface device netlink(7)
AF_X25 ITU-T X.25/ISO-8208协议 / ITU-T X.25/ISO-8208 protocol x25(7)
AF_AX25 业余无线电AX.25协议 / Amateur radio AX.25 protocol -
AF_ATMPVC 访问原始的ATM PVCs / Access to raw ATM PVCs -
AF_APPLETALK 可路由协议组 / Appletalk ddp(7)
AF_PACKET 低级信息包接口 / Low level packet interface packet(7)

type参数选择

参数 作用
SOCK_STREAM 提供有序、可靠、双向、基于连接的字节流。需要支持带外数据的传输机制。Provides sequenced, reliable, two-way, connection-based byte streams. An out-of-band data transmission mechanism may be supported.
SOCK_DGRAM 支持数据报(无连接、不可靠的固定最大长度的消息)。Supports datagrams (connectionless, unreliable messages of a fixed maximum length).
SOCK_SEQPACKET 为最大长度固定的数据报提供有序、可靠、基于双向连接的数据传输路径。用户需要在每次输入系统调用时读取整个数据包。Provides a sequenced, reliable, two-way connection-based data transmission path for datagrams of fixed maximum length; a consumer is required to read an entire packet with each input system call.
SOCK_RAW 提供原始网络协议访问。Provides raw network protocol access.
SOCK_RDM 提供一个不确保排序的可靠数据报层。Provides a reliable datagram layer that does not guarantee ordering.
SOCK_PACKET 过时,已被淘汰,不应使用在程序中。Obsolete and should not be used in new programs; see packet(7).

(二)、设置服务端套接字的地址属性

套接字结构体,下面两个结构体本质上是相同的,但是结构体成员不同。设置时先对结构体sockaddr_in赋值,返回再将结构体转换为sockaddr

struct sockaddr_in {
   
  sa_family_t		sin_family;	/* Address family		地址族*/
  unsigned short		sin_port;	/* Port number			端口编号*/
  struct in_addr	sin_addr;	/* Internet address		互联网地址*/

  /* Pad to size of `struct sockaddr'. 没有实际作用,仅用于和结构体sockaddr字节对齐*/
  unsigned char		__pad[__SOCK_SIZE__ - sizeof(short int) -
			sizeof(unsigned short int) - sizeof(struct in_addr)];
            /*
            __SOCK_SIZE__                   等于16 
            sizeof(short int)                 等于2
            sizeof(unsigned short int)    等于2
            sizeof(struct in_addr)          等于4
            上面这一句可写为 unsigned char sin_zero[8];
            */
};

struct sockaddr {
   
	sa_family_t	sa_family;	/* address family, AF_xxx	*/
	char		sa_data[14];	/* 14 bytes of protocol address	结构体sockaddr_in的字节对其就在这里得以体现了*/
};
1、sa_family

sa_family参数选择,需要根据所使用的传输协议或者上面创建套接字时选择的domain来选择。

/* Supported address families. */
#define AF_UNSPEC	0
#define AF_UNIX		1	/* Unix domain sockets 		*/
#define AF_LOCAL	1	/* POSIX name for AF_UNIX	*/
#define AF_INET		2	/* Internet IP Protocol 	*/
#define AF_AX25		3	/* Amateur Radio AX.25 		*/
#define AF_IPX		4	/* Novell IPX 			*/
#define AF_APPLETALK	5	/* AppleTalk DDP 		*/
#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值