Windows的网络编程-之五-套接字选项和I/O控制

本文详细介绍了Windows环境下网络编程中的套接字选项和I/O控制,包括SOL_SOCKET和IPPROTO_IP选项级别,如SO_ACCEPTCONN、SO_BROADCAST、IP_TOS等,以及标准I/O控制命令如FIONBIO和FIONREAD。内容涵盖套接字的创建、设置、获取选项和控制命令的使用,帮助开发者深入理解Windows网络编程的细节。
摘要由CSDN通过智能技术生成

1      套接字选项和I/O控制

1.1     套接字选项

intgetsockopt(  SOCKET s,  int level, int optname,  char* optval,  int* optlen );

intsetsockopt(  SOCKET s,  int level, int optname,  const char* optval,  int optlen );

1.1.1   SOL_SOCKET选项级别

1.1.1.1      SO_ACCEPTCONN

选项值类型

get/set

Winsock

说明

bool

get

1+

如果已通过listen( )将套接字置入监听模式,

这个选项就会返回TRUE。

SOCK_DGRAM类型的套接字不支持这一选项。

1.1.1.2      SO_BROADCAST

选项值类型

get/set

Winsock

说明

bool

get/set

1+

TRUE,套接字可以收发广播数据

SOCK_STREAM类型的套接字不支持这一选项。

要想接收一条广播消息,首先必须启用广播选项,然后使用某个数据报接收函数recvfrom( )或WSARecvfrom()。另外一种方法是把套接字通过调用connect( )或WSAConnect()与广播地址连接起来,再调用recv( )或WSARecv( )来实现的。对UDP广播来说,必须指定一个端口号,以便向它发送数据报;接收端也必须请求在这个端口上接收广播数据。对UDP来说,存在着一个特殊的广播地址,所有广播数据均应发至该地址。这个地址便是255.255.255.255。

通常,只有在发送广播数据报时,才需要设置SO_BROADCAST选项。要想接收一个广播数据报,只需在指定的端口上,对进入的数据报进行监听即可。

1.1.1.3      SO_CONNECT_TIME

选项值类型

get/set

Winsock

说明

int

get

1+

返回套接字建立连接的时间,以秒为单位

该选项最常见的用法是和AcceptEx( )一道使用。AcceptEx()要求为进入的客户机连接请求提供一个有效的套接字。该选项可在该套接字上调用,以判断连接是否已经建立,以及建立了多久的时间。若套接字当前尚未连接,返回值便是0xFFFFFFFF。

1.1.1.4      SO_DONTROUTE

选项值类型

get/set

Winsock

说明

bool

get/set

1+

如果是TRUE,忽略路由表的存在,

通过套接字绑定的那个接口直接将数据传送出去。

如果是TRUE,等同于将参数flag设置为MSG_DONTROUTE,然后调用send( )。

1.1.1.5      SO_EXCLUSIVEADDRUSE

选项值类型

get/set

Winsock

说明

bool

get/set

2+

如果是TRUE,套接字绑定的那个本地端口

就不能重新被另一个进程使用

1.1.1.6      SO_KEEPALIVE

选项值类型

get/set

Winsock

说明

bool

get/set

1+

如果是TRUE,套接字就会在会话过程中发送keepalive消息

SOCK_DGRAM类型的套接字不支持这一选项。

1.1.1.7      SO_LINGER

选项值类型

get/set

Winsock

说明

struct linger

get/set

1+

设置或获取当前的拖延时间

SOCK_DGRAM类型的套接字不支持这一选项。

SO_LINGER用于控制在执行closesocket()后,套接字上正在排队的数据如何处理。

typedefstruct linger

{

u_short l_onoff;        // 是否linger

u_short l_linger;       // 单位是秒

}linger;

若l_onoff是一个非零值,l_linger指定一段拖延时间,此时的关闭方式称为从容关闭,closesocket( )会在一个阻塞套接字上进入阻塞状态,直到剩余的数据全部发出或接收。如果超过规定的时间,所有尚未发送或接收的数据都会丢弃。

如果假如l_onoff是一个非零值,但l_linger为0,此时的关闭方式称为强行关闭,便不用担心closesocket( )会进入阻塞状态,即使队列中的数据尚未发送或者尚未发出收到确认。

1.1.1.8      SO_MAX_MSG_SIZE

选项值类型

get/set

Winsock

说明

unsigned int

get

2+

获取消息的最大长度

只适用于面向消息的套接字类型

1.1.1.9      SO_PROTOCOL_INFO

选项值类型

get/set

Winsock

说明

WSAPROTOCOL_INFO

get

2+

获取套接字协议的特征

1.1.1.10  SO_RCVBUF

选项值类型

get/set

Winsock

说明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值