Java Socket 的参数选项解读(2)

/**
    * Disable/Enable local loopback of multicast datagrams
    * The option is used by the platform's networking code as a hint
    * for setting whether multicast data will be looped back to
    * the local socket.
    *
    * <p>Because this option is a hint, applications that want to
    * verify what loopback mode is set to should call
    * {@link #getLoopbackMode()}
    * @param disable <code>true</code> to disable the LoopbackMode
    * @throws SocketException if an error occurs while setting the value
    * @since 1.4
    * @see #getLoopbackMode
    */
    public void setLoopbackMode(boolean disable) throws SocketException {
    getImpl().setOption(SocketOptions.IP_MULTICAST_LOOP, Boolean.valueOf(disable));
    }

9、public final static int IP_TOS = 0x3;

这个参数是用来控制IP头中的TOS字段的,是用来控制和优化IP包的路径的,在Socket源代码里有一个设置的方法:

/**
    * Sets traffic class or type-of-service octet in the IP
    * header for packets sent from this Socket.
    * As the underlying network implementation may ignore this
    * value applications should consider it a hint.
    *
    * <P> The tc <B>must</B> be in the range <code> 0 <= tc <=
    * 255</code> or an IllegalArgumentException will be thrown.
    * <p>Notes:
    * <p> For Internet Protocol v4 the value consists of an octet
    * with precedence and TOS fields as detailed in RFC 1349. The
    * TOS field is bitset created by bitwise-or'ing values such
    * the following :-
    * <p>
    * <UL>
    * <LI><CODE>IPTOS_LOWCOST (0x02)</CODE></LI>
    * <LI><CODE>IPTOS_RELIABILITY (0x04)</CODE></LI>
    * <LI><CODE>IPTOS_THROUGHPUT (0x08)</CODE></LI>
    * <LI><CODE>IPTOS_LOWDELAY (0x10)</CODE></LI>
    * </UL>
    * The last low order bit is always ignored as this
    * corresponds to the MBZ (must be zero) bit.
    * <p>
    * Setting bits in the precedence field may result in a
    * SocketException indicating that the operation is not
    * permitted.
    * <p>
    * As RFC 1122 section 4.2.4.2 indicates, a compliant TCP
    * implementation should, but is not required to, let application
    * change the TOS field during the lifetime of a connection.
    * So whether the type-of-service field can be changed after the
    * TCP connection has been established depends on the implementation
    * in the underlying platform. Applications should not assume that
    * they can change the TOS field after the connection.
    * <p>
    * For Internet Protocol v6 <code>tc</code> is the value that
    * would be placed into the sin6_flowinfo field of the IP header.
    *
    * @param tc        an <code>int</code> value for the bitset.
    * @throws SocketException if there is an error setting the
    * traffic class or type-of-service
    * @since 1.4
    * @see #getTrafficClass
    */
    public void setTrafficClass(int tc) throws SocketException {
    if (tc < 0 || tc > 255)
        throw new IllegalArgumentException("tc is not in range 0 -- 255");

if (isClosed())
        throw new SocketException("Socket is closed");
        getImpl().setOption(SocketOptions.IP_TOS, new Integer(tc));
    }

从源代码的注释看,TOS设置了是否生效,和底层的操作系统的实现有关。应用程序无法保证TOS的变更会对socket连接产生影响。个人认为,TOS在一般情况下用不到。

10、public final static int SO_LINGER = 0x0080;

先看Socket源代码:

/**
    * Enable/disable SO_LINGER with the specified linger time in seconds.
    * The maximum timeout value is platform specific.
    *
    * The setting only affects socket close.
    *
    * @param on    whether or not to linger on.
    * @param linger how long to linger for, if on is true.
    * @exception SocketException if there is an error
    * in the underlying protocol, such as a TCP error.
    * @exception IllegalArgumentException if the linger value is negative.
    * @since JDK1.1
    * @see #getSoLinger()
    */
    public void setSoLinger(boolean on, int linger) throws SocketException {
    if (isClosed())
        throw new SocketException("Socket is closed");
    if (!on) {
        getImpl().setOption(SocketOptions.SO_LINGER, new Boolean(on));
    } else {
        if (linger < 0) {
        throw new IllegalArgumentException("invalid value for SO_LINGER");
        }
            if (linger > 65535)
                linger = 65535;
        getImpl().setOption(SocketOptions.SO_LINGER, new Integer(linger));
    }
    }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8146dee63b32a153663163c48e7aa04d.html