文章目录
用户数据报协议(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 */
#