setsockopt 子例程

用途

设置插座选项。

标准 C 库 (libc.a)

语法

#include <sys/types.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/atmsock.h> /*Needed for SOCK_CONN_DGRAM socket type 
only*/
int setsockopt ( Socket, Level, OptionName, OptionValue, OptionLength )
int Socket,Level,OptionName;
const void* OptionValue;
socklen_t OptionLength;

描述

setsockopt 子程序设置与套接字相关的选项。 这些选项可以存在于多个协议层面。 选项位于插座的最上层。

setsockopt 子程序为应用程序提供了控制套接字通信的手段。 应用程序可以使用 setsockopt 子程序在协议级别进行调试、分配缓冲区空间、控制超时或允许套接字数据广播。 /usr/include/sys/socket.h 文件定义了 setsockopt 子程序可用的选项。

在设置套接字选项时,指定选项所在的协议级别和选项名称。

使用 OptionValueOptionLength 参数访问 setsockopt 子程序的选项值。 和 OptionValueOptionLength 参数标识了一个缓冲区,在该缓冲区中将返回所请求选项的值或。

在编译包含 setsockopt 子程序的应用程序时,必须将 _BSD 宏设置为特定值。 可接受的数值是 4344。 此外,所有套接字应用程序都必须包含 Berkeley Software Distribution (BSD) libbsd.a 库。

参数

表 1. 参数
描述
套接字 指定套接字的唯一名称。
级别 指定选项所在的协议级别。 您可以在以下级别设置插座选项:
套接字级别
级别参数指定为 SOL_SOCKET 选项。
其他级别
为控制选项的协议提供相应的协议编号。 例如,要表示 TCP 协议解释该选项,可将 Level 参数设置为 netinet/in.h 文件中定义的 TCP 协议编号。 同样,要表示 ATM 协议解释该选项,可将 Level 参数设置为 sys/atmsock.h 文件中定义的 NDDPROTO_ATM 选项。
OptionName 指定要设置的选项。 参数 OptionName 参数和指定的选项将不经解释传递给相应的协议模块进行解释。 sys/socket.h 文件定义了套接字协议级选项。 netinet/tcp.h 文件定义了 TCP 协议级选项。 您可以启用或禁用插座级选项,它们以切换方式运行。

下面的列表定义了 sys/socket.h 文件中可用的套接字协议级选项:

SO_DEBUG
启用或禁用底层协议模块的调试。 SO_DEBUG 打开调试信息的记录功能。 在命令级别通过下列其中一种方式设置此选项:
  • 使用 sodebug 命令可为现有插座打开或关闭该选项。
  • 要为特定服务打开该选项,必须在 inetd.conf 文件的 wait/nowait 服务字段中指定 |DEBUG[=level]
  • 要为进程创建的所有后续套接字打开或关闭该选项,必须将 sodebug_env 参数设置为 " "。 在流程环境中指定 SODEBUG=level
电平参数的值可以是最小值正常值详细值。
SO_REUSEADDR
指定用于验证子程序提供的地址的规则必须允许重复使用本地端口。 bind 子程序所提供地址的验证规则必须允许重复使用本地端口。

SO_REUSEADDR 选项允许应用程序明确拒绝后续的 bind 子程序使用 SO_REUSEADDR 套接字选项的端口或地址。 这样,应用程序就可以阻止其他应用程序与 bind 子程序绑定。

SO_REUSEPORT
指定用于验证子程序提供的地址的规则必须允许重复使用本地端口或地址组合。 bind 子程序所提供地址的验证规则必须允许重复使用本地端口或地址组合。 每个端口或地址组合的绑定都必须指定 SO_REUSEPORT 套接字选项
SO_CKSUMREV
提高协议层的性能。 如果协议支持 SO_CKSUMREV 选项,则启用该选项会使协议推迟校验和验证,直到用户数据被移入用户缓冲区(在 recv, recvfrom, readrecvmsg 线程上)。 在出现校验和错误并返回 EAGAIN 的情况下,这会导致应用程序在无数据可用时被唤醒。 设置该选项的应用程序必须处理来自接收调用的 EAGAIN 错误代码 rturned
SO_KEEPALIVE
启用或禁用在连接的套接字上定期发送 ACK 消息,以监控连接活动。 空闲间隔时间可通过 Transmission Control Protocol / Internet Protocol (TCP/IP) no 命令指定空闲间隔时间。 有关断开连接的更多信息,请参阅《 通信编程概念》 中的《 了解套接字类型和协议》。
OptionName
SO_DONTROUTE
不对外发消息应用路由。 表示外发信息必须绕过标准路由设施。 而是根据目的地址的网络部分将它们定向到相应的网络接口。
SO_BROADCAST
允许发送广播信息。
SO_LINGER
当套接字存在未发送的报文队列,且进程在套接字上执行 close 子程序时,控制所采取的操作。 停留在 close 如果存在数据,则停留在子程序上。 如果设置了 SO_LINGER 选项,系统就会在 close 子程序期间阻塞进程,直到可以传输数据或时间结束。 如果未指定 SO_LINGER 选项,并且发出了 close 子程序,系统将以允许进程尽快继续的方式处理调用。

