Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 插座连接超时:规格在哪里?_Java_Sockets_Networking_Tcp - Fatal编程技术网

Java 插座连接超时:规格在哪里?

Java 插座连接超时:规格在哪里?,java,sockets,networking,tcp,Java,Sockets,Networking,Tcp,我工作的背景是我的局域网 下面的代码示例是用Java语言编写的,但我的问题是关于TCP,而不是编程 我经历了以下连接超时: 建立连接时为2毫秒 主机处于活动状态但未侦听指定的套接字端口时为1 005毫秒 主机关闭时为21 000毫秒 这个值来自对我的网络的观察,但我认为它存在一个RFC 以下是有关超时的一些信息: 和TCP\u无延迟 你能给我更多的建议吗 @Override public void run() { for( int port = _portFirst; port

我工作的背景是我的局域网

下面的代码示例是用Java语言编写的,但我的问题是关于TCP,而不是编程

我经历了以下连接超时:

  • 建立连接时为2毫秒
  • 主机处于活动状态但未侦听指定的套接字端口时为1 005毫秒
  • 主机关闭时为21 000毫秒
这个值来自对我的网络的观察,但我认为它存在一个RFC

以下是有关超时的一些信息:

  • 和TCP\u无延迟
你能给我更多的建议吗

@Override
public void run() {
   for( int port = _portFirst; port < _portLast; ++port ) {
      String  host    = "192.168.1." + _address;
      boolean success = false;
      long    before  = System.currentTimeMillis();
      try {
         Socket        socket   = new Socket();
         SocketAddress endpoint = new InetSocketAddress( host, port );
         socket.connect( endpoint, 0 );
         success = true;
         socket.close();
      }// try
      catch( ConnectException c ){/**/}
      catch( Throwable t ){
         t.printStackTrace();
      }
      long duration = System.currentTimeMillis() - before;
      System.err.println( host + ":" + port + " = " + duration );
      _listener.hostPinged( host, port, success, duration );
   }
}
@覆盖
公开募捐{
用于(int端口=_portFirst;端口<_portLast;++port){
字符串host=“192.168.1”。+\u地址;
布尔成功=假;
很久以前=System.currentTimeMillis();
试一试{
套接字=新套接字();
SocketAddress端点=新的InetSocketAddress(主机、端口);
socket.connect(端点,0);
成功=真实;
socket.close();
}//试一试
catch(连接异常c){/**/}
捕获(可丢弃的t){
t、 printStackTrace();
}
长持续时间=System.currentTimeMillis()-之前;
System.err.println(主机+“:“+端口+”=“+持续时间);
_hostPinged(主机、端口、成功、持续时间);
}
}

正如您所发现的,您可以在
连接(…)
方法调用中指定超时,如下所示:

connect( SocketAddress endpoint , int timeout )
请记住(其中“无限”通常真正的意思是“使用操作系统默认设置”)


至于默认值,它们依赖于操作系统,但通常是相当一致的。如果您使用的是linux设备,请查看
/proc/sys/net/ipv4/tcp\u keepalive*
(但除非您知道自己在做什么,否则不要更改它们:-)


干杯,

连接超时没有RFC。任何RFC或其他文件都不可能事先知道任何网络中的普遍情况

一般来说,你可以期待一个成功的连接是非常迅速的;一个
econRefused
ConnectException:连接被拒绝
)的速度也差不多;以及连接超时(
ConnectException:connecttimeout
)所需的时间,取决于原因、两端的平台以及介入网络的性质。在Windows中,我相信连接超时包括三次连接尝试的总时间,分别为6秒、12秒和24秒,总时间为42秒;在不同的Unix中,我相信总数更像是70秒,这可能是由于3次尝试超时10秒、20秒和40秒造成的。正如你所看到的,它在平台上。还有一个问题是,在Windows服务器上填充backlog队列将导致向传入的SYN发出RST,而在Unix/Linux服务器上,它将根本不会对传入的SYN作出响应

您还应该注意,在Java中,与多年的Javadoc相反:

  • 零连接超时并不意味着无限超时,它意味着平台默认超时,如上所示,该超时不超过约70秒

  • 不能指定增加平台默认值的连接超时;您只能使用它来减少平台默认值


  • 这些超时是由你的操作系统控制的,你有哪些操作系统/版本?BTW端口扫描可以很容易地用现有的工具来完成,比如“代码> NMAP < /代码>。如果你可以的话,我会考虑使用它。谢谢,我知道NMAP,但是我的目标是获取基本的知识,不管JavaDoc,连接超时为零实际上不是“解释为无限超时”。试试看。
    /proc/sys/net/ipv4/tcp_keepalive*
    与连接超时无关。我个人现在遇到了一个问题,尽管在连接调用中设置了很长的超时,但我仍然收到超时。它不尊重我假设的值,因为它比我指定的超时更早到达超时?“这怎么可能呢?”我想知道我的答案。当你发布那个评论时,它已经存在了六年了。但有时RFC中会指定超时。。。所以这不是“不可能的”@Aubin对于RFC来说指定超时也不是不可能的,但是我并没有说它是不可能的。如果我想实现tcp长轮询技术呢。我能不能超过这个最大系统超时时间?@tobi你的问题在措辞上体现了矛盾。没有。@EJP ok。所以我想如果我的长轮询等待最多60秒左右,我是安全的。