SetSockOpt 详解

CAsyncSocket::SetSockOpt

BOOL SetSockOpt( int nOptionName, const void* lpOptionVlaue, int nOptionLen, int nLevel = SOL_SOCKET );

返回值:
调用成功时,返回非零值,否则为0,并可以调用GetLastError取得特定的错误代码。此成员函数可用的错误代码有:
· WSANOTINITIALISED 在调用本API函数之前,必须已经成功地执行AfxSocketInit。
· WSAENETDOWN Windows Sockets检测到网络系统故障。
· WSAEFAULT lpOptionValue不是进程地址空间中的有效值。
· WSAEINPROGRESS 正在执行一个成块的Windows Sockets操作。
· WSAEINVAL nLevel无效,或者lpOptionValue中的信息无效。
· WSAENETRESET 当设置了SO_KEEPALIVE时,连接超时。
· WSAENOPROTOOPT 系统不支持该选项。SOCK_STREAM型的套接字不支持SO_BROADCAST,SOCK_DGRAM型的套接字不支持SO_DONTLINGER,SO_KEEPALIVE,SO_LINGER和SO_OOBINLINE等选项。
· WSAENOTCONN 当设置了SO_KEEPALIVE时,连接已经被重置
· WSAENOTCONN 套接字没有连接上(仅用于SOCK_STREAM型的套接字)。
· WSAENOTSOCK 描述符不是一个套接字。

参数:
nOptionName 准备设置值的套接字选项。
lpOptionValue 指向待设置的值所在缓冲的指针。
nOptionLen lpOptionValue缓冲的字节数。
nLevel 选项定义所在的级别,系统支持的级别只有SOL_SOCKET和IPPROTO_TCP。

说明:
本函数用于设置套接字的选项。它可以设置任何类型和状态的套接字的选项,改变它们的当前值。虽然选项可以存在于协议的多个级别,本函数只设置协议的最高级别(socket)的选项。选项会影响套接字的操作,例如是否允许在普通数据流中接收快速传输的数据,是否允许在套接字中发送广播消息等等。
套接字选项分为两种:布尔型的选项(允许或者禁止某一功能),整数型或者结构型的选项。要允许某个布尔型的选项,lpOptionVlaue只需指向一个非零整数。禁止该选项时,lpOptionValue就指向一个等于0的整数。对布尔型的选项来说,nOptionLen应该和sizeof(BOOL)相等。对其它的选项来说,lpOptionValue指向包含了选项所需值的整数或者结构,nOptionLen则指明整数类型或者结构的长度。
SO_LINGER用于控制未发送数据在套接字上的排队方式,以及调用Close函数关闭套接字时的行为。要了解更详细的信息,请参阅联机文档“Win32 SDK”中的“Windows套接字编程注意事项”。
缺省时,套接字不能被绑定到一个正在使用的本地地址上。然而,在某些场合,希望能重用这些地址。既然每个连接是由本地地址和远地地址共同来唯一确定的,保持远地地址不同,同时让两个套接字绑定到同一个本地地址是完全可行的。
如果调用Bind时的地址已经被另一个套接字使用, Windows Sockets的实现会禁止这个绑定。为了避免这个情况,从而实现地址的重用,就需要在调用Bind之前,设置套接字选项SO_REUSEADDR。该选项只在调用Bind时才起作用。没有必要把一个没有重用地址的套接字的选项设为SO_REUSEADDR,在调用Bind后设置或者重置这个选项对任何套接字都不会发生影响。
应用可以设置SO_KEEPALIVE选项,从而可以使用Windows Sockets实现所提供的传输控制协议(TCP)的“保持活动”包(关于“keep-alive”包的详细内容,请参阅联机文档“Win32 SDK”中的“Windows套接字编程注意事项”)。Windows Sockets的具体实现不一定要支持“保持活动”包。如果要支持的话,它的精确语义可由实现定义,但必须和RFC1122中4.2.3.6节“Internet主机——通信层需求”阐述的内容一致。如果因为“保持活动”而删除了一个连接,在这个套接字上的任何调用都返回错误代码WSAENETRESET,以后的调用则返回错误代码WSAENOTCONN。
设置TCP_NODELAY选项可以禁止Nagle算法。Nagle算法缓冲主机发送的那些未被确认的小数据包,并组成一个大的数据包,从而减少了发送的数据包个数。然而,对某些应用来说,这样会影响效率,可以设置TCP_NODELAY来禁止Nagle算法。应用编程轻易不要把这个选项设置为TCP_NODELAY,因为它会对网络性能产生较大的负面影响。TCP_NODELAY是支持的唯一一个IPPROTO_TCP级别的套接字选项。Windows Sockets的某些实现可以通过设置SO_DEBUG选项来支持调试信息的输出。

SetSockOpt支持的选项如下表,类型列指的是lpOptionValue指向的数据类型。
类型 含义
SO_BROADCAST BOOL 允许在套接字上传输广播消息
SO_DEBUG BOOL 记录调试信息
SO_DONTLINGER BOOL 不成块等待未发送数据发送完的Close调用;设置本选项和在l_onofff=0时设置SO_LINGER等价
SO_DONTROUTE BOOL 不经路由转换:直接把数据发到接口
SO_KEEPALIVE BOOL 发送keep_alives
SO_LINGER struct LINGER 如果有未发送数据,则在Close时延时等待
SO_OOBINLINE BOOL 在普通数据流中接收带外数据
SO_RCVBUF int 设置接收数据的缓冲的大小
SO_REUSEADDR BOOL 允许套接字绑定到一个已经使用的地址上
SO_SNDBUF int 设置发送数据的缓冲的大小
TCP_NODELAY BOOL 禁止发送数据时的Nagle算法

SetSockOpt不支持的Berkeley软件发布(BSD)选项有:
类型 含义
SO_ACCEPTCONN BOOL 套接字正在监听,允许接收连接
SO_ERROR int 返回并清除错误状态
SO_RCVLOWAT int 接收最低水准标志
SO_RCVTIMEO int 接收到超时消息
SO_SNDLOWAT int 发送最低水准标志
SO_SNDTIMEO int 发送超时消息
SO_TYPE int 设置套接字的类型
IP_OPTIONS int 设置IP头上的选项字段

你可能感兴趣的:(VC++,重温笔记)