套接字选项

来源:互联网 发布:curl算法 编辑:程序博客网 时间:2024/04/30 23:43

getsocketopt
获得与给定套接字相关的相关信息。其定义如下:

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

s:其为一个给定的套接字,这个套接字必须有效

level:为一个选项级。

optname:为我们感兴趣的选项。

optval和optlen:为我们想获取返回的选项值。

setsocketopt

用于设置套接字选项。其定义如下:

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

其参数的意义和getsocketopt相同,但最后需要我们传递进去。
1.SOL_SOCKET选项级别

1)SO_ACCEPTCONN

optval参数:BOOL类型,只能获取;为TRUE,表示套接字处于监听模式。

注意:SOCK_DGRAM类型不支持该选项。

2)SO_BROADCAST

optval参数:BOOL类型,既可以获取也可以设置;为TRUE,表示套接字已配置为发送广播消息。

注意:对除了SOCK_STREAM类型外的所有套接字,这个选项都是有效的。

3)SO_CONDITIONAL_ACCEPT

optval参数:BOOL类型,既可以获取也可以设置;

注意:在默认情况下,这个选项针对TCP是关闭的,既使没有使用Accept、WSAAccept或AcceptEx函数,发送的SYN包都会返回ACK+SYN确认报文。如果打开这个选项,连接不会被确认,除非应用程序调用一个接收函数。这个选项必须在Listen调用之前设置。

4)SO_CONNECT_TIME

optval参数:BOOL类型,只能获取;返回套接字已建立的时间,以毫秒为单位。

注意:微软特有选项。

5)SO_DEBUG

optval参数:BOOL类型,既可以获取也可以设置;如果为TRUE,就可以调试输出。

注意:目前,无任何windows平台支持。

6)SO_DONTLINGER

optval参数:BOOL类型,既可以获取也可以设置;如果是TRUE,则禁用SO_LINGER。

注意:设置为SO_LINGER选项,会有一个等待时间,调用CloseSocket函数,会将等待时间用完或数据发完,就立即关闭套接字。

7)SO_DONTROUTE

optval参数:BOOL类型,既可以获取也可以设置;如果为TRUE,就不经过路由器的路由选择,直接向网络接口发送消息。

注意:默认情况下路由是启用的。在windows平台下调用这个选项总会成功。Microsoft提供程序总是忽这一请求,并总是通过路由表为外出数据确定一个适当的接口。

8)SO_ERROR

optval参数:BOOL类型,只能获取;用于返回错误代码。

注意:错误值不是总能够得到及时更新,因此有时会返回0,要注意。

9)SO_EXCLUSIVEADDRUSE

optval参数:BOOL类型,既可以获取也可以设置;如果为TRUE,套接字绑定的那个本地端口不能被另一个进程重新使用。

注意:这个选项是对SO_REUSEADDR的补充。禁止其他进程在一个地址上使用SO_REUSEADDR。

10)SO_KEEPLIVE

optval参数:BOOL类型,既可以获取也可以设置;如果为TRUE,套接字就会进行配置,并在会话过程中发送“保持活跃”消息。

11)SO_LINGER

optval参数:struct linger类型,既可以获取也可以设置;设置或获取当前的拖延值linger。

注意:SO_LINGER可以设置一个等待时间,在调用closesocket函数时,只有当等待时间用完或数据发完,就立即关闭套接字。其结构体如下:

struct linger{    u_short l_onoff;//为0,表示不允许设置拖延时间;非0值,表示允许设置拖延时间。    u_short l_linger;//以秒为单位的拖延时间。
};
说明:SO_LINGER选项对只对closesocket有效,对shutdown无效。对于closesocket:如果l_onoff为0,那么将是优雅关闭方式,如果缓冲区内有未发送完的数据,要将这些数据发送完后才关闭TCP连接;如果l_onoff为0,且l_linger也为0时,当缓冲区内有未发完的数据时,TCP会发出RST包重置连接,这样数据会丢失,这是强制关闭;如果l_onoff为0,且l_linger不为0时,此时如果缓冲区有未发送完的数据时,如果在时间内,将数据发送完成,那么将关闭TCP连接,如果在时间内为未发送完数据,那么这些数据会被丢弃,TCP会发送RST重置,这是强制关闭过程。
12)SO_MAX_MSG_SIZE

