• Unix Network Programming Episode 59


    We can summarize our discussion of these socket options with the following recommendations:

    1.Set the SO_REUSEADDR socket option before calling bind in all TCP servers.
    2.When writing a multicast application that can be run multiple times on the same host at the same time, set the SO_REUSEADDR socket option and bind the group’s multicast address as the local IP address.

    SO_TYPE Socket Option

    This option returns the socket type. The integer value returned is a value such as SOCK_STREAM or SOCK_DGRAM. This option is typically used by a process that inherits a socket when it is started.

    SO_USELOOPBACK Socket Option

    This option applies only to sockets in the routing domain (AF_ROUTE). This option defaults to ON for these sockets (the only one of the SO_xxx socket options that defaults to ON instead of OFF). When this option is enabled, the socket receives a copy of everything sent on the socket.

    IPv4 Socket Options

    IP_HDRINCL Socket Option

    If this option is set for a raw IP socket (Chapter 28(See 9.17)), we must build our own IP header for all the datagrams we send on the raw socket. Normally, the kernel builds the IP header for datagrams sent on a raw socket, but there are some applications (notably traceroute) that build their own IP header to override values that IP would place into certain header fields.

    When this option is set, we build a complete IP header, with the following exceptions:

    • IP always calculates and stores the IP header checksum.
    • If we set the IP identification field to 0, the kernel will set the field.
    • If the source IP address is INADDR_ANY, IP sets it to the primary IP address of the outgoing interface.
    • Setting IP options is implementation-dependent. Some implementations take any IP options that were set using the IP_OPTIONS socket option and append these to the header that we build, while others require our header to also contain any desired IP options.
    • Some fields must be in host byte order, and some in network byte order. This is implementation-dependent, which makes writing raw packets with IP_HDRINCL not as portable as we’d like.

    IP_OPTIONS Socket Option

    Setting this option allows us to set IP options in the IPv4 header. This requires intimate knowledge of the format of the IP options in the IP header. We will discuss this option with regard to IPv4 source routes in Section 27.3(See 9.16.3).

    IP_RECVDSTADDR Socket Option

    This socket option causes the destination IP address of a received UDP datagram to be returned as ancillary data by recvmsg. We will show an example of this option in Section 22.2(See 9.11.2).

    IP_RECVIF Socket Option

    This socket option causes the index of the interface on which a UDP datagram is received to be returned as ancillary data by recvmsg. We will show an example of this option in Section 22.2(See 9.11.2).

    IP_TOS Socket Option

    This option lets us set the type-of-service (TOS) field (which contains the DSCP and ECN fields, Figure A.1(See 10.2)) in the IP header for a TCP, UDP, or SCTP socket. If we call getsockopt for this option, the current value that would be placed into the DSCP and ECN fields in the IP header (which defaults to 0) is returned. There is no way to fetch the value from a received IP datagram.

    IP_TTL Socket Option

    With this option, we can set and fetch the default TTL (Figure A.1(See 10.2)) that the system will use for unicast packets sent on a given socket. (The multicast TTL is set using the IP_MULTICAST_TTL socket option, described in Section 21.6(See 9.10.6).) 4.4BSD, for example, uses the default of 64 for both TCP and UDP sockets (specified in the IANA’s “IP Option Numbers” registry [IANA]) and 255 for raw sockets. As with the TOS field, calling getsockopt returns the default value of the field that the system will use in outgoing datagrams—there is no way to obtain the value from a received datagram. We will set this socket option with our traceroute program in Figure 28.19(See 9.17.6).

    ICMPv6 Socket Option

    This option lets us fetch and set an icmp6_filter structure that specifies which of the 256 possible ICMPv6 message types will be passed to the process on a raw socket.

    IPv6 Socket Options

    IPV6_CHECKSUM Socket Option

    This socket option specifies the byte offset into the user data where the checksum field is located. If this value is non-negative, the kernel will: (i) compute and store a checksum for all outgoing packets, and (ii) verify the received checksum on input, discarding packets with an invalid checksum. This option affects all IPv6 raw sockets, except ICMPv6 raw sockets. (The kernel always calculates and stores the checksum for ICMPv6 raw sockets.) If a value of -1 is specified (the default), the kernel will not calculate and store the checksum for outgoing packets on this raw socket and will not verify the checksum for received packets.

  • 相关阅读:
    React - 虚拟DOM 和 Diff 算法
    【前端开发】JS同步与异步调用,Vue2基础知识
    【测试面试】20K测试工程师会考察哪些能力?
    T1091 求阶乘的和(信息学一本通C++)
    C# Socket通信从入门到精通(2)——多个同步TCP客户端C#代码实现
    安卓调用手机邮箱应用发送邮件
    Java容器之set
    MyBatis大数据量插入方案
    记一次加锁导致ECS服务器CPU飙高的处理
    python解CCF-CSP真题《202206-2—寻宝!大冒险!》
  • 原文地址:https://blog.csdn.net/myfather103/article/details/81977500