Linux所提供的socket库中存在一个bug,即不能为一个套接字重新启用同一个端口,即使是你正常关闭该套接字以后,这是因为linux内核在一个绑定套接字的进程结束后从不把端口标记为未用。为了解决上述问题,setsockopt和getsockopt函数就被引进来了,当然它俩的功能不止这一点。
函数原型:
- int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)
- int getsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)
其中
level是函数所使用的协议标准,可以取如下值:
- SOL_SOCKET: 基本套接口
- IPPROTO_IP: IPv4套接口
- IPPROTO_IPV6: IPv6套接口
- IPPROTO_TCP: TCP套接口
optval是指向setsockopt函数所设置的值的地址,getsockopt函数所获取的值
optlen是optval的长度,以bytes计
optname是选项的名称,可以取如下值:
- SO_BROADCAST BOOL类型 允许套接口传送广播信息
- SO_DEBUG BOOL类型 记录调试信息
- SO_DONTLINER BOOL类型 不要因为数据未发送就阻塞关闭操作
- SO_DONTROUTE BOOL类型 禁止选择径;直接传送
- SO_KEEPALIVE BOOL类型 发送保持活动包
- SO_LINGER struct linger FAR* 如关闭时有未发送数据,则逗留
- SO_OOBINLINE 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));
阅读(6048) | 评论(1) | 转发(2) |