setsockopt、getsockopt详细介绍 getsockopt函数

本文只讲解socket编程中的setsockopt、getsockopt两个函数。关于其它函数的介绍可以参考下面链接:http://blog.sina.com.cn/s/blog_a459dcf5010155nf.html一、 int PASCAL FAR setsockopt( SOCKETs, int level, int optname, const char FAR* optval, intoptlen);
设置套接口的选项。
s:标识一个套接口的描述字。
level:选项定义的层次;目前仅支持SOL_SOCKET和IPPROTO_TCP层次。
optname:需设置的选项。
optval:指针,指向存放选项值的缓冲区。
optlen:optval缓冲区的长度。
setsockopt()的使用是十分复杂的,其功能是很丰富的。setsockopt()函数用于任意类型、任意状态套接口的设置选项值。有两种套接口的选项:一种是布尔型选项,允许或禁止一种特性;另一种是整形或结构选项。允许一个布尔型选项,则将optval指向非零整形数; 禁止一个选项optval指向一个等于零的整形数。对于布尔型选项,optlen应等于sizeof(int) ;对其他选项,optval指向包含所需选项的整形数或结构,而optlen则为整形数或结构的长度。返回值:若无错误发生,setsockopt()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。错误代码:
WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。
WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。
WSAEFAULT:optval不是进程地址空间中的一个有效部分。
WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
WSAEINVAL:level值非法,或optval中的信息非法。
WSAENETRESET:当SO_KEEPALIVE设置后连接超时。
WSAENOPROTOOPT:未知或不支持选项。其中,SOCK_STREAM类型的套接口不支持SO_BROADCAST选项,SOCK_DGRAM类型的套接口不支持SO_DONTLINGER、SO_KEEPALIVE、SO_LINGER和SO_OOBINLINE选项。
WSAENOTCONN:当设置SO_KEEPALIVE后连接被复位。
WSAENOTSOCK:描述字不是一个套接口。
具体使用如下:
1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:
BOOL bReuseaddr=TRUE;
setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(constchar*)&bReuseaddr,sizeof(BOOL));
2.如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历TIME_WAIT的过程:
BOOL bDontLinger = FALSE;
setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(constchar*)&bDontLinger,sizeof(BOOL));
3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:
int nNetTimeout=1000;//1秒
//发送时限
setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char*)&nNetTimeout,sizeof(int));
//接收时限 setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char*)&nNetTimeout,sizeof(int));
4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);
在实际的过程中发送数据和接收数据量比较大,可以设置socket缓冲区,而避免了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));5.如果在发送数据的时,希望不经历由系统缓冲区到socket缓冲区的拷贝而影响程序的性能:
int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_SNDBUF,(char*)&nZero,sizeof(nZero));6.同上在recv()完成上述功能(默认情况是将socket缓冲区的内容拷贝到系统缓冲区):
int nZero=0;
setsockopt(socket,SOL_S0CKET,SO_RCVBUF,(char*)&nZero,sizeof(int));7.一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性:
BOOL bBroadcast=TRUE;
setsockopt(s,SOL_SOCKET,SO_BROADCAST,(constchar*)&bBroadcast,sizeof(BOOL));8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可以设置connect()延时,直到accpet()被呼叫(本函数设置只有在非阻塞的过程中有显著的作用,在阻塞的函数调用中作用不大)
BOOL bConditionalAccept=TRUE;
setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(constchar*)&bConditionalAccept,sizeof(BOOL));9.如果在发送数据的过程中(send()没有完成,还有数据没发送)而调用了closesocket(),以前我们一般采取的措施是"从容关闭"shutdown(s,SD_BOTH),但是数据是肯定丢失了,如何设置让程序满足具体应用的要求(即让没发完的数据发送出去后在关闭socket)?
struct linger
{
u_short l_onoff;
u_short l_linger;
};
linger m_sLinger;
m_sLinger.l_onoff=1;//(在closesocket()调用,但是还有数据没发送完毕的时候容许逗留)如果m_sLinger.l_onoff=0;则功能和2.)作用相同;
m_sLinger.l_linger=5;//(容许逗留的时间为5秒)
setsockopt(s,SOL_SOCKET,SO_LINGER,(constchar*)&m_sLinger,sizeof(linger));二、 int PASCAL FAR getsockopt(SOCKET s, int level, int optname, char FAR* optval, int FAR*optlen);
s:一个标识套接口的描述字。
level:选项定义的层次。支持的层次仅有SOL_SOCKET和IPPROTO_TCP。
optname:需获取的套接口选项。
optval:指针,指向存放所获得选项值的缓冲区。
optlen:指针,指向optval缓冲区的长度值。
返回值:若无错误发生,getsockopt()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。
错误代码:
WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。
WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。
WSAEFAULT:optlen参数非法。
WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
WSAENOPROTOOPT:未知或不支持选项。其中,SOCK_STREAM类型的套接口不支持SO_BROADCAST选项,SOCK_DGRAM类型的套接口不支持SO_ACCEPTCONN、SO_DONTLINGER、SO_KEEPALIVE、SO_LINGER和SO_OOBINLINE选项。WSAENOTSOCK:描述字不是一个套接口。

  

爱华网本文地址 » http://www.aihuau.com/a/25101018/371406.html

更多阅读

QQ九仙 什么职业好,职业特点选择详细介绍 qq九仙单刷职业

QQ九仙哪个职业厉害?这是每一个玩家进入游戏时都很关注的一个问题,为了帮助大家能够更好的选择职业,下面小编详细的为大家解说下QQ九仙里面几个职业的特点。【QQ九仙】什么职业好,职业特点选择详细介绍——职业特点【QQ九仙】什么职业

长江三峡旅游景点的详细介绍 长江三峡的特点

长江三峡旅游景点的详细介绍——简介长江三峡是我们中国十大风景名胜之一,也是全国40佳旅游景观之首。她西起重庆奉节的白帝城,东至湖北省宜昌市的南津关。全长193公里,是世界上最大的峡谷之一。长江三峡旅游景点的详细介绍——长江三

笔记本电脑键盘上Fn键的详细介绍 联想笔记本键盘取消fn

笔记本电脑键盘上Fn键的详细介绍——简介鉴于笔记本使用率越来越高,而大家基本都不用Fn这个功能键。这是个强大的功能组合键,和一些特定的键配合,能起到快捷操作的作用。下面,我就来介绍具体的使用。笔记本电脑键盘上Fn键的详细介绍—

DNF佣兵系统详细介绍 dnf支援兵系统详细介绍

DNF佣兵系统详细介绍——简介早在不知道什么时候,DNF推出了佣兵系统,到底是什么玩意呢?DNF佣兵系统详细介绍——DNF佣兵系统:DNF佣兵系统详细介绍 1、在某次版本更新以后,DNF就推出了佣兵系统。DNF佣兵系统在哪?我们可以看到屏幕的右下

声明:《setsockopt、getsockopt详细介绍 getsockopt函数》为网友烟波的蓝分享!如侵犯到您的合法权益请联系我们删除