套接字选项和I/O控制命令

套接字一旦建立,通过套接字选项和I/O控制命令对各种属性进行操作,便可对套接字的行为产生影响。有的选项只用于信息的返回,而有的选项则可在应用程序中影响套接字的行为。I / O控制命令肯定会对套接字的行为产生影响。

下面着重讨论四个Winsock函数:getsockopt、setsocketopt、ioctlsocket和WSAIoctl 。每个函数都有大量命令。这些I/O控制命令和选项大多定义在Winsock.h或Winsock2.h内,具体取决于它们到底从属于Winsock 1,还是从属于Winsock 2。但是,也有少数几个选项是Microsoft提供者或某种传输协议所特有的。微软特有的一些扩展定义在Winsock.h和Mswsock.h 这两个头文件内。而传输提供者扩展定义在与其协议对应的头文件内。针对那些传输特有选项,我们将随选项一道,指明正确的头文件是什么。要注意的是,若应用程序使用了微软特有的扩展,那么必须同Mswock.lib建立链接。

套接字选项

对getsocketopt(获得套接字选项)函数来说,它的常见用法是获得与指定套接字相关的信息。

其原型如下:

int getsocketopt(SOCKKET s,int level,int optname,char FAR* optval,int optlen)

s 指定的是一个套接字,我们打算在这个套接字上执行指定的选项。对你打算使用的具体协议来说,这个套接必须是有效的。大多数选项都是一种特定的协议和套接字类型专有的,而其他选项适用于所有类型的套接字(特别是第二个参数level)。

optname参数是我们在此真正感兴趣的选项。 这些选项名均在 Winsock头文件内定义的常数值。最常见的与协议无关选项(比如和SOL_SOCKET级别关联在一起的选项)是在Winsock.h和 Winsock2.h这两个头文件中定义的。对于每种特定的协议来说,它们都有自己的头文件,定义了与之对应的特定选项。

最后,optval和 optlen参数是两个变量,用于返回目标选项的值 。大多数情况下,选项值都是一个整数(但也不是绝对的)

.

setsocketopt函数用于在一个套接字级别或由协议决定的级别上设置套接字选项。它的定义如下:

int setsocketopt(SOCKKET s,int level,int optname,const char FAR* optval,int optlen)

它的参数和getsocketopt函数的参数相同,例外的是我们以optval和optlen参数的形式,将值传递进去。这些值是为指定的选项设定的。和 getsocketopt函数一样,optval大多数时候都是一个整数,但也并非总是如此。正式编程的时候,应查询对每个选项的说明,了解到底该将什么作为选值传递进去。调用getsocketopt或setsocketopt时,最常见的错误是试图获得一个套接字的信息,但那个套接字的基层协议却不具备某种指定的特征(或选项)。例如,类型为SOCK_STREAM的一个套接字本身是不能对数据进行广播操作的;因此,若试图设置或获取 SO_BROADCAST选项,便会造成WSAENOPRORTOOPT错误。

SOL_SOCKET选项级别

介绍可根据套接字本身的特征,返回信息的一些套接字选项,但这些信息并非那个

套接字的基层协议所特有的(与它无关).

