贵州做网站公司
贵州做网站公司~专业!靠谱!
10年网站模板开发经验,熟悉国内外开源网站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等网站程序,可为您提供网站建设,网站克隆,仿站,网页设计,网站制作,网站推广优化等服务。我们专注高端营销型网站,企业官网,集团官网,自适应网站,手机网站,网络营销,网站优化,网站服务器环境搭建以及托管运维等。为客户提供一站式网站解决方案!!!

setsockopt(setsockopt函数有什么用)

来源:网络转载 时间:2024-05-06 09:43:59

setsockopt是用来设置socket的属性。

setsockopt设置SO_REUSEADDR。

socket关闭之后并不会立即收回,而是要经历一个TIME_WAIT的阶段。windows下最多可以达到4分钟。

所以在这个时候对这个端口进行重新绑定就会出错。所以需要先设置 SO_REUSEADDR.

或者在closesocket的时候,使用setsockopt设置SO_DONTLINGER。也不会有TIME_WAIT的阶段.

通常使用这个设置来加强网络程序的健壮性。

下面是别处补充的资料:

1. 如果在已经处于 ESTABLISHED状态下的socket(一般由端口号和标志符区分)调用
closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:
BOOL bReuseaddr=TRUE;
setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const
char*)&bReuseaddr,sizeof(BOOL));

2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历
TIME_WAIT的过程:
BOOL bDontLinger = FALSE;
setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const
char*)&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,(const char*)&nRecvBuf,sizeof(int));
//发送缓冲区
int nSendBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_SNDBUF,(const char*)&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,(const
char*)&bBroadcast,sizeof(BOOL));

8.在client连接服务器过程中,如果处于非阻塞模式下的socket在connect()的过程中可
以设置connect()延时,直到accpet()被呼叫(本函数设置只有在非阻塞的过程中有显著的
作用,在阻塞的函数调用中作用不大)
BOOL bConditionalAccept=TRUE;
setsockopt(s,SOL_SOCKET,SO_CONDITIONAL_ACCEPT,(const
char*)&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,(const
char*)&m_sLinger,sizeof(linger));
Note:1.在设置了逗留延时,用于一个非阻塞的socket是作用不大的,最好不用;2.如果想要程序不经历SO_LINGER需要设置SO_DONTLINGER,或者设置l_onoff=0;

10.还一个用的比较少的是在SDI或者是Dialog的程序中,可以记录socket的调试信息:
(前不久做过这个函数的测试,调式信息可以保存,包括socket建立时候的参数,采用的
具体协议,以及出错的代码都可以记录下来)
BOOL bDebug=TRUE;
setsockopt(s,SOL_SOCKET,SO_DEBUG,(const char*)&bDebug,sizeof(BOOL));

标签:setsockopt-

在自媒体不断发展的今天,微信公众号已经成为了一种全新的品牌推广方式,不过因为原始微信平台的功能过于单一,不能满足企业对于商业推广的需求,所以专业的微信代运营的应...

  对于现在的消费需求来说,企业已经将很多的销售方向放在了网络上,毕竟网络四通八达,想要在网络上完成企业产品销量的提升,小程序一直都是重点选择,因为小程序可以方...

现在做代购的人越来越多了,不管是日韩美、欧洲各种商品都应有尽有。微信作为推进代购生意的利器,是许多微商的好选择。下面本站为您奉上海淘行业微信代运营方案。1.定位...

常见的证券分析软件都有哪些?常见的证券分析软件包括:同花顺、东方财富、容维财经、腾讯自选股、大智慧、360股票等等。1、同花顺同花顺是一款成熟的手机股票、证券交易软件,也是目前广泛使用的手机股票、证券交易软件。同花顺移动股票交易软件支持多种终端,如安卓、IOS、WIN、iPad等。同花顺手机股票交易软件性能稳定,支持更多券商,支持手机在线交易。它也是第一个在手机上启动二级数据查询的股票交易软件。2...

农行企业网银怎么登录?企业网银登录方法:请用户登录农行官网,点击“企业网银登录-证书登录”进入,原智信版客户可点击“用户名登录”进入。温馨提示:若更换登录电脑需要重新安装K宝驱动,请用户通过官网点击“企业网银登录- K宝首次登录指南安装K宝驱动”,选择^下载对应的K宝驱动。办理企业网银注册业务,须向注册行提供以下资料:1、用户...

戴维斯双杀是什么意思?戴维斯双杀效应是由著名的投资人戴维斯提出的一种双杀效应,指的是关于上市公司股票价格的波动和市场的预期之间的倍数效应。通俗来讲就是股票的每股收益下滑引起了股价下滑,而股价下滑又会带动市盈率下跌,PE下跌又会进一步导致股价下跌,简单总结就是盈利和估值的双双下跌而导致的股价暴跌。戴维斯双击一般涨多少?上涨4.5倍。1、戴维斯双击是指在低市盈率(PE)买入股票,待成长潜力显现后,以高...

TOP