gpt4 book ai didi

java - 现有 Java 应用程序上的 SO_KEEPALIVE

转载 作者:行者123 更新时间:2023-12-03 11:52:12 27 4
gpt4 key购买 nike

我需要在现有的商业 Java 应用程序上激活 SO_KEEPALIVE,因为我的防火墙在一些不 Activity 后断开了连接。我不拥有源代码,所以我无法更改它(当我拥有源代码时,它会很容易,只需添加 socket.setKeepAlive(true) )。所以我正在寻找一些替代方案:

  • 首先,我尝试使用 libkeepalive.so ( http://libkeepalive.sourceforge.net/ ),将它放入 de LD_PRELOAD 似乎适用于 telnet 和 nc 之类的东西,但是当我将它与 jrockit jvm 一起使用时,这个 LD_PRELOAD 被完全忽略,并且每个套接字对象都是仍在创建没有 SO_KEEPALIVE
  • 然后我尝试在操作系统级别搜索是否有选项可以为所有 TCP 连接默认激活此 SO_KEEPALIVE:不幸的是,在 redhat 6 Enterprise 上没有这样的选项,尽管我找到了一个用于 freebsd (net.inet.tcp .always_keepalive)
  • 修补 linux 内核以添加此功能对我的系统管理员来说是一个很大的问题;)
  • 搜索任何 java 命令行参数都不成功
  • 所以最后一个选项:通过添加 setOption(SocketOptions.SO_KEEPALIVE, Boolean.valueOf(true)) 来修补现有的 JVM 的 java.net.PlainSocketImpl;在 protected 同步 void create(boolean stream) 方法中,并通过 -Xbootclasspath/p
  • 将其放在 rt.jar 之前

    到目前为止,最后一个选项有效,但我有点沮丧,因为我不得不为此更改 JVM!任何人都知道其他/更好的方法来处理这样的问题?为什么没有另一种简单的方法来在所有(java)应用程序上默认激活 SO_KEEPALIVE?

    最后一个问题:为什么 Java API 不允许您在 serverSockets 对象上设置 keepAlive?它只适用于 Socket 对象,但实际上它也适用于 serverSockets

    最佳答案

    我遇到了同样的问题,想知道为什么 libkeepalive 不起作用。经过一番调查,我发现 libkeepalive 有一些“限制”(也许有人会称它们为错误)。
    由于奇怪的许可证(它带有 GPL),我决定重新开始。结果是 libdontdie .
    您可以在那里找到一个与(至少)openjdk7 配合使用的小型 Java 测试程序。

    关于java - 现有 Java 应用程序上的 SO_KEEPALIVE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16127108/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com