setsockopt()

简述:

设置套接口的选项。   #include <winsock.h>   int PASCAL FAR setsockopt( SOCKET s, int level, int optname,   const char FAR *optval, int optlen);   s:标识一个套接口的描述字。   level:选项定义的层次;目前仅支持SOL_SOCKET和IPPROTO_TCP层次。   optname:需设置的选项。   optval:指针,指向存放选项值的缓冲区。   optlen:optval缓冲区长度。

注释:

  setsockopt()函数用于任意类型、任意状态套接口的设置选项值。尽管在不同协议层上存在选项,但本函数仅定义了最高的“套接口”层次上的选项。选项影响套接口的操作,诸如加急数据是否在普通数据流中接收,广播数据是否可以从套接口发送等等。   有两种套接口的选项:一种是布尔型选项,允许或禁止一种特性;另一种是整形或结构选项。允许一个布尔型选项,则将optval指向非零整形数;禁止一个选项optval指向一个等于零的整形数。对于布尔型选项,optlen应等于sizeof(int);对其他选项,optval指向包含所需选项的整形数或结构,而optlen则为整形数或结构的长度。SO_LINGER选项用于控制下述情况的行动:套接口上有排队的待发送数据,且closesocket()调用已执行。参见closesocket()函数中关于SO_LINGER选项对closesocket()语义的影响。

操作特性

  应用程序通过创建一个linger结构来设置相应的操作特性:   struct linger {   int l_onoff;   int l_linger;   };   为了允许SO_LINGER,应用程序应将l_onoff设为非零,将l_linger设为零或需要的超时值(以秒为单位),然后调用setsockopt()。为了允许SO_DONTLINGER(亦即禁止SO_LINGER),l_onoff应设为零,然后调用setsockopt()。   缺省条件下,一个套接口不能与一个已在使用中的本地地址捆绑(参见bind())。但有时会需要“重用”地址。因为每一个连接都由本地地址和远端地址的组合唯一确定,所以只要远端地址不同,两个套接口与一个地址捆绑并无大碍。为了通知WINDOWS套接口实现不要因为一个地址已被一个套接口使用就不让它与另一个套接口捆绑,应用程序可在bind()调用前先设置SO_REUSEADDR选项。请注意仅在bind()调用时该选项才被解释;故此无需(但也无害)将一个不会共用地址的套接口设置该选项,或者在bind()对这个或其他套接口无影响情况下设置或清除这一选项。   一个应用程序可以通过打开SO_KEEPALIVE选项,使得WINDOWS套接口实现在TCP连接情况下允许使用“保持活动”包。一个WINDOWS套接口实现并不是必需支持“保持活动”,但是如果支持的话,具体的语义将与实现有关,应遵守RFC1122“Internet主机要求-通讯层”中第4.2.3.6节的规范。如果有关连接由于“保持活动”而失效,则进行中的任何对该套接口的调用都将以WSAENETRESET错误返回,后续的任何调用将以WSAENOTCONN错误返回。   TCP_NODELAY选项禁止Nagle算法。Nagle算法通过将未确认的数据存入缓冲区直到蓄足一个包一起发送的方法,来减少主机发送的零碎小数据包的数目。但对于某些应用来说,这种算法将降低系统性能。所以TCP_NODELAY可用来将此算法关闭。应用程序编写者只有在确切了解它的效果并确实需要的情况下,才设置TCP_NODELAY选项,因为设置后对网络性能有明显的负面影响。TCP_NODELAY是唯一使用IPPROTO_TCP层的选项,其他所有选项都使用SOL_SOCKET层。   如果设置了SO_DEBUG选项,WINDOWS套接口供应商被鼓励(但不是必需)提供输出相应的调试信息。但产生调试信息的机制以及调试信息的形式已超出本规范的讨论范围。   setsockopt()支持下列选项。其中“类型”表明optval所指数据的类型。   选项 类型 意义   SO_BROADCAST BOOL 允许套接口传送广播信息。   SO_DEBUG BOOL 记录调试信息。   SO_DONTLINER BOOL 不要因为数据未发送就阻塞关闭操作。设置本选项相当于将SO_LINGER的l_onoff元素置为零。   SO_DONTROUTE BOOL 禁止选径;直接传送。   SO_KEEPALIVE BOOL 发送“保持活动”包。   SO_LINGER struct linger FAR* 如关闭时有未发送数据,则逗留。   SO_OOBINLINE BOOL 在常规数据流中接收带外数据。   SO_RCVBUF int 为接收确定缓冲区大小。   SO_REUSEADDR BOOL 允许套接口和一个已在使用中的地址捆绑(参见bind())。   SO_SNDBUF int 指定发送缓冲区大小。   TCP_NODELAY BOOL 禁止发送合并的Nagle算法。   setsockopt()不支持的BSD选项有:   选项名 类型 意义   SO_ACCEPTCONN BOOL 套接口在监听。   SO_ERROR int 获取错误状态并清除。   SO_RCVLOWAT int 接收低级水印。   SO_RCVTIMEO int 接收超时。   SO_SNDLOWAT int 发送低级水印。   SO_SNDTIMEO int 发送超时。   SO_TYPE int 套接口类型。   IP_OPTIONS 在IP头中设置选项。

