Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2123914
  • 博文数量: 229
  • 博客积分: 7217
  • 博客等级: 上校
  • 技术积分: 3224
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-19 17:23
个人简介

个人主页https://xugaoxiang.com,微信公众号: Dev_Club 或者搜索 程序员Club

文章分类

全部博文(229)

文章存档

2017年(1)

2016年(20)

2015年(23)

2013年(1)

2012年(23)

2011年(68)

2010年(62)

2009年(31)

分类: LINUX

2012-06-20 10:15:48

Linux所提供的socket库中存在一个bug,即不能为一个套接字重新启用同一个端口,即使是你正常关闭该套接字以后,这是因为linux内核在一个绑定套接字的进程结束后从不把端口标记为未用。为了解决上述问题,setsockopt和getsockopt函数就被引进来了,当然它俩的功能不止这一点。

函数原型:

点击(此处)折叠或打开

  1. int setsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)
  2. int getsockopt(int sockfd,int level,int optname,const void *optval,socklen_t *optlen)
其中
    level是函数所使用的协议标准,可以取如下值:

点击(此处)折叠或打开

  1. SOL_SOCKET: 基本套接口
  2. IPPROTO_IP: IPv4套接口
  3. IPPROTO_IPV6: IPv6套接口
  4. IPPROTO_TCP: TCP套接口
    optval是指向setsockopt函数所设置的值的地址,getsockopt函数所获取的值
    optlen是optval的长度,以bytes计
    optname是选项的名称,可以取如下值:

点击(此处)折叠或打开

  1. SO_BROADCAST BOOL类型 允许套接口传送广播信息
  2. SO_DEBUG BOOL类型 记录调试信息
  3. SO_DONTLINER BOOL类型 不要因为数据未发送就阻塞关闭操作
  4. SO_DONTROUTE BOOL类型 禁止选择径;直接传送
  5. SO_KEEPALIVE BOOL类型 发送保持活动包
  6. SO_LINGER struct linger FAR* 如关闭时有未发送数据,则逗留
  7. SO_OOBINLINE BOOL类型 在常规数据流中接收带外(Out-Of-Band)数据
  8. SO_RCVBUF int类型 为接收确定缓冲区大小
  9. SO_REUSEADDR BOOL类型 允许套接口和一个已在使用中的地址捆绑
  10. SO_SNDBUF int类型 指定发送缓冲区大小
端口可重用的代码片断

点击(此处)折叠或打开

  1. s = socket(...)
  2. BOOL isReusable=TRUE;
  3. setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&isReusable,sizeof(BOOL));

阅读(6048) | 评论(1) | 转发(2) |
给主人留下些什么吧!~~

qlyzpqz2014-08-25 17:10:20

说是bug,这个误导别人,这个,是因为TCP协议的状态中,有个TIME_WAIT状态,这个占用了端口,是正常的,不是什么bug