服务端socket重用属性设置
Posted chusiyong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务端socket重用属性设置相关的知识,希望对你有一定的参考价值。
初始化socket
socket是一种系统资源,并不是每次初始化都一定成功,因此为了避免初始化失败,一般使用多次初始化的方式,如下所示:
unsigned int times = 0x0; while((server = socket(PF_INET6, SOCK_STREAM, 0)) < 0 && times < 0x3) { times++; printf("create socket faild %d times ", times); }
设置socket的可重用属性
一般来说,一个端口释放后会等待两分钟左右才能再被使用,SO_REUSEADDR是让端口释放后立即就可以被再次使用。例如:一个进程监听一个端口,进程在某个时候异常重启了,如果socket没有设置可重用属性,那么进程重启后就会出现bind错误,因为同一个端口两次监听的时间间隔需要75秒;如果设置了可重用属性,那么同一个端口释放之后马上就可以再次使用,如下所示:
int reuse = 0x0; result = setsockopt(server, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(int)); if(result != 0) { printf(" Fail to set socket reuseraddr options, errno = 0x%x! ", result); }
设置socket的保活属性
TCP是一种面向连接的协议,因此需要实时检查连接是否正常,特别是在上层长时间无数据传输时。一般检查连接是否正常的方式是提供一个保活机制,即定时的发送一种探测报文,可以是上层自己发送,也可以使用socket自己提供的保活机制,也就是保活属性,但是socket自己提供的保活机制一般不可靠,或者说是不完全可靠,因此在实际编程中是两种同时使用。首先上层启用一个任务,定时发送检测报文,然后设置socket的保活属性,以期达到完全可靠,如下所示:
int optval = 0x1; result = setsockopt(server, SOL_SOCKET, SO_KEEPALIVE, (char*)&optval, sizeof(int)); if(result != 0) { printf("Fail to set socket keepalive options, errno = 0x%x! ", result); }
设置socket的缓冲区大小属性
以上是关于服务端socket重用属性设置的主要内容,如果未能解决你的问题,请参考以下文章