if (timeout) {
if (timeout <= 5000 || !isRcvTimeoutSupported) {
int ret = NET_Timeout (fd, timeout);
.....
.....
}
}
来源:http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/windows/native/java/net/socketinputstream.c
正如我所看到的,变量isRcvTimeoutSupported通常被设置为true,但是在设置套接字选项时可以将其删除为false:
/*
* SO_RCVTIMEO is only supported on Microsoft's implementation
* of Windows Sockets so if WSAENOPROTOOPT returned then
* reset flag and timeout will be implemented using
* select() -- see SocketInputStream.socketRead.
*/
if (isRcvTimeoutSupported) {
jclass iCls = (*env)->FindClass(env, "java/lang/Integer");
jfieldID i_valueID;
jint timeout;
CHECK_NULL(iCls);
i_valueID = (*env)->GetFieldID(env, iCls, "value", "I");
CHECK_NULL(i_valueID);
timeout = (*env)->GetIntField(env, value, i_valueID);
/*
* Disable SO_RCVTIMEO if timeout is <= 5 second.
*/
if (timeout <= 5000) {
timeout = 0;
}
if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout,
sizeof(timeout)) < 0) {
if (WSAGetLastError() == WSAENOPROTOOPT) {
isRcvTimeoutSupported = JNI_FALSE;
} else {
NET_ThrowCurrent(env, "setsockopt SO_RCVTIMEO");
}
}
......
......
}
来源:http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/windows/native/java/net/twostacksplainsocketimpl.c
无论如何,这些硬编码的5秒是从哪里来的?
我在MSDN上没有看到任何解释。
这段代码决定如何实现阻塞套接字超时--是使用SO_RCVTIMEO
还是使用SELECT
,因为Windows套接字同时支持这两种功能(SO_RCVTIMEO
不是所有平台都支持,甚至不是所有Windows实现都支持它,如代码注释中所述)。net_timeout
在封面下使用select
。
基本上算法是:
if SO_RCVTIMEO is supported and timeout is more than 5 seconds:
use SO_RCVTIMEO
else:
use select
至于5秒的门槛来自哪里,我最好的猜测是他们不知何故(通过测试还是反复试验?)对于小于5秒的超时值,select
更可靠或更准确。这并不是说它与这个问题特别相关(这是针对不同的操作系统),但这里有一个例子,有人报告SO_RCVTIMEO对于小超时值是不可靠的。
这是来自.properties得my DB配置: 这是config.xml: 实际上,我可以很容易地访问我们的本地web应用程序,并且可以在日志中看到到DB的连接跟踪,但对于批处理来说,情况并非如此。 在我有了这个之后: 有人帮忙吗?
问题内容: 我试图呼吁一个非常繁重的过程。平均工作时间估计为9-10分钟。 当我执行该过程时,我为一个巨大的数字设置了超时时间:99999999。 2分钟后,出现以下错误: java.net.SocketTimeoutException:读取超时 我尝试对其进行更多处理,并将超时设置为3000,并且在预期的3秒钟后出现了相同的错误。 您对为什么将其设置为最大120000 有任何想法吗? 问题答案:
问题内容: 如何尝试在超时的情况下从套接字读取数据?我知道,选择,pselect,轮询具有超时字段,但是使用它们会禁用tcp reno堆栈中的“ tcp快速路径”。 我唯一的想法是在循环中使用recv(fd,…,MSG_DONTWAIT) 问题答案: 您可以使用setsockopt函数来设置接收操作的超时: SO_RCVTIMEO 设置超时值,该值指定输入函数完成之前等待的最长时间。它接受一个ti
问题内容: 我正在使用API(,和,和朋友)对远程服务器进行Web服务调用,这在很大程度上取得了很大的成功。 但是,有时会出现问题,并且程序永远卡住。 为了解决这个问题,我想添加一个读取超时。 我发现有几种方法可以实现这一目标,但它们似乎都非常糟糕。 所以我对社区的问题是:使用javax.xml.soap API进行调用时,实现读取超时行为的最佳方法是什么? 问题答案: 您必须创建自己的URLSt
如果主机名是正确的,但没有套接字服务器侦听端口,这行可能会在引发异常前几分钟工作。我可以设置通信超时吗?此外,是否可以停止此进程-目前它不响应AsyncTask.Cancel调用。
问题内容: 所有! 我在LinkedBlockingQueue中发现了奇怪的代码: 谁能解释为什么我们需要局部变量h?它对GC有什么帮助? 问题答案: 为了更好地了解发生了什么,让我们看看执行代码后列表的样子。首先考虑一个初始列表: 然后指向和指向: 然后指向和指向: 现在,实际上我们知道只有一个指向第一个元素的活动引用,它本身就是(),并且我们还知道GC收集的对象不再具有活动引用,所以当方法结束