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 |
说明 |