SOCKET相关API说明

ioctlsocket()

  简述:

  控制套接口的模式。

  #include <winsock.h>

  int PASCAL FAR ioctlsocket( SOCKET s, long cmd, u_long FAR* argp);

  s:一个标识套接口的描述字。

  cmd:对套接口s的操作命令。

  argp:指向cmd命令所带参数的指针。

  注释:

  本函数可用于任一状态的任一套接口。它用于获取与套接口相关的操作参数,而与具体协议或通讯子系统无关。支持下列命令:

  FIONBIO:允许或禁止套接口s的非阻塞模式。argp指向一个无符号长整型。如允许非阻塞模式则非零,如禁止非阻塞模式则为零。当创建一个套接口时,它就处于阻塞模式(也就是说非阻塞模式被禁止)。这与BSD套接口是一致的。WSAAsynSelect()函数将套接口自动设置为非阻塞模式。如果已对一个套接口进行了WSAAsynSelect() 操作,则任何用ioctlsocket()来把套接口重新设置成阻塞模式的试图将以WSAEINVAL失败。为了把套接口重新设置成阻塞模式,应用程序必须首先用WSAAsynSelect()调用(IEvent参数置为0)来禁至WSAAsynSelect()

  FIONREAD:确定套接口s自动读入的数据量。argp指向一个无符号长整型,其中存有ioctlsocket()的返回值。如果sSOCKET_STREAM类型,则FIONREAD返回在一次recv()中所接收的所有数据量。这通常与套接口中排队的数据总量相同。如果SSOCK_DGRAM 型,则FIONREAD返回套接口上排队的第一个数据报大小。

  SIOCATMARK:确实是否所有的带外数据都已被读入。这个命令仅适用于SOCK_STREAM类型的套接口,且该套接口已被设置为可以在线接收带外数据(SO_OOBINLINE)。如无带外数据等待读入,则该操作返回TRUE真。否则的话返回FALSE假,下一个recv()recvfrom()操作将检索标记前一些或所有数据。应用程序可用SIOCATMARK操作来确定是否有数据剩下。如果在紧急(带外)数据前有常规数据,则按序接收这些数据(请注意,recv()recvfrom()操作不会在一次调用中混淆常规数据与带外数据)。argp指向一个BOOL型数,ioctlsocket()在其中存入返回值。

  兼容性:

  本函数为Berkeley套接口函数ioctl()的一个子集。其中没有与FIOASYNC等价的命令,SIOCATMARK是套接口层次支持的唯一命令。

  返回值:

  成功后,ioctlsocket()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。

  错误代码:

  WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()

  WSAENETDOWNWINDOWS套接口实现检测到网络子系统失效。

  WSAEINVALcmd为非法命令,或者argp所指参数不适用于该cmd命令,或者该命令

  不适用于此种类型的套接口。

  WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。

  WSAENOTSOCK:描述字不是一个套接口。

  参见:

  socket(), setsockopt(), getsockopt(), WSAAsyncSelect().

setsockopt()

  简述:

  设置套接口的选项。

  #include <winsock.h>

  int PASCAL FAR setsockopt( SOCKET s, int level, int optname,

  const char FAR* optval, int optlen);

  s:标识一个套接口的描述字。

  level:选项定义的层次;目前仅支持SOL_SOCKETIPPROTO_TCP层次。

  optname:需设置的选项。

  optval:指针,指向存放选项值的缓冲区。

  optlenoptval缓冲区的长度。

  注释:

  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_LINGERl_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()

  WSAENETDOWNWINDOWS套接口实现检测到网络子系统失效。

  WSAEFAULToptval不是进程地址空间中的一个有效部分。

  WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。

  WSAEINVALlevel值非法,或optval中的信息非法。

  WSAENETRESET:当SO_KEEPALIVE设置后连接超时。

  WSAENOPROTOOPT:未知或不支持选项。其中,SOCK_STREAM类型的套接口不支持SO_BROADCAST选项,SOCK_DGRAM类型的套接口不支持SO_DONTLINGER SO_KEEPALIVESO_LINGERSO_OOBINLINE选项。

  WSAENOTCONN:当设置SO_KEEPALIVE后连接被复位。

  WSAENOTSOCK:描述字不是一个套接口。

  参见:

  bind(), getsockopt(), ioctlsocket(), socket(), WSAAsyncSelect().

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值