选项级别值 
选项值 
类型获取 / 设置 
Winsock 版本 
说明 
SO_ACCEPTCONN 
布尔值 
只能获取 
1 + 
如为TRUE(真),表明套接字处于监听模式 
SO_BROADCAST 
布尔值 
两种均可 
1 + 
如为TRUE,表明套接字已配置成对广播消息进行发送 
SO_CONNECT_TIME 
整数 
只能获取 
1 + 
返回套接字建立连接的时间,以秒为单位 
SO_DEBUG 
布尔值 
两种均可 
1 + 
如果是TRUE,就允许调试输出 
SO_DONTLINGER 
布尔值 
两种均可 
1 + 
如果是T R U E,则禁用SO_LINGER 
SO_DONTROUTE 
布尔值 
两种均可 
1 + 
如果是T R U E,便直接向网络接口发送消息,毋需查询路由表 
SO_ERROR 
布尔值 
只能获得 
1 + 
返回错误状态 
SO_EXCLUSIVEADDRUSE 
布尔值 
两种均可 
2 + 
如果是TRUE,套接字绑定的那个本地端口就不能重新被另一个进程使用 
SO_KEEPALIVE 
布尔值 
两种均可 
1 + 
如果是T R U E,套接字就会进行配置,在会话过程中发送“保持活动”消息 
SO_LINGER 
st ruct linger 
两种均可 
1 + 
设置或获取当前的拖延 
SO_MAX_MSG_SIZE 
无符号整数 
只能获得 
2 + 
对一个面向消息的套接字来说,一条消息的最大长度 
SO_OOBINLINE 
布尔值 
两种均可 
1 + 
如果是T R U E,带外数据就会在普通数据流中返回 
SO_PROTOCOL_INF O 
WSAPROTOCOL_INFO 
只能获得 
2 + 
套接字绑定的那种协议的特征 
SO_RCVBUF 
整数 
两种均可 
1 + 
面向接收操作,为每个套接字分别获取或设置缓冲区长度 
SO_REUSEADDR 
布尔值 
两种均可 
1 + 
如果是TRUE,套接字就可与一个正由其他套接字使用的地址绑定到一起,或与处在TIME_WAIT状态的地址绑定到一起 
SO_SNDBUF 
布尔值 
两种均可 
1 + 
如果是TRUE(非零值),意味着套接字被配置成可进行广播消息的发送 
SO_TYPE 
整数 
只能获得 
1 + 
返回指定套接字的类型(如SOCK_DGRAM和SOCK_STREAM等) 
SO_SNDTIMEO 
整数 
两种均可 
1 + 
获取或设置套接字上的数据发送超时时间(以毫秒为单位) 
SO_RCVTIMEO 
整数 
两种均可 
1 + 
获取或设置与套接字上数据接收对应的超时时间值(以毫

秒为单位) 
SO_UPDATE_ACCEPT_CONTEXT 
S O C K E T 
两种均可 
1 + 
获取或设置与套接字上的数据接收对应的超时值(以毫秒计)

SOL_APPLETALK选项级别

下述选项均为AppleTalk协议之专用套接字选项,只能用于通过socket或WSASocket函数

创建的套接字(同时设置AF_APPLETALK标志)。这里列出的大多数选项都与A ppleTalk名字

的设置或获取有关。

选项级别值 
选项值 
类型获取 / 设置 
Winsock 版本 
说明 
SO_CONFIRM_NAM 
WSH_NBP_TUPLE 
只能获得 

确定指定的AppleTalk名字和指定地址绑定在一起 
SO_DEREGISTER_NAME , SO_REMOVE_NAME 
WSH_REGISTER_NAME 
只能设置 

从网络中撤消对指定名字的注册 
SO_LOOKUP_MYZONE ,

SO_GETMYZONE 
字符 
只能获取 

返回网络上的默认网区 
SO_LOOKUP_NAME 
W SH_LOOKUP_NAME 
只能获取 

查找指定的NBP名字,并返回相符的名字及N B P信息字元组 
SO_LOOKUP_ZONES ,

SO_GETZONELIST 
WSH_LOOKUP_ZONES 
只能获取 

返回来自Internet网区列表的区名 
SO_LOOKUP_ZONES_ON_ADAPTER , SO_GETLOCALZONES 
WSH_LOOKUP_ZONES 
只能获取 

为指定的适配器名返回一个区名列表 
SO_LOOKUP_NETDEF_ON_ADAPTER , SO_GETNETINFO 
WSH_LOOKUP_NETDEF_ON_ADAPTE 
只能设置 

为指定网络返回种子值,以及默

认网区

SO_PAP_GET_SERVER_STATUS 
WSH_PAP_GET_SERVER_STATUS 
只能获取 

自指定服务器返回PA P状态

SO_PAP_PR IME_READ 
char [] 
只能设置 

这个调用会在一个PA P连接上填充一次读取操作,以便发送者能实际地发出数据 
SO_PAP_S ET_SERV ER_STTUS 
char [] 
只能设置 

假如另一个客户机请求状态,则设置要发送出去的状态

SO_REGISTER_NAME 
char [] 
只能设置 

在AppleTalk网络上注册指定的名字

SOL_IRLMP选项级别

