2012-03-30 26 views
2

我們已經使用套接字與TCP Java應用程序永葆啓用插座永葆沒有工作在Linux上

socket的(真) http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#setKeepAlive(boolean

我們的測試表明,保持活動的功能是否正常工作在Windows主機上,但不在Linux主機上(Ubuntu Lucid)。

在我們挖掘發現,在Java中使用的SO_KEEPALIVE數值常數似乎並沒有在Linux

使用Java中的常數匹配:JDK/src目錄/股/班/ JAVA /網/ SocketOptions.java:

public final static int SO_KEEPALIVE = 0x0008; 

在Solaris中:包括/ SYS/socket.h中

#define SO_KEEPALIVE 0x0008  /* keep connections alive */ 

在Linux中的Sparc,MIPS,Alpha和PARISC:/usr/src//linux-headers-2.6.32-19/arch/SPARC /包括/ ASM /插座。 H:

#define SO_KEEPALIVE 0x0008 

在其他Linux(x86和AMD64):/usr/include/asm-generic/socket.h:

\#define SO_KEEPALIVE 9 

我們認爲,這可以解釋爲什麼永葆不工作在Linux上。任何人都可以提出其他原因或解決方案?

乾杯 馬克

+1

SocketOption值無關緊要,它被映射到本地代碼中特定於平臺的值。 – jtahlborn 2012-03-30 13:51:36

+1

你嘗試過什麼不同的主機/客戶端配置?保持活動的超時時間因平臺而異。這可能是因爲linux主機的超時時間較長,並且客戶端計算機正在終止連接,因爲它認爲連接已經死亡。 – Dunes 2012-03-30 14:17:23

回答

3

(我知道這更像是一個評論,但我沒有足夠的信譽來添加一個。請不要往下投我請。)

我建議你可以在Linux上使用「netstat -anpo」來檢查Keepalive Timer是否確實爲您的連接打開。如果啓用,它將在「計時器」列中顯示「保持活動」。否則它會「關閉」。