sys/socket.h 文件定义了 linger 结构,该结构包含 l_linger 成员,用于指定 linger 时间间隔。 如果 linger 时间设置为 0 以外的任何值,系统都会尝试发送套接字上排队的任何信息。 l_linger 成员的最大值为 65535。 如果应用程序通过导出 XPG_SUS_ENV 环境变量要求 SPEC1170 兼容行为,则 linger 时间为 n 秒。 否则, linger 时间为每 100 秒(ticks) n 次,其中 nl_linger 成员的值。

SO_OOBINLINE
将接收到的带外数据(标记为紧急的数据)保留在线路中。
SO_SNDBUF
设置发送缓冲区大小。
SO_RCVBUF
设置接收缓冲区大小。
SO_SNDLOWAT
设置发送低水位。
SO_RCVLOWAT
将接收设置为低水位。
SO_SNDTIMEO
设置使用 socket 调用的发送类型函数(如 sendwrite 子程序)在完成之前被阻塞的最长时间。 SO_SNDTIMEO 选项需要使用 TIMEVAL 结构。 TIMEVAL 结构包含秒数和微秒数。 可以微秒为单位指定 TIMEVAL 值。 不过,用于实现该功能的内部 TCP/IP 定时器的粒度为 10 毫秒。 如果超时值设置为小于 10 毫秒,其结果与未设置超时值时的行为相同。
SO_RCVTIMEO
设置使用 socket 调用的接收类型函数(如 recvread 子程序)在完成之前的最长等待时间。 SO_RCVTIMEO 选项需要一个 TIMEVAL 结构。 TIMEVAL 结构包含秒数和微秒数。 可以微秒为单位指定 TIMEVAL 值。 不过,用于实现该功能的内部 TCP/IP 定时器的粒度为 10 毫秒。 如果超时值设置为小于 10 毫秒,其结果与未设置超时值时的行为相同。
SO_ERROR
设置错误状态的检索和清除。
SO_TYPE
设置套接字类型的检索。
OptionName

以下列表定义了 netinet/tcp.h 文件中可用的 TCP 协议级选项:

TCP_CWND_IF
在避免拥塞期间增加 TCP 拥塞窗口 (cwnd) 的因子。 该值必须在 0100 范围内( 0 表示禁用)。 启用 tcp_cwnd_modified 网络可调选项。
TCP_CWND_DF
在避免拥塞期间降低 TCP cwnd 的系数。 该值必须在 0100 范围内( 0 表示禁用)。 启用 tcp_cwnd_modified 网络可调选项。
tcp_notenter_sstart
避免在重传超时后重新进入慢启动,因为这可能会将 cwnd 重置为初始窗口大小,而不是当前慢启动阈值 (ss_threshold) 或最大 cwnd (max cwnd/2 ) 的一半。 1 表示启用, 0 表示禁用。 启用 tcp_cwnd_modified 网络可调选项。
tcp_ noreduce_cwnd_in_frxmt
不减少快速重传短语中的 cwnd 大小。 1 表示启用, 0 表示禁用。 启用 tcp_cwnd_modified 网络可调选项。
tcp_ noreduce_cwnd_exit_frxmt
退出快速重传短语时不减少 cwnd 大小。 1 表示启用, 0 表示禁用。 启用 tcp_cwnd_modified 网络可调选项。
TCP_KEEPCNT
指定要发送以验证连接的最大保持活动包数。 此套接字选项值继承自父套接字。 缺省值为 8
TCP_KEEPIDLE
指定连接空闲时间的秒数,TCP 在空闲时间后发送保持数据包。 此套接字选项值继承自接受系统调用的父套接字。 缺省值为 7200 秒 (14400 半秒)。
TCP_KEEPINTVL
指定每个 keepalive 数据包之间的时间间隔。 时间间隔以秒为单位。 此套接字选项值继承自接受系统调用的父套接字。 缺省值为 75 秒 (150 半秒)。
tcp_nodelay
指定 TCP 是否必须遵循 Nagle 算法来决定何时发送数据。 缺省情况下,TCP 遵循 Nagle 算法。 要禁用这种行为,应用程序可以启用 TCP_NODELAY 选项,强制 TCP 立即发送数据。 例如,当有应用程序使用 TCP 进行请求或响应时,必须使用 TCP_NODELAY 选项。
OptionName
TCP_RFC1323
启用或禁用指定 TCP 套接字上的 RFC 1323 增强功能。 应用程序可能包含以下几行,以启用 RFC 1323:
int on=1;
setsockopt(s,IPPROTO_TCP,TCP_RFC1323,&on,
           sizeof(on));