SOL_IRLMP 级别与IrDA(Infrared Data Association,红外线数据联盟)协议有着密切的联系,其地址家族为AF_IRDA。使用IrDA套接字选项时,要记住的一个要点在于,在不同平台上,红外线套接字的具体实施方式是有所区别的。由于Windows CE是最早支持红外线通信的一个平台,所以没有包括后来在Windows 98和Windows 2000中引入的一些新选项。

选项级别值 
选项值 
类型获取 / 设置 
Winsock 版本 
说明 
IRLMP_9WIRE_MODE 
布尔值 
两种均可 
1 + 
获取或设置IP头内的IP选项 
IRLMP_ENUMDEVICES 
DEVICELIST 
只能获取 
1 + 
针对范围内具有红外线通信能力的设备,返回一个IrDA设备ID列表 
IRLMP_EXECLUSIVE_MODE 
布尔值 
两种均可 
1 + 
如果是TRUE,表明套接字连接处于“独占”模式 
IRLMP_IAS_QUERY 
IAS-QUERY 
只能获取 
1 + 
在指定服务上查询IAS,并查询与其属性对应的类名 
IRLMP_IAS_SET 
IAS-QUERY 
只能获取 
1 + 
为指定的类名和属性设置一个属性值 
IRLMP_IRLPT_MODE 
布尔值 
两种均可 
1 + 
若为T R U E,套接字就会配置成与具有I R能力的打印机通信 
IRLMP_SEND_PDU_LEN 
整数 
只能获得 
1 + 
取得最大的PDU长度

IPPROTO_IP选项级

IPPROTO_IP这一级的套接字选项与I P协议存在密切联系,比如可用它们IP头内的特定字

段,以及向IP多播组增添一个套接字等等。许多这样的选项都声明于Winsock.h和Winsock2.h

这两个头文件内,而且采用了不同的值。要注意的是,假如装载的是Winsock1,那么必须包

括正确的头文件,同时建立与Wsock32.lib 函数库的链接关系。若装载的是Winsock 2,那么情况也是类似的,除了将Winsock 2的头文件包括进来外,还要建立与Ws2_32.lib的链接关系。在多播通信环境中,这一点尤其重要,因为两个版本的Wi n s o c k均支持多播通信。除WindowsCE的早期版本之外,其他所有Win32平台都提供了对多播通信的支持。而Windows CE自2.1版之后,也开始提供了这方面的支持。

选项级别值 
选项值 
类型获取 / 设置 
Winsock 版本 
说明 
IP_OPTIONS 
char [] 
两者均可 
1 + 
设置或获取IP头内的IP选项 
IP_HDRINCL 
布尔值 
两种均可 
2 + 
如果是TRUE,IP头就会随即将发送的数据一起提交,并从 读取的数据中返回 
IP_TOS 
整数 
两种均可 
1 + 
IP服务类型 
IP_TTL 
整数 
两种均可 
1 + 
IP协议的“存在时间”(TTL)参数

IP_MULTICAST_IF 
无符号长整型 
两种均可 
1 + 
获取或设置打算从它上面发出多播数据的本地接口 
IP_MULTICAST_TTL 
整数 
两种均可 
1 + 
为套接字获取或设置多播数据包的存在时间 
IP_MULTICAST_LOOP 
布尔值 
两种均可 
1 + 
如果是TRUE,发至多播地址的数据将原封不动地“反射”

或“反弹”回套接字的进入缓冲区 
IP_ADD_MEMBERSHIP 
struc ip_mreq 
只能设置 
1 + 
在指定的IP组内为套接字赋予成员资格 
IP_DROP_MEMBERSHIP 
struc ip_mreq 
只能设置 
1 + 
将套接字从指定的IP组内删去(撤消成员资格) 
IP_DONTFRAGMENT 
布尔值 
两种均可 
1 + 
如果是T R U E,就不对I P数据报进行分段

IPPROTO_TCP选项级别

仅有一个选项从属于IPPROTO_TCP级别。该选项只适用于流式套接字(SOCK_STREAM),其地址家族为AF_INET。这个选项可用在所有Winsock版本上,并得到了所有Win32平台的支持,包括Windows CE。