optval参数:unsigned int类型,只能获取;用于设置面向消息的套接字的一条消息的最大长度。

注意:对面向字节流的套接字,该选项没有意义。

13)SO_OOBINLINE

optval参数:BOOL类型,只能获取;如果是TRUE,OOB数据就会在普通数据流中返回。

注意:在调用接收函数时,在默认情况下,OOB数据会值一个单独的调用中返回。若设置了整个选项,OOB数据会出现于从一个接收调用返回的数据流中。在设置了SIOCATMARK前提下,若调用ioctlsocket,变可决定哪个字节时OOB数据。SOCK_DGRAM类型的套接字不支持该选项。

14)SO_OPENTYPE

optval参数:BOOL类型,既可以获取也可以设置;如果设置,随后对socket的调用将返回非重叠句柄。

15)SO_PROTOCOL_INFO

optval参数:BOOL类型,既可以获取也可以设置;返回Winsock套接字协议的条目。

16)SO_RECBUF

optval参数:int 类型,既可以获取也可以设置;面向接收操作,为每个套接字分别获取或设置缓冲区的长度。

17)SO_RECTIMEO

optval参数:int 类型,既可以获取也可以设置;获取或设置于套接字上数据接收对应的超时时间值(以毫秒为单位)。

注意:该选项用于设置或获取接收函数阻塞时间。

18)SO_REUSEADDR

optval参数:BOOL类型,既可以获取也可以设置;如果为TRUE,套接字就可与一个正由另一个套接字使用的地址绑定在一起,或与正处于TIME_OUT状态的地址绑定在一起。

19)SO-SENDBUF

optval参数:int 类型,既可以获取也可以设置;面向发送操作,为每个套接字分别获取或设置缓冲区的长度。

20)SO_SENDTIMEO

optval参数:int 类型,既可以获取也可以设置;获取或设置于套接字上数据发送对应的超时时间值(以毫秒为单位)。

注意:该选项用于设置或获取发送函数阻塞时间。

21)SO_TYPE

optval参数:int 类型,只能获取;返回指定套接字的类型(如SOCK_STREAM或SOCK_DGRAM)。

22)SO_UPDATE_ACCEPT_CONTEXT

optval参数:SOCKET类型,既可以获取也可以设置;用监听套接字的属性来更新客户机套接字上相应的属性。

2.SOL_APPAPPLETALK选项级别

          下面这些均为AppleTalk协议专用套接字选项,有:SO_CONFIRM_NAME、SO_DEREGISTER、SO_REMOVE_NAME、SO_LOOKUP_MYZONE、SO_GETMYZONE、SO_LOOKUP_NAME、SO_LOOKUP_ZONES、SO_GETZONELIST、SO_LOOKUP_ZONES_ON_ADAPTER、SO_GETLOCALZONES、SO_LOOKUP_NETDEF_ON_ADAPTER、SO_GETNETINFO、SO_PAP_GET_SERVER_STATUS、SO_PAP_PRIME_READ、SO_PAP_SET_SERVER_STATUS、SO_REGISTER_NAME、SO_REGISTER_NAME。

3.SOL_IRLMP选项级别

   与IrDA协议密切相关,其选项不再介绍。

4.IPPROTO_IPx选项级别

这个选项级别的套接字选项与IPv4的特有属性密切联系。

1)IP_OPTIONS

optval参数:char[]类型,既可以获取也可以设置;设置或获取IP头内的IP选项。

2)IP_HARINCL

optval参数:BOOL类型,既可以获取也可以设置;如果为TRUE,IP头将随发送数据一起提交到winsock调用。

3)IP_TOS

optval参数:int类型,既可以获取也可以设置;设置和获取IP头中的服务类型。

4)IP_TTL

optval参数:int类型,既可以获取也可以设置;设置或获取IP头中的TTL。

5)IP_MULTICAST_IF

optval参数:unsigned int类型,既可以获取也可以设置;获取或设置用于发出多播数据的本地接口。

注意:该选项用于设置一个本地接口(对应的IP地址),本地计算机以后发出的任何多播数据都由本接口发送出去。该选项只对有多个网络接口才有意义。

6)IP_MULTICAST_TTL

optval参数:int 类型,既可以获取也可以设置;为套接字获取或设置多播数据的TTL。多播默认TTL为1.

