Linux所提供的socket库中存在一个bug,即不能为一个套接字重新启用同一个端口,
即使是你正常关闭该套接字以后,这是因为linux内核在一个绑定套接字的进程结束后
从不把端口标记为未用。为了解决上述问题,setsockopt和getsockopt函数就被引进
来了,当然它俩的功能不止这一点。
#include<sys/socket.h>
int setsocketopt(int socket,int level,int option_name,
const void *option_value, size_t option_len)
int getsockopt(int sockfd,int level,int optname,
const void *optval,socklen_t *optlen)
参数:
参数1:套接字描述符
参数2:被设置选项的级别
如果想要在套接字上设置选项,则把LEVEL 设为
SOL_SOCKET。
level 函数使用的协议标准,可取选项为:
SOL_SOCKET: 基本套接口
IPPROTO_IP: IPv4套接口
IPPROTO_IPV6: IPv6套接口
IPPROTO_TCP: TCP套接口
参数4:指的是向setscoketopt函数设置值的地址
或者getsockopt函数所获取的值
参数5:参数4的长度 以字节计数
参数3:可选项的名称
SO_BROADCAST BOOL 允许套接字传送广播信息
SO_DEBUG BOOL 记录调试信息
SO_DONTLINER BOOL 不要因为数据未发送就堵塞关闭操作 设置本选项相当于将SO_LINGER的l_onoff元素置为零
SO_DONTROUTE BOOL 禁止选径;直接传送
SO_KEEPALIVE BOOL 发送“保持活动”包
SO_LINGER struct linger FAR*如关闭时有未发送数据,则逗留。
SO_OOBBINLINE BOOL 在常规数据流中接收带外(Out-Of-Band)数据
SO_RCVBUF int 为接收确定缓冲区大小
SO_REUSEADDR BOOL 允许套接口和一个已在使用中的地址捆绑
SO_SNDBUF int 指定发送缓冲区大小
端口可重用的示例代码
s = socket(...)
BOOL isReusable=TRUE;
setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&isReusable,sizeof(BOOL));
使用场景详解
场景1:
closesocket(一般使用之后socket不会立即关闭而要经历TIME_WAIT的过程),
之后想要重用该socket:
则:
BOOL bReuseaddr=TRUE;
setsockopt(s