返回值:

  若无错误发生,setsockopt()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。   错误代码:   WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。   WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。   WSAEFAULT:optval不是进程地址空间中的一个有效部分。   WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。   WSAEINVAL:level值非法,或optval中的信息非法。   WSAENETRESET:当SO_KEEPALIVE设置后连接超时。   WSAENOPROTOOPT:未知或不支持选项。其中,SOCK_STREAM类型的套接口不支持SO_BROADCAST选项,SOCK_DGRAM类型的套接口不支持SO_DONTLINGER 、SO_KEEPALIVE、SO_LINGER和SO_OOBINLINE选项。   WSAENOTCONN:当设置SO_KEEPALIVE后连接被复位。   WSAENOTSOCK:描述字不是一个套接口。

用法

  1.设置调用closesocket()后,仍可继续重用该socket。调用closesocket()一般不会立即关闭socket,而经历TIME_WAIT的过程。   BOOL bReuseaddr = TRUE;   setsockopt( s, SOL_SOCKET, SO_REUSEADDR, ( const char* )&bReuseaddr, sizeof( BOOL ) );   2. 如果要已经处于连接状态的soket在调用closesocket()后强制关闭,不经历TIME_WAIT的过程:   BOOL bDontLinger = FALSE;   setsockopt( s, SOL_SOCKET, SO_DONTLINGER, ( const char* )&bDontLinger, sizeof( BOOL ) );   3.在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,可以设置收发时限:   int nNetTimeout = 1000; //1秒   //发送时限   setsockopt( socket, SOL_SOCKET, SO_SNDTIMEO, ( char * )&nNetTimeout, sizeof( int ) );   //接收时限   setsockopt( socket,SOL_SOCKET, SO_RCVTIMEO, ( char * )&nNetTimeout, sizeof( int ) );   4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节(约   为8.5K);在实际的过程中如果发送或是接收的数据量比较大,可以设置socket缓冲区,避免send(),recv()不断的循环收发:   // 接收缓冲区   int nRecvBuf = 32 * 1024; //设置为32K   setsockopt( s, SOL_SOCKET, SO_RCVBUF, ( const char* )&nRecvBuf, sizeof( int ) );   //发送缓冲区   int nSendBuf = 32*1024; //设置为32K   setsockopt( s, SOL_SOCKET, SO_SNDBUF, ( const char* )&nSendBuf, sizeof( int ) );   5.在发送数据的时,不执行由系统缓冲区到socket缓冲区的拷贝,以提高程序的性能:   int nZero = 0;   setsockopt( socket, SOL_SOCKET, SO_SNDBUF, ( char * )&nZero, sizeof( nZero ) );   6.在接收数据时,不执行将socket缓冲区的内容拷贝到系统缓冲区:   int nZero = 0;   setsockopt( s, SOL_SOCKET, SO_RCVBUF, ( char * )&nZero, sizeof( int ) );   7.一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:   BOOL bBroadcast = TRUE;   setsockopt( s, SOL_SOCKET, SO_BROADCAST, ( const char* )&bBroadcast, sizeof( BOOL ) );   8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时,直到accpet()被调用(此设置只   有在非阻塞的过程中有显著的作用,在阻塞的函数调用中作用不大)   BOOL bConditionalAccept = TRUE;   setsockopt( s, SOL_SOCKET, SO_CONDITIONAL_ACCEPT, ( const char* )&bConditionalAccept, sizeof( BOOL ) );   9.如果在发送数据的过程中send()没有完成,还有数据没发送,而调用了closesocket(),以前一般采取的措施是shutdown(s,SD_BOTH),但是数   据将会丢失。   某些具体程序要求待未发送完的数据发送出去后再关闭socket,可通过设置让程序满足要求:   struct linger {   u_short l_onoff;   u_short l_linger;   };   linger m_sLinger;   m_sLinger.l_onoff = 1; //在调用closesocket()时还有数据未发送完,允许等待   // 若m_sLinger.l_onoff=0;则调用closesocket()后强制关闭   m_sLinger.l_linger = 5; //设置等待时间为5秒   setsockopt( s, SOL_SOCKET, SO_LINGER, ( const char* )&m_sLinger, sizeof( linger ) );

