网络IPC, socket(6): socket选项

socket提供了两个函数来控制socket行为, 一个用来设置选项, 一个用来查询一个socket选项的状态.

可以设置或查询的三种选项是:

  • 通用选项, 工作在所有socket类型上.
  • 在socket层次管理的选项, 但是依赖于下层协议的支持.
  • 特定协议选项.

1. 设置socket选项函数:

  • 头文件: <sys/socket.h>
  • 原型: int setsockopt(int sockfd, int level, int option, const void *val, socklen_t len);
  • 返回值: 成功则返回0, 出错则返回-1.
  • 参数:
  • level: 标识了选项应用的协议(层).
    • 如果是通用选项, level设置成SOL_SOCKET.
    • 否则设置成控制这个选项的协议号, 例如:
      • TCP: IPPROTO_TCP
      • IP: IPPROTO_IP.
  • option: socket选项. 具体查APUE 465页表.
  • val: 根据选项的不同指向一个struct或一个int.
  • len: val指向的对象的大小.

 

2. 查询socket选项函数:

  • 头文件: <sys/socket.h>
  • 原型: int getsockopt(int sockfd, int level, int option, void *restrict val, socklen_t *restrict lenp);
  • 返回值: 成功则返回0, 出错则返回-1.
  • 参数:
    • lenp: 指向整数的指针. 在执行getsockopt之前, 设置该整数为存储选项的缓冲区大小.
      • 如果实际的尺寸大于此值, 选项会被截断而不报错.
      • 如果实际的尺寸小于或等于此值, 返回值将此值更新为实际尺寸.

 

附录:

socket选项表
选项 参数val类型 描述
SO_ACCEPTCONN int 返回信息指示该socket是否能监听(仅getsockopt)
SO_BROADCAST int 如果*val非0, 广播数据包
SO_DEBUG int 如果*val非0, 启用网络驱动调试功能
SO_DONTROUTE int 如果*val非0, 绕过通常路由
SO_ERROR int 返回挂起的socket错误并清楚(仅getsockopt)
SO_KEEPALIVE int 如果*val非0, 启用周期性keep-alive消息
SO_LINGER struct linger 当有未发消息并且socket关闭时, 延迟时间
SO_OOBINLINE int 如果*val非0, 将带外数据放在普通数据中
SO_RCVBUF int 以字节为单位的接收缓冲区大小
SO_RCVLOWAT int 接收调用中返回的以字节为单位的最小数据量
SO_RCVTIMEO struct timeval socket接收调用的超时值
SO_REUSEADDR int 如果*val非0, 重用bind中的地址
SO_SNDBUF int 以字节为单位的发送缓冲区大小
SO_SNDLOWAT int 发送调用中以字节为单位的发送的最小数据量
SO_SNDTIMEO struct timeval socket发送调用的超时值
SO_TYPE int 标识socket类型(仅getsockopt)

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(工作,socket,网络,struct,tcp,存储)