TCP_STDURG
启用或禁用符合 RFC 1122 标准的紧急点处理。 默认情况下,TCP 执行与 4.2 BSD 操作系统一致的紧急指针行为,即该选项的默认值为 0
TCP_NODELAYACK
指定 TCP 是否需要向发送方发送即时确认数据包。 如果不设置该选项,TCP 将延迟发送确认数据包,延迟时间最长可达 200 毫秒。这样,确认信息就能与响应数据一起发送,从而最大限度地减少系统开销。 如果设置了这个 TCP 选项,可能会导致系统开销略有增加,但如果发送方需要等待接收方的确认,则可以提高网络传输的性能。

TCP 协议级套接字选项从监听套接字继承到新套接字。

下面的列表定义了 sys/atmsock.h 文件中可用的 ATM 协议级选项:

SO_ATM_PARAM
设置 ATM 参数。 你可以使用 SO_ATM_PARAM 套接字选项,而不是使用下面描述的单个套接字选项。 它使用 sys/call_ie.h 文件中定义的 connect_ie 结构。
so_atm_aal_parm
设置 ATM AAL(适配层)参数。 它使用 sys/call_ie.h 文件中定义的 aal_parm 结构。
So_ATM_TRAFFIC_DES
设置 ATM 流量描述符值。 它使用 sys/call_ie.h 文件中定义的 traffic 结构。
SO_ATM_BEARER
设置 ATM 承载能力。 它使用 sys/call_ie.h 文件中定义的 bearer 结构。
SO_ATM_BHLI
设置 ATM 宽带高层信息。 它使用 sys/call_ie.h 文件中定义的 bhli 结构。
SO_ATM_BLLI
设置 ATM 宽带低层信息。 它使用 sys/call_ie.h 文件中定义的 blli 结构。
SO_ATM_QOS
设置 ATM 服务质量值。 它使用 sys/call_ie.h 文件中定义的 qos_parm 结构。
So_ATM_Transit_SEL
设置 ATM 转接选择载波。 它使用 sys/call_ie.h 文件中定义的 transit_sel 结构。
OptionName
SO_ATM_ACCEPT
表示接受通过 ACCEPT 系统调用向应用程序发出的 ATM 呼入。 这必须是要完全建立入局连接的问题。 这样就可以协商 ATM 参数。
so_atm_max_pend
设置在由于传输操作而向应用程序返回错误指示之前允许的未完成传输缓冲区数。 此选项仅对非尽力而为的虚拟电路类型有效。 或 OptionValueOptionLength 参数指向一个字节,该字节包含该参数被设置的值。

以下列表定义了 netinet/sctp.h 文件中可用的 IPPROTO_TCP 协议级选项:

