2023年8月3日,周四下午
目录
- 函数原型
- 参数domain
- 参数type
- 参数protocol
- 举例说明
- 参数type和参数protocol之间的关系
函数原型
#include <sys/socket.h>int socket(int domain, int type, int protocol);
参数domain
domain是“域”的意思,其值为AF_INET
在Linux系统中,domain参数用于指定套接字的协议域(protocol domain),它定义了套接字通信的协议族。
以下是Linux系统中一些常见的domain值:
AF_UNIX
:Unix 域协议域,用于本地通信(Inter-process communication,IPC)。它使用文件路径作为套接字地址,用于同一台机器上的进程间通信。AF_INET
:IPv4 协议域,用于 Internet 地址族。这是最常见的协议域,用于基于 IPv4 的网络通信。AF_INET6
:IPv6 协议域,用于 IPv6 地址族。这是用于基于 IPv6 的网络通信。AF_PACKET
:用于原始网络数据包的协议域。它允许应用程序直接访问网络帧,适用于网络协议分析和数据包捕获等场景。AF_BLUETOOTH
:蓝牙协议域,用于蓝牙通信。AF_X25
:X.25 协议域,用于 X.25 网络协议。AF_NETLINK
:Netlink 协议域,用于 Linux 内核与用户空间进程之间的通信。AF_PACKET
:原始数据链路层套接字,允许应用程序直接访问数据链路层帧。
参数type
type指定套接字的类型,可以是以下值之一:
-
SOCK_STREAM
:流套接字,用于可靠、面向连接的服务。对应于 TCP 协议。 -
SOCK_DGRAM
:数据报套接字,用于无连接、不可靠的服务。对应于 UDP 协议。 -
SOCK_SEQPACKET
:顺序数据包套接字,在 SCTP 协议中使用。 -
SOCK_RAW
:原始套接字,用于直接访问底层网络协议。可以自定义协议头部并发送。 -
SOCK_RDM
:可靠数据报套接字,很少使用。 -
SOCK_PACKET
:废弃的套接字类型,已经不再使用。
参数protocol
在socket函数中,protocol参数用于指定套接字使用的协议。
协议(protocol)是一组规则和约定,用于在网络中的不同节点之间进行通信和数据交换。
下面是一些常见的protocol参数值及其对应的协议:
IPPROTO_TCP
:TCP(Transmission Control Protocol)协议。它是一种面向连接的、可靠的、基于字节流的传输协议,用于提供可靠的数据传输。IPPROTO_UDP
:UDP(User Datagram Protocol)协议。它是一种无连接的、不可靠的、基于数据报的传输协议,用于提供快速的数据传输,但不保证数据的可靠性和顺序性。IPPROTO_SCTP
:SCTP(Stream Control Transmission Protocol)协议。它是一种面向连接的、可靠的、基于消息的传输协议,提供了可靠的数据传输和流量控制等功能。IPPROTO_ICMP
:ICMP(Internet Control Message Protocol)协议。它是一种网络层协议,用于在网络中传递控制信息和错误报文,如网络不可达、请求超时等。IPPROTO_IGMP
:IGMP(Internet Group Management Protocol)协议。它是一种组播协议,用于在 IP 网络中进行组播组的管理和维护。IPPROTO_RAW
:原始 IP 协议。它允许应用程序直接访问网络层的数据,可用于构造和发送自定义的 IP 报文。
需要注意的是,protocol参数的具体取值取决于所选择的协议域(domain)和套接字类型(type)。在某些情况下,可以将protocol设置为0,表示使用默认协议。此时,系统会根据协议域和套接字类型自动选择适合的协议。
举例说明
// 创建 TCP 套接字
int tcpSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// 创建 UDP 套接字
int udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);// 创建 ICMP 套接字
int icmpSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);// 创建 SCTP 套接字
int sctpSocket = socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);// 创建 RAW 套接字
int rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);// 创建 IGMP 套接字
int igmpSocket = socket(AF_INET, SOCK_RAW, IPPROTO_IGMP);
参数type和参数protocol之间的关系
一般来说:
- SOCK_STREAM 对应 IPPROTO_TCP
- SOCK_DGRAM 对应 IPPROTO_UDP
- SOCK_SEQPACKET 对应 IPPROTO_SCTP
- SOCK_RAW 对应 IPPROTO_ICMP、IPPROTO_RAW和IPPROTO_IGMP
由此,你可以大概知道当Linux中的socket函数的参数domain和参数type确定后,参数protocol该怎么选。