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