sctp_peer_addr_params
启用或禁用关联的脉动信号,并修改关联的脉动信号间隔。 该选项使用 netinet/sctp.h 文件中定义的 sctp_paddrparams 结构。 对于 spp_address 字段, AIX® 现在只支持通配符地址。 spp_flags 字段支持 SPP_HB_ENABLESPP_HB_DISABLESPP_HB_TIME_ISZERO 标志。 您可以将 spp_hbinterval 字段设置为最小值 50 毫秒。
SCTP_MAXSEG
设置任何传出 SCTP DATA 块的最大大小。 如果报文大于指定大小,SCTP 会将报文分割成指定大小。 它使用 netinet/sctp.h 文件中定义的 sctp_assoc_value 结构。
OptionValue OptionValue 参数取一个 Int 参数。 要启用布尔选项,必须将 OptionValue 参数设置为非零值。 要禁用布尔选项,请将 OptionValue 参数设置为 0

以下选项的启用和禁用方式相同:

  • SO_DEBUG
  • SO_REUSEADDR
  • SO_KEEPALIVE
  • SO_DONTROUTE
  • SO_BROADCAST
  • SO_OOBINLINE
  • SO_LINGER
  • TCP_RFC1323
OptionLength 参数 OptionLength 参数所指向的缓冲区的大小。 OptionValue 参数指向的缓冲区大小。

其他协议级别的选项的格式和名称各不相同。

表 2. IP 级选项
描述
IP_DONTFRAG 从现在开始为 IP 头中的每个包设置 DF 位。 使用 IP_DONTFRAG 选项检测 UDP 应用程序中路径 MTU (PMTU) 的减少。
IP_FINDPMTU 设置启用或禁用此路径的 PMTU 发现。 启用 MTU 发现的协议级路径,以便进行发现。
IP_PMTUAGE 设置 PMTU 的年龄。 指定会话 PMT 恢复的频率。 将 PMTU 年龄设为 0 意味着无限年龄,不会尝试发现 PMTU 减少,并取代先前设置的 PMTU 年龄。 新的 PMTU 有效期在当前设置的计时器到期后生效。 该选项未被使用,因为 UDP 应用程序必须设置 IP_DONTFRAG 套接字才能立即检测到 PMTU 的下降。
IP_TTL 为每个数据包设置 IP 报头中的生存时间 (TTL) 字段。 但是,对于原始套接字,无论使用 setsockopt 子程序设置了多少值,在发送报文时都会使用默认的 MAXTTL 值。
IP_HDRINCL 允许您创建自己的 IP 标头。 它指示完整的 IP 头包含在数据中,并且只能用于原始套接字。
IP_ADD_成员资格 加入一个组播组,该组播组在 OptionValueip_mreq 参数中指定的多播组。
IP_DROP_成员资格 结构类型中指定的组播组。 OptionValueip_mreq 参数中指定的多播组。
ip_multicast_if 允许在一个接口上发送组播信息,该接口在 OptionValueip_addr 参数中指定的接口上发送多播信息。 INADDR_ANY ( 0x000000000 ) 的地址会删除先前在组播选项中对接口的选择。 如果未指定接口,则使用通向默认路由的接口。
ip_multicast_loop 设置组播环回,决定传输的信息是否会被传送到发送主机。 一个 OptionValuechar 类型的参数控制环回的开启或关闭。
ip_multicast_ttl 设置组播数据包的 TTL。 一个 OptionValuechar 类型的参数设置的 TTL 值范围为 0255
IP_block_source 阻止数据从给定源发送到给定组。
IP_unblock_source 解除屏蔽源,以撤销 IP_BLOCK_SOURCE 操作。
IP_ADD_SOURCE_成员资格 连接特定于源的多点广播组。 如果主机是组的成员,则接受来自源的数据。 否则,加入该组并接受来自给定来源的数据。
IP_DROP_SOURCE_成员资格 保留特定于源的多点广播组。 从给定的多点广播组列表中删除源。 要删除指定组中的所有源,必须使用 IP_DROP_MEMBERSHIP socket 选项。
表 3. IPv6 级别选项
描述
IPPROTO_IPV6 限制 AF_INET6 插座只能用于 IPv6 通信。
选项类型
int (布尔解释)
  允许您设置单播 IPv6 数据包的传出跳数限制。
选项类型
int (x)
选项值
x < -1 错误 EINVAL
x ==-1使用内核默认值
0 <= x <= 255 使用
x x >= 256 错误 EINVAL
  允许您设置组播 IPv6 数据包的传出跳数限制。
选项类型
int (x)
选项值
解释与 IPV6_UNICAST_HOPS (前面列出的)。
  允许您指定用于传出组播数据包的接口。 如果指定为 0 ,系统将选择传出接口。