7)IP_MULTICAST_LOOP

optval参数:BOOL类型,既可以设置也可以获取;如果为TRUE,发至的多播数据会原封不动的反射回套接字的进入缓冲区。默认会给套接字数据队列中。

8)IP_ADD_MEMBRSHIP

optval参数:struct ip_mreq类型,只能设置;在指定多播组内,为套接字赋予成员资格。

注意:

struct ip_mreq{    struct in_addr imr_multiaddr;//打算加入的那个多播的二进制地址    struct in_addr imr_interface;//加入多播组时的本地地址};

9)IP_DROP_MEMBERSHIP

optval参数:struct ip_mreq类型,只能设置;将指定套接字从多播源中删除。

10)IP_ADD_SOURCE_MEMBERSHIP

optval参数:struct ip_mreq_source类型,只能设置;加入多播组,但仅从给定源接受数据。

注意: 

struct ip_mreq_source{    struct in_addr imr_multiaddr;//打算加入的那个多播的二进制地址   struct in_addr imr_sourceaddr;//可接受源的IP地址。    struct in_addr imr_interface;//加入多播组时的本地地址};

11)IP_DROP_SOURCE_MEMBERSHIP

optval参数:struct ip_mreq_source类型,只能设置;从可接受源列表中删除可接收源

12)IP_BLOCK_SOURCE

optval参数:struct ip_mreq_source类型,只能设置;加入一个多播组,但接受IPv4源外的每个地址的数据。

13)IP_UNBLOCK_SOURECE

optval参数:struct ip_mreq_source类型,既可以获取也可以设置;将给定的IPv4源添加到可接受源列表中。

14)IP_DONTFRAGMENT

optval参数:BOOL类型,既可以获取也可以设置;如果为TRUE,就不对IP数据报分段。

注意:设置了这个选项后,如果IP数据报大于MTU,就会被丢弃,并返回ICMP错误。

15)IP_PKTINFO

optval参数:int类型,只能设置;指明时候冲WSARecvMsg返回数据报信息。

5、IPPROTO_IPV6选项级别

         这个选项级别是属于IPv6的套接字选项。该选项级别的套接字选项有:IPV6_HDRINCL、IPV6_UNICAST_HOPS、IPV6_MULTICAST_IF、IPV6_MULTICAST_HOPS、IPV6_MULTICAST_LOOP、IPV6_ADD_MEMERSHIP、IPV6_JOIN_GROUP、IPV6_DROUP_MEMBERSHIP、IPV6_LEAVE_GROUP、IPV6_PKEINFO。

6、IPPROTO_RM选项级别

     该选项级别用于可靠的多播传输。该选项级别的套接字选项有:RM_RATE_WINDOW_SIZE、RM_SET_MESSAGE_BOUNDARY、RM_FLUSHCACHE、RM_SENDER_WINDOW_ADVANCE_METHOD、RM_SENDER_STATISTICS、RM_LATEJOIN、RM_SET_SEND_IF、RM_ADD_RECEIVE_IF、RM_DEL_RECEIVE_IF、RM_SEND_WINDOW_ADV_RATE、RM_USE_FEC、RM_SET_MCAST_TTL、RM_RECEIVER_STATISTICS。

6、IPPROTO_TCP选项级别

    仅有一个选项是该级别的。该选项值适用于流套接字,其地址族为AF_INET。

1)TCP_NODEAY

optval参数:BOOL类型,既能获取也能设置;若为TRUE,就会在套接字上禁用Nagle算法。

7、NSPROTO_IPX选项级别

    该选项级别是给Microsoft公司对Windows IPX/SPX套接字接口所做的特有扩展。其套接字选项有:IPX_PTYPE、IPX_FILTERPTYPE、IPX_STOPFILETERPTYPE、IPX_DSTYPE、IPX_EXTENED_ADDRESS、IPX_RECVHDR、IPX_MAXSIZE、IPX_ADDRESS、IPX_GETNERINFO、IPX_GETNERINFO_NORIP、IPX_SPXGETCONNECTIONSTATUS、IPX_ADDRESS_NOTIFY、IPX_MAX_ADAPTER_NUM、IPX_RERIPNETNUMBER、IPX_RECEIVE_BROADCAST、IPX_IMMEDIATESPXZCK.

原创粉丝点击