setsockopt函数使用,python socket.setsockopt
简要描述设置套接字的选项。# include Winsock . h int PASCAL FAR setsockopt(SOCKET s,int level,int optname,const char FAR *optval,int opt len);s:标识套接字的描述符。级别:由选项定义的级别;目前只支持SOL_SOCKET和IPPROTO_TCP层。Optname:要设置的选项。Optval:指向存储选项值的缓冲区的指针。Optlen:optval缓冲区长度。注意setsockopt()函数用于设置任何类型和任何状态的windows套接字的选项值。虽然在不同的协议级别上有选项,但是这个函数只定义了最高“windows套接字”级别上的选项。选项影响windows sockets的操作,例如是否在普通数据流中接收紧急数据,是否可以从windows sockets发送广播数据等。windows sockets有两个选项:一个是布尔选项,允许或禁止一个特性;另一个是形状或结构选项。如果允许布尔选项,optval指向一个非零整数;禁止option optval指向等于零的整数。对于布尔型选项,optlen应该等于sizeof(int);对于其他选项,optval指向包含所需选项的整数或结构,而optlen是整数或结构的长度。SO_LINGER选项用于控制在windows套接字上有排队数据要发送并且closesocket()调用已执行时的操作。关于SO_LINGER选项对closesocket()语义的影响,参见close socket()函数。操作应用通过创建逗留结构来设置相应的操作特征:
struct linger { int l _ onoffint l _ linger};要允许SO_LINGER,应用程序应该将l_onoff设置为非零值,将l_linger设置为零或所需的超时值(以秒为单位),然后调用setsockopt()。要允许SO_DONTLINGER(也就是禁止SO_LINGER),应该将l_onoff设置为零,然后调用setsockopt()。默认情况下,windows套接字不能绑定到已经使用的本地地址(请参见bind())。但是有时候你需要“重用”这个地址。因为每个连接都是由本地地址和远程地址的组合唯一确定的,所以只要远程地址不同,两个windows套接字就可以捆绑到一个地址。为了通知windows windows sockets实现不要仅仅因为一个WINDOWS套接字使用了某个地址就将其绑定到另一个WINDOWS套接字,应用程序可以在bind()调用之前设置SO_REUSEADDR选项。请注意,该选项仅在调用bind()时才被解释;因此,为不共享地址的windows套接字设置此选项是不必要的(但也是无害的),如果bind()对该套接字或其他windows套接字没有影响,则设置或清除此选项也是不必要的。应用程序可以打开SO_KEEPALIVE选项,以便WINDOWS windows套接字实现允许在TCP连接的情况下使用“保持活动”包。WINDOWS windows sockets实现不必支持“保持活动”,但如果支持,特定的语义将与实现相关,并且应该遵循RFC 1122“Internet主机要求-通信层”的4.2.3.6部分中的规范。如果连接由于保持活动状态而失败,任何正在进行的对windows套接字的调用都将返回WSAENETRESET错误,任何后续调用都将返回WSAENOTCONN错误。TCP_NODELAY选项禁止Nagle算法。Nagle算法通过将未确认的数据存储在缓冲区中,直到一个数据包足够一起发送,从而减少主机发送的数据包的位数。但是对于某些应用,这种算法会降低系统性能。所以可以用TCP_NODELAY来关闭这个算法。应用程序编写人员只有在确切知道其效果并真正需要时才设置TCP_NODELAY选项,因为它对网络性能有明显的负面影响。TCP_NODELAY是唯一使用IPPROTO_TCP层的选项,其他所有选项都使用SOL_SOCKET层。如果设置了SO_DEBUG选项,则鼓励(但不要求)WINDOWS windows套接字供应商提供相应的调试信息。但是,生成调试信息的机制和调试信息的形式超出了本规范的范围。Setsockopt()支持以下选项。其中“类型”表示optval引用的数据类型。选项意味着SO_BROADCAST BOOL允许windows套接字传输广播信息。SO_DEBUG BOOL记录调试信息。所以_DONTLINER BOOL不要因为数据没有发送就阻塞关闭操作。设置此选项相当于将SO_LINGER的l_onoff元素设置为零。SO_DONTROUTE BOOL禁止路由选择;直接传播。SO _ KEEPALE BOOL发送一个“保活”包。SO_LINGER struct linger FAR*如果关闭时有未发送的数据,停留。SO_OOBINLINE BOOL接收常规数据流中的带外数据。SO_RCVBUF int决定接收的缓冲区大小。SO_REUSEADDR BOOL允许将windows套接字绑定到一个已经在使用的地址(参见bind())。SO_SNDBUF int指定发送缓冲区的大小。TCP_NODELAY BOOL禁止发送合并的Nagle算法。setsockopt()不支持的BSD选项有:选项名称类型表示SO _ accept conn BOOL windows sockets正在侦听。SO_ERROR int获取错误状态并将其清除。So _ rcvlowaint接收低级水印。
SO_RCVTIMEO int接收超时。SO_SNDLOWAT int发低级水印。发送SO_SNDTIMEO int超时。SO_TYPE int windows套接字类型。IP_OPTIONS在IP头中设置选项。如果返回值没有错误,Setsockopt()返回0。否则返回SOCKET_ERROR错误,应用程序可以通过WSAGetLastError()获取相应的错误代码。错误:在使用此API之前,应该成功调用wsanotinialized:wsa startup()。WSAENETDOWN:WINDOWS windows套接字实现检测到网络子系统故障。WSAEFAULT:optval不是进程地址空间的有效部分。WSAEINPROGRESS:被阻止的WINDOWS windows套接字调用正在运行。WSAEInval:级别值非法,或者optval中的信息非法。WSAENETRESET:当SO _ KEEPALE E被设置时,连接超时。WSAENOPROTOOPT:未知或不支持的选项。SOCK_STREAM类型的Windows套接字不支持SO_BROADCAST选项,SOCK_DGRAM类型的windows套接字不支持SO_DONTLINGER、SO _ KEEPALEE、SO_LINGER和SO_OOBINLINE选项。WSAENOTCONN:当SO _ KEEPALE E被设置时,连接被重置。WSAENOTSOCK:描述符不是windows套接字。用法1。调用closesocket()后,仍然可以重用套接字。一般调用closesocket()不会立即关闭套接字,而是经历TIME_WAIT的过程。
BOOL bReuseaddr=TRUEsetsockopt(s,SOL_SOCKET,SO_REUSEADDR,(const char*)bReuseaddr,sizeof(BOOL));如果想在调用close socket()后强制关闭已经连接的socket,不要经历TIME _ WAIT:boolbdondondongler=false的过程;setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)bDontLinger,sizeof(BOOL));3.在SEND () send()、recv()的过程中,有时由于网络条件等原因,发送和接收无法预期。可以设置收发时限:int nNetTimeout=1000//1秒//发送时限setsockopt (socket,sol _ socket,so _ sndtimeo,(char *) nnet timeout,sizeof(int));//接收时限setsockopt (socket,sol _ socket,so _ rcvtimeo,(char *) nnet timeout,sizeof(int));_ _ _发送()时,返回的是实际发出的字节(同步)还是发送到socket buffer的字节(异步);系统默认状态是8688字节(约8.5k)收发一次;在实际过程中,如果发送或接收大量数据,可以设置socket缓冲区,避免send () send()、recv()://接收缓冲区int nRecvBuf=32 * 1024的连续循环发送和接收;//设置为32k setsockopt (s,sol _ socket,so _ rcvbuf,(constchar *) nrecvbuf,sizeof(int));//发送缓冲区int nSendBuf=32 * 1024//设置为32k setsockopt (s,sol _ socket,so _ sndbuf,(constchar *) nsendbuf,sizeof(int));发送数据时,不要从系统缓冲区复制到socket缓冲区,以提高程序的性能:int nZero=0;setsockopt(socket,SOL_SOCKET,SO_SNDBUF,(char *)nZero,sizeof(nZero));6.接收数据时,不执行将套接字缓冲区的内容复制到系统缓冲区:int nZero=0;setsockopt(s,SOL_SOCKET,SO_RCVBUF,(char *)nZero,sizeof(int));一般在发送UDP数据报时,希望这个socket发送的数据具有广播特性:boolbroadcast=truesetsockopt(s,SOL_SOCKET,SO_BROADCAST,(const char*)bBroadcast,sizeof(BOOL));在客户端连接服务器的过程中,如果非阻塞模式的socket处于connect()过程中,可以设置connect()延迟,直到调用accpet()为止(该设置只在非阻塞过程中起显著作用,在阻塞的函数调用中不起作用)。BOOL bConditionalAccept=TRUEsetsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const char *)bconditionaccept,sizeof(BOOL));如果在发送数据的过程中,send()未完成且未发送数据时调用close socket(),通常的措施是关机(s,SD_BOTH),但数据会丢失。一些特定的程序要求在未完成的数据发出后关闭套接字。程序可以设置满足要求:1 struct linger { 2u _ short l _ onoff;3 u _ short l _ linger4 };5灵儿m _ sLinger6m _ slinger . l _ onoff=1;7 //调用closesocket()时,仍有数据未发送。允许等待8 //如果m _ slinger . l _ onoff=0;然后9 m_sLinger.l_linger=5调用closesocket()后强制关闭;//将等待时间设置为5秒10 setsockopt (s,sol _ socket,so _ linger,11 (constchar *) m _ slinger,sizeof(linger));
转载于:https://www。cnblogs。陈清的天空/p/4123285。超文本标记语言
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。