setsockopt的几个常用用法笔记

1,不需要等发送缓冲区的数据发送完,直接关闭socket,这个在close(socket)中使用。

socklen_t optlen;
struct linger sLinger;
optlen = sizeof(struct linger);
if(setsockopt(pTCP->tcpSock, SOL_SOCKET, SO_LINGER, (const char*)&sLinger, optlen) < 0)
{
	err_handler();
}

2,发送缓冲区的设置,网上大多数用32k,防止循环发送?但其实实现的要比设置的大很多,经过测试为2倍,所以16k足矣。

optval = 16*1024;	
optlen =  sizeof(int);	
if(setsockopt(pTCP->tcpSock, SOL_SOCKET, SO_SNDBUF, (const char*)&optval, optlen) < 0){
	err_handler();
}

3,连接服务器的最大时间设置为20s,这个应发送时间超时时间。是写操作,和connect无关。

struct timeval timeo; 
timeo.tv_sec = 20;
timeo.tv_usec = 0;
optlen =  sizeof(timeo);	
if(setsockopt(pTCP->tcpSock, SOL_SOCKET, SO_SNDTIMEO, &timeo, optlen) < 0){
	err_handler();
}

4,心跳,tcp命令都是有心跳的,在心跳包处发一个空数据帧,

开启心跳监测,默认的太久了,不现实。

int keepAlive = 1;
setsockopt(pTCP->tcpSock, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));

在keepIdle秒内,没有任何数据来往,则进行监测
发包的时间间隔为keepInterval秒,探测尝试的次数为keepCount次,如果第一次探测包收到响应了,第二次就不发了(有的是tcp_keepalive_probes)

	setsockopt(pTCP->tcpSock, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
	setsockopt(pTCP->tcpSock, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
	setsockopt(pTCP->tcpSock, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值