选项类型
无符号 int(要使用的接口索引)
  如果组播数据报被发送到发送主机所属的组,那么在选项设置为 1 的情况下,该数据报的副本会被 IP 层环回以进行本地传送。 如果该选项设置为 0 ,则副本不会循环返回。
选项类型
Unsigned int
  在指定的本地接口上连接多点广播组。 如果接口索引指定为 0 ,内核将选择本地接口。
选项类型
struct ipv6_mreq netinet/in.h 中的定义。
  将多点广播组保留在指定接口上。
选项类型
struct ipv6_mreq netinet/in.h 中的定义。
  指定内核对原始套接字的数据和 pseudo-IPv6 标头计算校验和。 内核会计算传出数据包的校验和,并验证该套接字上传入数据包的校验和。 校验和不正确的传入数据包将被丢弃。 缺省情况下,此选项处于禁用状态。
选项类型
整数
选项值
必须存储校验和结果的用户数据中的偏移量。 这必须是一个积极的偶数值。 如果值设置为 -1 ,则禁用该选项。
  使入局 IPv6 包的目标 IPv6 地址和到达接口索引作为 UDP 和原始套接字上的辅助数据接收。
选项类型
int (布尔解释)
  使入局 IPv6 包的中继段限制作为 UDP 和原始套接字上的辅助数据接收。
选项类型
int (布尔解释)
  使入局 IPv6 包的流量类作为 UDP 和原始套接字上的辅助数据接收。
选项类型
int (布尔解释)
  使传入 IPv6 数据包的路由标头作为 UDP 和原始套接字的辅助数据接收。
选项类型
int (布尔解释)
  使传入 IPv6 数据包的逐跳选项标头作为 UDP 和原始套接字的辅助数据接收。
选项类型
int (布尔解释)
  使传入 IPv6 数据包的目标选项头作为 UDP 和原始套接字的辅助数据接收。
选项类型
int (布尔解释)
  为该套接字发送的所有 IPv6 数据包设置源 IPv6 地址和传出接口索引。 您可以通过常规的 setsockopt 清除该选项。 ipi6_addrin6addr_anyipi6_ifindex0
选项类型
struct in6_pktinfo 在 文件中定义。 netinet/in.h
  设置该套接字上 IPv6 数据报的下一跳。 您可以通过长度为 0 的常规 setsockopt 清除该选项。 必须为选项值提供一个内存指针。
选项类型
struct sockaddr_in6 在 文件中定义。 netinet/in.h
  设置 IPv6 数据报的流量类别。 要清除该选项,应用程序可将其值指定为 -1
选项类型
int (x)
选项值
x < -1 错误 EINVAL
x ==-1使用内核默认值
0 <= x <= 255 使用
x x >= 256 错误 EINVAL
  设置 IPv6 数据报的路由头。 可以通过长度为 0 的常规 setsockopt 清除该选项。 在这种情况下,仍必须为选项值提供内存指针。
选项类型
struct ip6_rthdr 在 文件中定义。 netinet/ip6.h
  设置 IPv6 数据报的逐跳选项报头。 可以通过长度为 0 的常规 setsockopt 清除该选项。 在这种情况下,仍必须为选项值提供内存指针。
选项类型
struct ip6_hbh 在 文件中定义。 netinet/ip6.h
  设置 IPv6 数据报的目标选项报头。 该标头位于路由标头之后,在未指定路由标头时使用。 可以通过长度为 0 的常规 setsockopt 清除该选项。 在这种情况下,仍必须为选项值提供内存指针。
选项类型
struct ip6_dest 在 文件中定义。 netinet/ip6.h
  设置 IPv6 数据报的目标选项报头。 该标头位于路由标头之前。 如果没有指定路由标头,该选项将被忽略。 可以通过长度为 0 的常规 setsockopt 清除该选项。 在这种情况下,仍必须为选项值提供内存指针。
选项类型
struct ip6_dest 在 文件中定义。 netinet/ip6.h
  设置此选项以控制 IPv6 路径 MTU 发现。
选项类型
整数
选项类型
- 1 为单播目的地执行路径 MTU 发现,但不为组播目的地执行。 0 执行路径 MTU 发现。 1 禁用路径 MTU 发现,并以最小 MTU 发送数据包。
  设置该选项可防止 IPv6 数据包在该套接字上被分片。 如果发送的数据包大于输出接口 MTU,则会丢弃该数据包。
