SOCKET - Linux手册页
Linux程序员手册 第7部分
更新日期: 2020-08-13
名称
socket-Linux套接字接口
语法
#包括
sockfd = socket(int socket_family,int socket_type,int协议);
说明
本手册页介绍了Linux网络套接字层用户界面。 BSD兼容套接字是用户进程和内核中的网络协议堆栈之间的统一接口。协议模块分为协议系列,例如AF_INET,AF_IPX和AF_PACKET,以及套接字类型,例如SOCK_STREAM或SOCK_DGRAM。有关系列和类型的更多信息,请参见socket(2)。
Socket-layer functions
用户进程使用这些功能来发送或接收数据包以及执行其他套接字操作。有关更多信息,请参见其各自的手册页。
socket(2)创建一个套接字,connect(2)将一个套接字连接到一个远程套接字地址,bind(2)函数将一个套接字绑定到一个本地套接字地址,listen(2)告诉套接字应接受新的连接,和accept(2)用于获取具有新传入连接的新套接字。 socketpair(2)返回两个连接的匿名套接字(仅针对一些本地家族(如AF_UNIX)实现)
send(2),sendto(2)和sendmsg(2)通过套接字发送数据,而recv(2),recvfrom(2),recvmsg(2)从套接字接收数据。 poll(2)和select(2)等待到达数据或准备发送数据。此外,标准的I / O操作(如write(2),writev(2),sendfile(2),read(2)和readv(2))可用于读取和写入数据。
getsockname(2)返回本地套接字地址,而getpeername(2)返回远程套接字地址。 getsockopt(2)和setsockopt(2)用于设置或获取套接字层或协议选项。 ioctl(2)可用于设置或读取其他一些选项。
close(2)用于关闭套接字。 shutdown(2)关闭全双工套接字连接的部分。
套接字不支持使用非零位置查找或调用pread(2)或pwrite(2)。
通过使用fcntl(2)在套接字文件描述符上设置O_NONBLOCK标志,可以在套接字上执行非阻塞I / O。然后,所有将阻塞的操作(通常)将通过EAGAIN返回(该操作应稍后重试); connect(2)将返回EINPROGRESS错误。然后,用户可以通过poll(2)或select(2)等待各种事件。
单元格不一致
poll(2)和select(2)的替代方法是让内核通过SIGIO信号通知应用程序事件。为此,必须通过fcntl(2)在套接字文件描述符上设置O_ASYNC标志,并且必须通过sigaction(2)安装SIGIO的有效信号处理程序。请参阅下面的信号讨论。
Socket address structures
每个套接字域都有其自己的套接字地址格式,具有特定于域的地址结构。这些结构中的每一个都以整数" family"字段(键入为sa_family_t)开头,该字段指示地址结构的类型。这允许所有套接字域通用的各种系统调用(例如,connect(2),bind(2),accept(2),getsockname(2),getpeername(2))确定特定域套接字地址。
为了允许将任何类型的套接字地址传递到套接字API中的接口,定义了struct sockaddr类型。此类型的目的纯粹是为了允许将特定于域的套接字地址类型转换为"通用"类型,以避免编译器警告有关套接字API调用中类型不匹配的警告。
另外,套接字API提供了数据类型struct sockaddr_storage。此类型适合容纳所有受支持的特定于域的套接字地址结构;它足够大并且对齐正确。 (特别是,它足以容纳IPv6套接字地址。)该结构包括以下字段,该字段可用于标识实际存储在该结构中的套接字地址的类型:
sa_family_t ss_family;
sockaddr_storage结构在必须以通用方式处理套接字地址的程序(例如,必须同时处理IPv4和IPv6套接字地址的程序)中很有用。
Socket options
可以通过使用setsockopt(2)设置下面列出的套接字选项,并使用getsockopt(2)读取所有套接字的套接字级别设置为SOL_SOCKET。除非另有说明,否则optval是指向int的指针。
- SO_ACCEPTCONN
- 返回一个值,该值指示此套接字是否已被标记为接受与listen(2)的连接。值0表示这不是侦听套接字,值1表示这不是侦听套接字。此套接字选项是只读的。
- SO_ATTACH_FILTER(since Linux 2.2), SO_ATTACH_BPF(since Linux 3.19)
- 将经典BPF(SO_ATTACH_FILTER)或扩展BPF(SO_ATTACH_BPF)程序附加到套接字,以用作传入数据包的筛选器。如果过滤程序返回零,则将丢弃数据包。如果过滤程序返回的非零值小于数据包的数据长度,则数据包将被截断为返回的长度。如果过滤器返回的值大于或等于数据包的数据长度,则允许数据包在不修改的情况下继续进行。
- SO_ATTACH_FILTER的参数是sock_fprog结构,定义于:
struct sock_fprog { unsigned short len; struct sock_filter *filter; };
- SO_ATTACH_BPF的参数是bpf(2)系统调用返回的文件描述符,并且必须引用BPF_PROG_TYPE_SOCKET_FILTER类型的程序。
- 对于给定的套接字,可以多次设置这些选项,每次替换先前的过滤器程序。可以在同一套接字上调用经典版本和扩展版本,但是始终会替换以前的过滤器,以使一个套接字永远不会定义多个过滤器。
- 内核源文件Documentation / networking / filter.txt中解释了经典BPF和扩展BPF。
- SO_ATTACH_REUSEPORT_CBPF, SO_ATTACH_REUSEPORT_EBPF
- 为了与SO_REUSEPORT选项一起使用,这些选项使用户可以设置经典BPF(SO_ATTACH_REUSEPORT_CBPF)或扩展BPF(SO_ATTACH_REUSEPORT_EBPF)程序,该程序定义如何将数据包分配给重用端口组中的套接字(即,具有SO_REUSEPORT的所有套接字)设置并使用相同的本地地址来接收数据包)。
- BPF程序必须返回一个介于0到N-1之间的索引,该索引代表应该接收数据包的套接字(其中N是组中套接字的数量)。如果BPF程序返回无效索引,则套接字选择将退回到普通的SO_REUSEPORT机制。
- 套接字按添加到组中的顺序编号(即,对UDP套接字的bind(2)调用顺序或对TCP套接字的listen(2)调用顺序)。添加到重用端口组的新套接字将继承BPF程序。将套接字从重用端口组中删除时(通过close(2)),该组中的最后一个套接字将移至已关闭套接字的位置。
- 可以随时在组中的任何套接字上重复设置这些选项,以替换组中所有套接字使用的当前BPF程序。
- SO_ATTACH_REUSEPORT_CBPF采用与SO_ATTACH_FILTER相同的参数类型,而SO_ATTACH_REUSEPORT_EBPF采用与SO_ATTACH_BPF相同的参数类型。
- 从Linux 4.5开始提供对此功能的UDP支持。从Linux 4.6开始提供TCP支持。
- SO_BINDTODEVICE
- 按照传递的接口名称中的指定,将此套接字绑定到lqeth0rq之类的特定设备。如果名称为空字符串或选项长度为零,则删除套接字设备绑定。传递的选项是长度为NULLAM的可变长度接口名称字符串,最大大小为IFNAMSIZ。如果套接字绑定到接口,则套接字仅处理从该特定接口接收的数据包。请注意,这仅适用于某些套接字类型,尤其是AF_INET套接字。数据包套接字不支持此功能(在那里使用普通的bind(2))。
- 在Linux 3.8之前,可以设置此套接字选项,但无法使用getsockopt(2)进行检索。从Linux 3.8开始,它是可读的。 optlen参数应包含可用于接收设备名称的缓冲区大小,建议使用IFNAMSIZ字节。真实设备名称的长度在optlen参数中报告回来。
- SO_BROADCAST
- 设置或获取广播标志。启用后,允许数据报套接字将数据包发送到广播地址。此选项对面向流的套接字无效。
- SO_BSDCOMPAT
- 启用BSD错误到错误的兼容性。 Linux 2.0和2.2中的UDP协议模块使用它。如果启用,则UDP套接字收到的ICMP错误将不会传递给用户程序。在更高的内核版本中,已经淘汰了对该选项的支持:Linux 2.4静默忽略它,并且如果程序使用此选项,则Linux 2.6会生成内核警告(printk())。 Linux 2.0还使用此选项为原始套接字启用了BSD bug到bug的兼容性选项(更改随机标头,跳过广播标志),但是在Linux 2.2中已将其删除。
- SO_DEBUG
- 启用套接字调试。仅适用于具有CAP_NET_ADMIN功能或有效用户ID为0的进程。
- SO_DETACH_FILTER(since Linux 2.2), SO_DETACH_BPF(since Linux 3.19)
- 这两个选项是同义词,可用于通过SO_ATTACH_FILTER或SO_ATTACH_BPF删除附加到套接字的经典BPF程序或扩展BPF程序。选项值将被忽略。
- SO_DOMAIN(since Linux 2.6.32)
- 以整数形式检索套接字域,并返回一个值,例如AF_INET6。有关详细信息,请参见socket(2)。此套接字选项是只读的。
- SO_ERROR
- 获取并清除挂起的套接字错误。此套接字选项是只读的。需要一个整数。
- SO_DONTROUTE
- 不要通过网关发送,只能发送到直接连接的主机。通过在套接字send(2)操作上设置MSG_DONTROUTE标志可以实现相同的效果。需要一个整数布尔值标志。
- SO_INCOMING_CPU(gettable since Linux 3.19, settable since Linux 4.4)
- 设置或获取套接字的CPU相关性。需要一个整数标志。
int cpu = 1; setsockopt(fd, SOL_SOCKET, SO_INCOMING_CPU, &cpu, sizeof(cpu));
- 由于单个流的所有数据包(即,同一4元组的所有数据包)到达与特定CPU关联的单个RX队列,因此典型的使用情况是每个RX队列采用一个侦听进程,传入流由正在处理RX队列的同一CPU上的侦听器处理。这样可以提供最佳的NUMA行为,并使CPU缓存保持高温。
- SO_KEEPALIVE
- 启用在面向连接的套接字上发送保持活动消息。需要一个整数布尔值标志。
- SO_LINGER
- 设置或获取SO_LINGER选项。该论点是一个持久的结构。
struct linger { int l_onoff; /* linger active */ int l_linger; /* how many seconds to linger for */ };
- 启用后,close(2)或shutdown(2)将不会返回,直到成功发送了套接字的所有排队消息或达到了超时为止。否则,该调用将立即返回,并在后台完成关闭。当套接字作为exit(2)的一部分关闭时,它始终在后台徘徊。
- SO_LOCK_FILTER
- 设置后,此选项将防止更改与套接字关联的过滤器。这些过滤器包括使用套接字选项SO_ATTACH_FILTER,SO_ATTACH_BPF,SO_ATTACH_REUSEPORT_CBPF和SO_ATTACH_REUSEPORT_EBPF的任何集合。
- 典型的用例是特权进程设置原始套接字(此操作需要CAP_NET_RAW功能),应用限制性过滤器,设置SO_LOCK_FILTER选项,然后删除其特权或将套接字文件描述符传递给非特权进程通过UNIX域套接字进行处理。
- 启用SO_LOCK_FILTER选项后,尝试更改或删除连接到套接字的过滤器或禁用SO_LOCK_FILTER选项将失败,并显示错误EPERM。
- SO_MARK(since Linux 2.6.25)
- 为通过此套接字发送的每个数据包设置标记(类似于netfilter MARK目标,但基于套接字)。更改标记可用于不带netfilter的基于标记的路由,也可用于数据包过滤。设置此选项需要CAP_NET_ADMIN功能。
- SO_OOBINLINE
- 如果启用此选项,则将带外数据直接放入接收数据流中。否则,仅当在接收期间设置了MSG_OOB标志时,才传送带外数据。
- SO_PASSCRED
- 启用或禁用SCM_CREDENTIALS控制消息的接收。有关更多信息,请参见unix(7)。
- SO_PASSSEC
- 启用或禁用SCM_SECURITY控制消息的接收。有关更多信息,请参见unix(7)。
- SO_PEEK_OFF(since Linux 3.4)
- 当前仅支持unix(7)套接字的此选项,当与MSG_PEEK标志一起使用时,设置recv(2)系统调用的"窥视偏移"值。
- 当此选项设置为负值时(对于所有新套接字,它都设置为-1),将提供传统的行为:具有MSG_PEEK标志的recv(2)将从队列的前端窥视数据。
- 当选项设置为大于或等于零的值时,下一次窥视套接字中排队的数据将在选项值指定的字节偏移处发生。同时,"窥视偏移"将增加从队列中窥视的字节数,以便随后的窥视将返回队列中的下一个数据。
- 如果在没有MSG_PEEK标志的情况下通过调用recv(2)(或类似的命令)从队列的开头删除了数据,则"窥视偏移"将减少已删除的字节数。换句话说,接收没有MSG_PEEK标志的数据将导致"窥视偏移"被调整,以在排队的数据中保持正确的相对位置,以便随后的窥视将检索如果没有数据则应检索的数据。删除。
- 对于数据报套接字,如果"窥视偏移"指向数据包的中间,则返回的数据将用MSG_TRUNC标志进行标记。
- 以下示例用于说明SO_PEEK_OFF的用法。假设流套接字具有以下排队的输入数据:
- Aabbccddeeff
- 下面的recv(2)调用序列将具有注释中指出的效果:
int ov = 4; // Set peek offset to 4 setsockopt(fd, SOL_SOCKET, SO_PEEK_OFF, &ov, sizeof(ov)); recv(fd, buf, 2, MSG_PEEK); // Peeks "cc"; offset set to 6 recv(fd, buf, 2, MSG_PEEK); // Peeks "dd"; offset set to 8 recv(fd, buf, 2, 0); // Reads "aa"; offset set to 6 recv(fd, buf, 2, MSG_PEEK); // Peeks "ee"; offset set to 8
- SO_PEERCRED
- 返回连接到此套接字的对等进程的凭据。有关更多详细信息,请参见unix(7)。
- SO_PRIORITY
- 为要在此套接字上发送的所有数据包设置协议定义的优先级。 Linux使用此值对网络队列进行排序:优先级较高的数据包可能首先被处理,具体取决于所选设备的排队规则。设置0到6范围之外的优先级需要CAP_NET_ADMIN功能。
- SO_PROTOCOL(since Linux 2.6.32)
- 以整数形式检索套接字协议,返回诸如IPPROTO_SCTP的值。有关详细信息,请参见socket(2)。此套接字选项是只读的。
- SO_RCVBUF
- 设置或获取最大套接字接收缓冲区(以字节为单位)。使用setsockopt(2)设置时,内核会将此值加倍(以留出空间用于簿记开销),并且此值加倍后由getsockopt(2)返回。默认值由/ proc / sys / net / core / rmem_default文件设置,最大允许值由/ proc / sys / net / core / rmem_max文件设置。此选项的最小(加倍)值为256。
- SO_RCVBUFFORCE(since Linux 2.6.14)
- 使用此套接字选项,特权(CAP_NET_ADMIN)进程可以执行与SO_RCVBUF相同的任务,但是rmem_max限制可以被覆盖。
- SO_RCVLOWATand SO_SNDLOWAT
- 指定缓冲区中的最小字节数,直到套接字层将数据传递给协议(SO_SNDLOWAT)或用户接收数据(SO_RCVLOWAT)。这两个值初始化为1。SO_SNDLOWAT在Linux上不可更改(setsockopt(2)失败,错误为ENOPROTOOPT)。仅从Linux 2.4开始,SO_RCVLOWAT才可以更改。
- 在Linux 2.6.28之前,select(2),poll(2)和epoll(7)不遵循Linux上的SO_RCVLOWAT设置,并且甚至在单字节数据可用时都指示套接字是可读的。然后,从套接字的后续读取将被阻塞,直到SO_RCVLOWAT字节可用为止。从Linux 2.6.28开始,select(2),poll(2)和epoll(7)仅在至少有SO_RCVLOWAT字节可用时才将套接字指示为可读。
- SO_RCVTIMEOand SO_SNDTIMEO
- 指定接收或发送超时,直到报告错误。该参数是一个struct timeval。如果输入或输出功能在这段时间内处于阻塞状态,并且已经发送或接收了数据,则该功能的返回值将是传输的数据量;如果未传输任何数据且已达到超时,则将errno设置为EAGAIN或EWOULDBLOCK或EINPROGRESS(对于connect(2)),将返回-1,就像将套接字指定为非阻塞一样。如果超时设置为零(默认值),则操作将永不超时。超时仅对执行套接字I / O的系统调用有效(例如read(2),recvmsg(2),send(2),sendmsg(2));超时对select(2),poll(2),epoll_wait(2)等无效。
- SO_REUSEADDR
- 指示用于验证bind(2)调用中提供的地址的规则应允许重用本地地址。对于AF_INET套接字,这意味着套接字可以绑定,除非有活动的监听套接字绑定到该地址。当侦听套接字通过特定端口绑定到INADDR_ANY时,则不可能为任何本地地址绑定到该端口。参数是一个整数布尔值标志。
- SO_REUSEPORT(since Linux 3.9)
- 允许将多个AF_INET或AF_INET6套接字绑定到相同的套接字地址。在套接字上调用bind(2)之前,必须在每个套接字(包括第一个套接字)上设置此选项。为了防止端口劫持,绑定到同一地址的所有进程都必须具有相同的有效UID。此选项可与TCP和UDP套接字一起使用。
- 对于TCP套接字,此选项允许通过为每个线程使用不同的侦听器套接字来改进多线程服务器中的accept(2)负载分配。与传统技术相比,这提供了改进的负载分配,例如使用单个用于分发连接的accept(2)线程或具有多个竞争来自同一套接字的accept(2)的线程。
- 对于UDP套接字,与使多个进程竞争在同一套接字上接收数据报的传统技术相比,使用此选项可以更好地将传入的数据报分发到多个进程(或线程)。
- SO_RXQ_OVFL(since Linux 2.6.33)
- 指示应将无符号的32位值辅助消息(cmsg)附加到接收的skbs上,以指示自套接字创建以来套接字丢弃的数据包数量。
- SO_SELECT_ERR_QUEUE(since Linux 3.10)
- 在套接字上设置此选项时,套接字上的错误情况不仅导致通过select(2)的exceptfds集进行通知。同样,每当返回POLLERR事件时,poll(2)也会返回一个POLLPRI。
- 背景:仅当通过select(2)的readfds和writefds集发生错误情况时,才添加此选项。添加了该选项以允许通过exceptfds参数监视错误情况,而不必同时(通过readfds)接收可从套接字读取的常规数据的通知。在Linux 4.16中进行更改之后,不再需要使用该标志来获得所需的通知。但是,保留此选项是为了向后兼容。
- SO_SNDBUF
- 设置或获取最大套接字发送缓冲区(以字节为单位)。使用setsockopt(2)设置时,内核会将此值加倍(以留出空间用于簿记开销),并且此值加倍后由getsockopt(2)返回。默认值由/ proc / sys / net / core / wmem_default文件设置,最大允许值由/ proc / sys / net / core / wmem_max文件设置。此选项的最小值(两倍)为2048。
- SO_SNDBUFFORCE(since Linux 2.6.14)
- 使用此套接字选项,特权(CAP_NET_ADMIN)进程可以执行与SO_SNDBUF相同的任务,但是wmem_max限制可以被覆盖。
- SO_TIMESTAMP
- 启用或禁用对SO_TIMESTAMP控制消息的接收。时间戳控制消息以级别SOL_SOCKET和cmsg_type为SCM_TIMESTAMP发送。 cmsg_data字段是一个结构时间值,指示在此调用中传递给用户的最后一个数据包的接收时间。有关控制消息的详细信息,请参见cmsg(3)。
- SO_TIMESTAMPNS(since Linux 2.6.22)
- 启用或禁用对SO_TIMESTAMPNS控制消息的接收。时间戳控制消息以级别SOL_SOCKET和cmsg_type为SCM_TIMESTAMPNS发送。 cmsg_data字段是一个结构时间规范,指示在此调用中传递给用户的最后一个数据包的接收时间。用于时间戳记的时钟为CLOCK_REALTIME。有关控制消息的详细信息,请参见cmsg(3)。
- 套接字不能混合使用SO_TIMESTAMP和SO_TIMESTAMPNS:这两种模式是互斥的。
- SO_TYPE
- 获取套接字类型为整数(例如SOCK_STREAM)。此套接字选项是只读的。
- SO_BUSY_POLL(since Linux 3.11)
- 将没有数据时的阻塞接收的近似时间(以微秒为单位)设置为繁忙轮询。增加此值需要CAP_NET_ADMIN。此选项的默认值由/ proc / sys / net / core / busy_read文件控制。
- / proc / sys / net / core / busy_poll文件中的值确定当select(2)和poll(2)在设置了SO_BUSY_POLL的套接字上运行且未发现要报告的事件时,它们将忙于轮询多长时间。
- 在这两种情况下,仅当套接字最后一次从支持此选项的网络设备接收到数据时,才进行繁忙轮询。
- 虽然繁忙的轮询可能会改善某些应用程序的延迟,但是使用它时必须小心,因为这会增加CPU利用率和功耗。
Signals
当写入已被(本地或远程端)关闭的面向连接的套接字时,SIGPIPE将发送到写入过程,并返回EPIPE。当写调用指定MSG_NOSIGNAL标志时,不发送该信号。
当与FIOSETOWN fcntl(2)或SIOCSPGRP ioctl(2)一起请求时,在发生I / O事件时发送SIGIO。可以在信号处理程序中使用poll(2)或select(2)找出事件发生在哪个套接字上。一种替代方法(在Linux 2.2中)是使用F_SETSIG fcntl(2)设置实时信号。实时信号的处理程序将在其siginfo_t的si_fd字段中使用文件描述符来调用。有关更多信息,请参见fcntl(2)。
在某些情况下(例如,多个进程访问单个套接字),当进程对信号做出反应时,导致SIGIO的条件可能已经消失。如果发生这种情况,该过程应再次等待,因为Linux稍后将重新发送该信号。
/proc interfaces
可以通过目录/ proc / sys / net / core /中的文件访问核心套接字网络参数。
- rmem_default
- 包含套接字接收缓冲区的默认设置(以字节为单位)。
- rmem_max
- 包含用户可以使用SO_RCVBUF套接字选项设置的最大套接字接收缓冲区大小(以字节为单位)。
- wmem_default
- 包含套接字发送缓冲区的默认设置(以字节为单位)。
- wmem_max
- 包含最大套接字发送缓冲区大小(以字节为单位),用户可以通过使用SO_SNDBUF套接字选项设置。
- message_costand message_burst
- 配置令牌桶过滤器,该令牌桶过滤器用于加载由外部网络事件引起的限制警告消息。
- netdev_max_backlog
- 全局输入队列中的最大数据包数。
- optmem_max
- 每个套接字的辅助数据和用户控制数据(如iovecs)的最大长度。
Ioctls
可以使用ioctl(2)访问这些操作:
error = ioctl(ip_socket, ioctl_type, &value_result);
- SIOCGSTAMP
- 返回带有传递给用户的最后一个数据包的接收时间戳的struct timeval。这对于准确的往返时间测量很有用。有关结构时间的描述,请参见setitimer(2)。仅当未在套接字上设置套接字选项SO_TIMESTAMP和SO_TIMESTAMPNS时,才应使用此ioctl。否则,它将返回未设置SO_TIMESTAMP和SO_TIMESTAMPNS时接收到的最后一个数据包的时间戳,或者如果未接收到此类数据包则失败,即失败(即ioctl(2)返回-1,并将errno设置为ENOENT)。
- SIOCSPGRP
- 设置在可能进行I / O或紧急数据可用时接收SIGIO或SIGURG信号的过程或过程组。该参数是指向pid_t的指针。有关更多详细信息,请参见fcntl(2)中对F_SETOWN的描述。
- FIOASYNC
- 更改O_ASYNC标志以启用或禁用套接字的异步I / O模式。异步I / O模式意味着在发生新的I / O事件时,将触发SIGIO信号或使用F_SETSIG设置的信号。
- 参数是一个整数布尔值标志。 (此操作与使用fcntl(2)设置O_ASYNC标志同义。)
- SIOCGPGRP
- 获取接收SIGIO或SIGURG信号的当前进程或进程组,如果未设置则为0。
有效的fcntl(2)操作:
版本
SO_BINDTODEVICE在Linux 2.0.30中引入。 SO_PASSCRED是Linux 2.2中的新增功能。 / proc接口是Linux 2.2中引入的。从Linux 2.3.41开始支持SO_RCVTIMEO和SO_SNDTIMEO。以前,超时已固定为特定于协议的设置,并且无法读取或写入。
备注
Linux假设发送/接收缓冲区的一半用于内部内核结构;因此,相应的/ proc文件中的值是在线上可以观察到的值的两倍。
当在对端口执行bind(2)的上一个程序和想要重用该端口的程序中都设置了该选项时,Linux仅允许使用SO_REUSEADDR选项来重用端口。这与某些实施方式(例如FreeBSD)不同,在某些实施方式中,只有更高版本的程序才需要设置SO_REUSEADDR选项。通常,这种差异是不可见的,因为例如,服务器程序被设计为始终设置此选项。
另外参见
wirehark(1),bpf(2),connect(2),getsockopt(2),setsockopt(2),socket(2),pcap(3),address_families(7),capabilities(7),ddp(7), ip(7),数据包(7),tcp(7),udp(7),unix(7),tcpdump(8)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。