Socket编程::setsockopt和getsockopt函数

转:http://blog.chinaunix.net/uid-12845622-id-3248986.html

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));

猜你喜欢

转载自zdflgl.iteye.com/blog/2144293