winsock setsockopt 详解相关推荐

  1. linux setsockopt详解

    1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsockopt(s,SOL_SOCKET , ...

  2. setsockopt详解

    最近写一个检测平台的客户端,但是遇到自动断线问题,得知setsockopt()函数的作用,觉得这篇挺好,就借用过来,方便以后阅读. 在TCP连接中,recv等函数默认为阻塞模式(block),即直到有 ...

  3. MFC下CSocket编程详解

    MFC下CSocket编程详解:  1. 常用的函数和注意事项(详细的函数接口说明请查看MSDN): CSocket::Create 初始化(一般写服务器程序都不要用为好,用下面的 CSocket:: ...

  4. 详解SYN Flood攻击原理与防范

    详解SYN Flood攻击原理与防范 SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,它是利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被 ...

  5. Socket详解——全面明了

    "一切皆Socket!"原文链接 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间 ...

  6. 详解ISA2006三种客户端

    详 解ISA2006三种客户端<?XML:NAMESPACE PREFIX = O /> 上一篇我们介绍了如何部署ISA2006,本文我们要让部署好的ISA来干活了.ISA能干什么活?从字 ...

  7. Python中的select、epoll详解

    Python中的select.epoll详解 文章目录 Python中的select.epoll详解 一.select 1.相关概念 2.select的特性 1.那么单进程是如何实现多并发的呢??? ...

  8. Socket模型详解

    Socket模型详解 两种I/O模式 一.选择模型 二.异步选择 三.事件选择 四.重叠I/O模型 五.完成端口模型 五种I/O模型的比较 两种I/O模式 1. 两种I/O模式 阻塞模式:执行I/O操 ...

  9. Python常见面试题:TCP 协议中的三次握手与四次挥手相关概念详解

    今天来聊聊Python常见面试题中面试频率特别高的一个题目:TCP 协议中的三次握手与四次挥手. 涉及到的知识点有: 1.TCP.UDP 协议的区别 2.TCP 头部结构 3.三次握手与四次挥手过程详 ...

最新文章

  1. UITabBarController 的配置
  2. 附加数据库时出错。有关详细信息,请单击“消息”列中的超链接。
  3. php字符串学习笔记
  4. 正则表达式的固化分组
  5. python类之高级应用
  6. 网件rax40可以刷梅林_抢先一步体验WIFI6—网件RAX40 WIFI6路由器体验记
  7. matlab方阵对角线清零
  8. Node JS和MongoDB的集成简单示例
  9. 为什么新装的mysql5.7服务无法启动_mysql 5.7安装 MySQL 服务无法启动但是服务没有报告任何错误...
  10. 【九度OJ1348】|【剑指offer36】数组中的逆序对
  11. 怎么更改网络选项为家庭计算机,我的现在是公用网络我想更改为家庭网络应该如何更改...
  12. user-modify
  13. 【每日一P】简单实用的调色原理
  14. 内外墙乳胶漆颜色怎么搭配,内外墙品牌涂料如何选购?
  15. 苹果公司CEO:混蛋乔布斯
  16. 【论文学习】Towards Accurate Oriented Object Detection in Aerial Images with Adaptive Multi-level Feature
  17. Gson解析json字符串,并封装成ListT
  18. 射频功率计介绍——一款超紧凑的多功能射频仪器
  19. 服务器知识:关于阿里云服务器域名备案内容
  20. PT生存法则(不断补充中)

热门文章

  1. PHPExcel 去掉错误提示 保护表格
  2. 京东架构师解析URL监控
  3. WIFI 基本理论-2017
  4. zabbix 自定义 key (转)
  5. 颈椎病2句话就能治疗好,你也试试看,一学就会!
  6. Uva 11396 爪分解
  7. shell-单引号 ,双引号,反引号,括号详解
  8. 浅谈Android引用计数(2)
  9. Windows下Eclipse和PyDev搭建完美Python开发环境
  10. 打印出所有的 info.plist 中的 keys、values