卷2 第17章 插口选项

17.1 引言

本章讨论修改插口行为的系统调用。

17.2 代码介绍

  • kern/kern_descrip.c:fcntl
  • kern/uipc_syscalls.c:setsockopt/getsockopt
  • kern/uipc_socket.c:选项处理
  • kern/sys_socket.c:ioctl

17.3 setsockopt系统调用

SOL_SOCKET级选项

选项说明
SO_SNDBUF发送缓存大小
SO_RCVBUF接收缓存大小
SO_SNDLOWAT发送低水位
SO_RCVLOWAT接收低水位
SO_SNDTIMEO发送超时
SO_RCVTIMEO接收超时
SO_REUSEADDR重用地址
SO_REUSEPORT重用端口
SO_KEEPALIVE保活
SO_DONTROUTE旁路路由
SO_BROADCAST广播
SO_LINGER拖延关闭
SO_OOBINLINE带外数据内联

sosetopt函数

  1. 协议选项 → pr_ctloutput
  2. 插口选项 → switch处理

插口选项处理

  • SO_LINGER:设置拖延时间
  • 标志选项:设置/清除位
  • 缓存选项:sb_reserve
  • 超时选项:转换时间值

17.4 getsockopt系统调用

  • 返回选项当前值
  • SO_ERROR返回后清除

17.5 fcntl和ioctl系统调用

fcntl命令

命令说明
F_GETFL获取标志
F_SETFL设置标志
F_GETOWN获取进程ID
F_SETOWN设置进程ID

ioctl命令

命令说明
FIONBIO非阻塞
FIOASYNC异步通知
FIONREAD可读字节数
SIOCSPGRP设置进程组
SIOCGPGRP获取进程组
SIOCATMARK带外标记

17.6 getsockname系统调用

  • 返回本地地址
  • PRU_SOCKADDR请求

17.7 getpeername系统调用

  • 返回远端地址
  • PRU_PEERADDR请求

17.8 小结

setsockopt/getsockopt管理插口选项。fcntl和ioctl提供额外控制。