TCP_NODELAY 布尔值    两者均可     1 +   若为TRUE,就会在套接字上禁用Nagle算法

NSPROTO_IPX选项级别

选项级别值 
选项值 
类型获取 / 设置 
Winsock 版本 
说明 
IPX_PTYPE 
整数 
两种均可 
1 + 
获取或设置IPX包的类型 
IPX_FILTERPTYPE 
整数 
两种均可 
1 + 
获取或设置准备过滤的I P X包之类型 
IPX_STOPFILTERPTYPE 
整数 
只能设置 
1 + 
删除为指定IPX包设置的过滤器 
IPX_DSTYPE 
整数 
两种均可 
1 + 
获取或设置SPX头中的数据流字段值 
IPX_EXTENDED_ADDRESS 
布尔值 
两种均可 
1 + 
如果是TRUE,便允许对IPX包进行扩展定址 
IPX_RECVHDR 
布尔值 
两种均可 
1 + 
如果是TRUE,就随接收调用一起,返回IPX头 
IPX_MAXSIZE 
整数 
只能获取 
1 + 
返回IPX数据报的最大长度 
IPX_ADDRESS 
IPX_ADDRESS_D ATA 
只能获取 
1 + 
返回具备IPX能力之适配器的有关信息 
IPX_GETNE TINFO 
IPX_NETNUM_D ATA 
只能获取 
1 + 
返回与一个指定IPX网络编号有关的信息 
IPX_GETNETINFO_NORIP 
IPX_ADDRESS_DATA 
两种均可 
1 + 
如果是TRUE,就不会对IP数据报进行分段 
IPX_SPXGETCONNECTIONSTAT U S 
IPX_SPXCONNSTATUS_DATA 
只能获取 
1 + 
返回与一个已建立连接的SPX套接字有关的信息 
IPX_ADDRESS_NOTIFY 
I PX_ADDRESS_DATA 
只能获取 
1 + 
若IPX适配器的状态发生改变,则发出异步通知 
IPX_MAX_ADAPTER_NUM 
整数 
只能获取 
1 + 
返回存在的IPX适配器个数 
IPX_RERIPNETNUMBER 
IPX_NETNUM_DATA 
只能获取 
1 + 
返回一个网络编号的相关信息 
IPX_RECEIVE_BROADCAST 
布尔值 
只能设置 
1 + 
如果是TRUE,就不接收IPX广播包 
IPX_IMMEDITESPXZCK 
布尔值 
两种均可 
1 + 
如果是TRUE,就不在SPX连接上延迟发送ACK

I OCTLSOCKET和WSAIOCTL

一系列套接字 I/O 控制函数用于在套接字之上,控制 I/O 的行为,同时获取与那个套接字上

进行的 I/O 操作有关的信息。

其中,第一个函数是 ioctlsocket ,起源于 Winsock 1 规范,声明如下:

int olctlsocket(SOCKET s,long cmd,u_long FAR* argp)

其中,参数 s 指定的是要在上面采取 I/O 操作的套接字描述符,而 cmd 是一个预定义的标志,

用于打算执行的 I/O 控制命令。最后一个参数 argp 对应的是一个指针,指向与命令密切相关的一个变量。描述好每个命令之后,再给出要求变量的类型。

Winsock 2 引入了一个新的 ioctl 函数,增添了数量多得多的新选项。首先,它将单个 argp 参数分解成了一系列输入参数,用于容纳传递到函数内部的值;同时提供一系列输出参数,用于容纳自调用返回的数据。此外,

函数调用可使用重叠 I/O 。这个新函数便是 WSAIoctl ,它的定义如下:

int WSAIoctl(SOCKET s,DWORD dwIoControlCode,LPVOID lpvInBuffer,DWORD cbInBuffer,

LPVOID lpvOutBuffer,DWORD cbOutBuffer,LPDWORD lpcbBytesReturned,

LPWSAOVERLAPPED lpOverlapped,

LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)

头两个参数与 ioctlsocket 的相同。另两个参数( lpvInBuffer 和 cbInBuffer )则对输入参数

