`
vtrzf96b
  • 浏览: 12443 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

CAsyncSocket::SetSockOpt全解

 
阅读更多

CAsyncSocket::SetSockOpt全解
2012年01月01日
  CAsyncSocket::SetSockOpt
  BOOL SetSockOpt( int nOptionName, const void* lpOptionVlaue, int nOptionLen, int nLevel = SOL_SOCKET );
  返回值:
  调用成功时,返回非零值,否则为0,并可以调用GetLastError取得特定的错误代码。此成员函数可用的错误代码有: ??WSANOTINITIALISED在调用本API函数之前,必须已经成功地执行AfxSocketInit。??WSAENETDOWNWindows Sockets检测到网络系统故障。??WSAEFAULTlpOptionValue不是进程地址空间中的有效值。??WSAEINPROGRESS正在执行一个成块的Windows Sockets操作。??WSAEINVALnLevel无效,或者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指向待设置的值所在缓冲的指针。nOptionLenlpOptionValue缓冲的字节数。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_BROADCASTBOOL允许在套接字上传输广播消息SO_DEBUGBOOL记录调试信息SO_DONTLINGERBOOL不成块等待未发送数据发送完的Close调用;设置本选项和在l_onofff=0时设置SO_LINGER等价SO_DONTROUTEBOOL不经路由转换:直接把数据发到接口SO_KEEPALIVEBOOL发送keep_alivesSO_LINGERstruct LINGER如果有未发送数据,则在Close时延时等待SO_OOBINLINEBOOL在普通数据流中接收带外数据SO_RCVBUFint设置接收数据的缓冲的大小SO_REUSEADDRBOOL允许套接字绑定到一个已经使用的地址上SO_SNDBUFint设置发送数据的缓冲的大小TCP_NODELAYBOOL禁止发送数据时的Nagle算法
  SetSockOpt不支持的Berkeley软件发布(BSD)选项有: 值类型含义SO_ACCEPTCONNBOOL套接字正在监听,允许接收连接SO_ERRORint返回并清除错误状态SO_RCVLOWATint接收最低水准标志SO_RCVTIMEOint接收到超时消息SO_SNDLOWATint发送最低水准标志SO_SNDTIMEOint发送超时消息SO_TYPEint设置套接字的类型IP_OPTIONSint设置IP头上的选项字段
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics