Java_java_net_PlainSocketImpl_socketSetOption是一个很好的选择。

问题描述 投票:0回答:2

在open-jdk-8中。

这个jin函数。Java_java_net_PlainSocketImpl_socketSetOption。

/*                                                                                                                                                                                            
     * SO_TIMEOUT is a no-op on Solaris/Linux                                                                                                                                                     
     */
    if (cmd == java_net_SocketOptions_SO_TIMEOUT) {
        return;
    }

file: openjdk7jdksrcsolarisnativejavanetPlainSocketImpl.c

这是否意味着,在linux上setOption的SO_TIMEOUT将被忽略?

但solaris的代码似乎也适用于linux。

java sockets java-native-interface java-8 openjdk
2个回答
0
投票

不,它只是意味着它没有作为一个套接字选项来实现。有些平台不支持它。在这些平台上 select() 或朋友的使用。


0
投票

Solaris文件夹内的源码也用于Linux。

SO_TIMEOUT 中被忽略。Java_java_net_PlainSocketImpl_socketSetOption0. 但是... timeout 时,将其作为一个字段保留。AbstractPlainSocketImpl.setOption 被称为。

case SO_TIMEOUT:
    if (val == null || (!(val instanceof Integer)))
            throw new SocketException("Bad parameter for SO_TIMEOUT");
    int tmp = ((Integer) val).intValue();
    if (tmp < 0)
            throw new IllegalArgumentException("timeout < 0");
// Saved for later use
    timeout = tmp;
    break;

timeout 读取时使用 SocketInputStream:

public int read(byte b[], int off, int length) throws IOException {
    return read(b, off, length, impl.getTimeout());
}
© www.soinside.com 2019 - 2024. All rights reserved.