进行了描述。其中, lpvInBuffer 参数是一个指针,指向传递进入的值,而 cbInBufer 指定的是数据的多少,以字节为单位。类似地, lpvOutBuffer 和 cbOutBuffer 用于自调用返回的任何数据。 l pvOutBuffer 参数指向的是一个数据缓冲区,其中放置了返回的所有信息。而 cbOutBuffer 参数对应的是在 lpvOutBuffer 中传递进来的缓冲区的字节长度。要注意的是,某些调用可能只使用了输入或输出参数,而另一些调用两类参数都会用到。第七个参数是 lpcbBytesReturned ,对应于实际返回的字节数。最后两个参数是 lpOverlapped 和 lpCompletionRoutine ,在随重叠 I/O 调用这个函数时使用。

WSAIoctl 函数详解相关推荐

  1. C语言网络编程:accept函数详解

    文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...

  2. 【FFmpeg】函数详解(三)

    FFmpeg函数详解 14.av_write_frame 15.av_interleaved_write_frame 16.av_write_trailer 17.avio_close 18.av_i ...

  3. 【FFmpeg】函数详解(二)

    FFmpeg函数详解 9.av_dump_format 10.avio_open 11.avformat_write_header 12.avcodec_send_frame 13.avcodec_r ...

  4. 【FFmpeg】函数详解(一)

    FFmpeg函数详解 一.错误码相关 1.AVERROR 2.av_strerror 3.其他错误码解释 二.编解码 1.获取编解码器 2.申请.释放上下文环境 3.打开编码器avcodec_open ...

  5. 【ES6】Generator函数详解

    [ES6]Generator函数详解 一.Generator函数简介 基本概念 函数写法 yield关键字介绍 二.next方法的参数 三.for...of循环 四.关于普通throw()与Gener ...

  6. mysql的聚合函数综合案例_MySQL常用聚合函数详解

    一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回 ...

  7. python平方数迭代器_对python中的高效迭代器函数详解

    python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...

  8. python基础知识~ 函数详解2

    python~函数详解2  1 生成器函数    定义 如果函数有yield这个关键字,就是生成器函数.生成器函数() 获取的是生成器,不执行函数   须知 yield和return一样,都可以返回数 ...

  9. scanf函数详解与缓冲区

    1.基本信息 函数原型: int scanf( char *format, args, ...); 函数返回值: 读入并赋给args的数据个数,遇到文件结束返回EOF,出错返回0. 函数功能: sca ...

最新文章

  1. Meteor:网络应用开发的瑞士军刀
  2. 如何用 Markdown 来画图?
  3. php帝国程序跨表调用数组,帝国CMS 跨表调用相关信息标签
  4. SpringBoot笔记:SpringBoot2.3读取应用配置参数的几种方式
  5. s5pv210 音频播放问题 MPlayer移植
  6. 六本JAVA架构书,构建科学得架构知识体系
  7. 区块链比特币开源_开源资金:比特币,区块链和免费软件
  8. java对象克隆的例子_Java对象克隆
  9. 整数运算、浮点运算与溢出
  10. win10开启多用户同时远程登录-很详细
  11. python中sys.argv[]的使用
  12. Android--应用开发1(应用程序框架)
  13. 时空幻境-patch
  14. win10系统 安装modelsim64位的无法生成license文件的解决办法
  15. 7种不同的数据标准化(归一化)方法总结
  16. 用Verilog HDL实现一位二进制全减器
  17. struts中的javascript - seinbar的专栏
  18. 高铁、地铁这些轨道列车的动力来源是什么?
  19. ios微信双开,iOS微信分身免越狱方法来了!
  20. 华为交换机网页配置vlan

热门文章

  1. SpringBoot核心注解介绍
  2. 【AI芯片格局最全分析】国内AI芯片百家争鸣,何以抗衡全球技术寡头
  3. 全备份失败后,如何手工清除exchange日志文件,附微软KB
  4. VS2010 关于.wav音频文件播放
  5. 光伏发电对系统冲击大 “十三五”电力规划重点增强调峰能力
  6. 阿里云容器服务与ASP.NET Core部署:用 docker secrets 保存 appsettings.Production.json
  7. JadePool应用范例:创建China软件项目
  8. DataSet的数据并发异常处理
  9. VBS的疑惑,它们不考虑效率吗?
  10. 牛客 - 减成一(差分数组)