选项类型
int (布尔解释)
  通过设置此选项可接收 IPV6_PATHMTU 辅助数据项。
选项类型
int (布尔解释)
  设置此套接字的地址选择首选项。
选项类型
int
选项值
netinet/in.h 文件中定义的 IPV6_PREFER_SRC_* 标志的组合。
  加入 结构的参数中指定的组播组。 OptionValuegroup_req 参数中指定的多播组。 如果指定的接口索引为 0 ,内核将选择默认接口。
选项类型
struct group_req netinet/in.h 中的定义。
  离开 结构参数中指定的组播组。 OptionValuegroup_req 参数中指定的组播组。
选项类型
struct group_req netinet/in.h 中的定义。
  将指定源中的数据阻塞到指定的多点广播组。
选项类型
struct group_source_req netinet/in.h 中的定义。
  将数据从指定的源取消阻塞到指定的多点广播组。 此选项用于撤销 MCAST_BLOCK_SOURCE 操作。
选项类型
struct group_source_req netinet/in.h 中的定义。
  连接特定于源的多点广播组。 如果主机已经是组的成员,则接受来自指定来源的数据。 否则,加入该组并接受来自指定来源的数据。
选项类型
struct group_source_req netinet/in.h 中的定义。
  保留特定于源的多点广播组。 从指定的多点广播组中保留指定的源。 要离开组播组的所有来源,必须使用 IPV6_LEAVE_GROUPMCAST_LEAVE_GROUP 套接字选项。
选项类型
struct group_source_req netinet/in.h 中的定义。
表 4. ICMPV6 级别选项
描述
IPPROTO_ICMPV6 通过 ICMPV6 类型字段过滤 ICMPV6 邮件。 发出长度为零的 setsockopt 调用,清除现有过滤器。
选项类型
netinet/icmp6.h 文件中定义的 icmp6_filter 结构。
setsockopt 子程序使用 /usr/include/netint/tcp.h 文件中定义的以下值配置 dacinet 功能。
tcp.h:#define TCP_ACLFLUSH    0x21    /* clear all DACinet ACLs */
tcp.h:#define TCP_ACLCLEAR    0x22    /* clear DACinet ACL */
tcp.h:#define TCP_ACLADD      0x23    /* Add to DACinet ACL */
tcp.h:#define TCP_ACLDEL      0x24    /* Delete from DACinet ACL */
tcp.h:#define TCP_ACLLS       0x25    /* List DACinet ACL */
tcp.h:#define TCP_ACLBIND     0x26    /* Set port number for TCP_ACLLS */
tcp.h:#define TCP_ACLGID      0x01    /* ID being added to ACL is a GID */
tcp.h:#define TCP_ACLUID      0x02    /* ID being added to ACL is a GID */
tcp.h:#define TCP_ACLSUBNET   0x04    /* address being added to ACL is a subnet */
tcp.h:#define TCP_ACLDENY     0x08    /* this ACL entry is for denying access */
注: DACinet 工具仅在 CAPP/EAL4 + 配置的 AIX 系统中可用。

返回值

成功完成后,返回值为 0

如果 setsockopt 子程序不成功,子程序处理程序将执行以下功能:

  • 向调用程序返回 -1
  • 将表示特定错误的错误代码移入 errno 全局变量。

错误代码

表 5. 错误代码
描述
EBADF Socket 参数无效。
Efault 地址参数不在用户地址空间的可写部分。
EINVAL 参数或 OptionValue 参数或 OptionLength 参数无效或套接字已关闭。
ENOBUFS 内部数据结构内存不足。
ENOTSOCK Socket 参数指的是文件,而不是套接字。
ENOPROTOOPT 选项未知。
EOPNOTSUPP 套接字系列或套接字类型不支持 EOPNOTSUPP 选项。
EPERM 用户应用程序无权获取或设置此套接字选项。 检查网络可调选项。

示例

  • 要标记要广播的套接字,请输入以下命令:
    int on=1;
    setsockopt(s, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));
  • 要打开 TCP_NODELAYACK 选项,请输入以下命令:
    int on=1;
    setsockopt(s, IPPROTO_TCP, TCP_NODELAYACK, &on, sizeof(on));