详解Linux中的socket函数

本文详细解释了Linux系统中socket函数的domain、type和protocol参数,介绍了不同协议域、套接字类型及对应协议,如AF_INET、SOCK_STREAM/TCP、SOCK_DGRAM/UDP等,并展示了如何根据这些参数创建不同类型的套接字。
摘要由CSDN通过智能技术生成

2023年8月3日,周四下午


目录


函数原型

#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该怎么选。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巨龙之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值