0%

网络编程之 socket 选项

选项 可能存在于多层协议中,它们总会出现在最上面的 socket 层;当操作 socket 选项时,选项位于的层和选项的名称必须给出。

选项相关函数

setsockopt

  1. 头文件: #include<sys/socket.h>

  2. 功能: 设置与 socket 关联的选项。

  3. 原型:

    1
    int setsockopt(int sock, int level, int optname, const void *optval, socklen_t optlen);
  4. 参数:

    • sock: 将要被设置选项的 socket

      • level: 选项所在的协议层。

        含义
        SOL_SOCKET 通用 socket 选项
        IPPROTO_IP IP 选项
        IPPROTO_TCP TCP 选项
      • optname: 需要设置的选项名。

      • optval: 指向包含新选项值的缓冲(根据选项名称的数据类型进行转换)。

      • optlen: 选项值的最大长度

  5. 返回值:

    • 0: 成功。

      • -1: 失败,错误原因可以通过 error 获得

        含义
        EBADF sock 不是有效的文件描述符
        EFAULT optval 指向的内存并非有效的进程空间
        EINVAL optlen 无效
        ENOPROTOOPT 指定的协议层不能识别选项
        ENOTSOCK sock 描述的不是 socket

getsockopt

  1. 头文件: #include<sys/socket.h>

  2. 功能: 获取与 socket 关联的选项。

  3. 原型:

    1
    int getsockopt(int sock, int level, int optname, void *optval, socklen_t *optlen);
  4. 参数:

    • sock: 将要被获取选项的 socket

    • level: 选项所在的协议层。

      含义
      SOL_SOCKET 通用 socket 选项
      IPPROTO_IP IP 选项
      IPPROTO_TCP TCP 选项
    • optname: 需要获取的选项名。

    • optval: 指向返回选项值的缓冲(根据选项名称的数据类型进行转换)。

    • optlen: 选项值的实际长度。

  5. 返回值:

    • 0: 成功。

    • -1: 失败,错误原因可以通过 error 获得

      含义
      EBADF sock 不是有效的文件描述符
      EFAULT optval 指向的内存并非有效的进程空间
      ENOPROTOOPT 指定的协议层不能识别选项
      ENOTSOCK sock 描述的不是 socket

选项

协议层 选项名 说明 数据类型
SOL_SOCKET SO_BROADCAST 允许发送广播数据 int
SO_DEBUG 允许调试 int
SO_DONTROUTE 不查找路由 int
SO_ERROR 获得套接字错误 int
SO_KEEPALIVE 保持连接 int
SO_LINGER 延迟关闭连接 struct linger
SO_OOBINLINE 带外数据放入正常数据流 int
SO_RCVBUF 接收缓冲区大小 int
SO_SNDBUF 发送缓冲区大小 int
SO_RCVLOWAT 接收缓冲区下限 int
SO_SNDLOWAT 发送缓冲区下限 int
SO_RCVTIMEO 接收超时 struct timeval
SO_SNDTIMEO 发送超时 struct timeval
SO_REUSERADDR 允许重用本地地址和端口 int
SO_TYPE 获得套接字类型 int
SO_BSDCOMPAT 与BSD系统兼容  int
IPPROTO_IP IP_HDRINCL 在数据包中包含IP首部 int
IP_OPTINOS IP首部选项 int
IP_TOS 服务类型 int
IP_TTL 生存时间 int
IPPRO_TCP TCP_MAXSEG TCP最大数据段的大小 int
TCP_NODELAY 不使用Nagle算法 int