2012-05-21 36 views
4

我的目标是发送一个带有空数据字段的TCP包,以便用远程机器测试套接字。使用Java发送一个零数据TCP/IP包

我正在使用OutputStream类的写入方法(byte [] b)。 我尝试:

outClient = ClientSocket.getOutputStream(); 
outClient.write(("").getBytes()); 

这样做,包从来没有在电线上显示出来。如果“”被替换为“”或任何非零的字符串,它工作正常。

我试过jpcap,它与我一起工作,但没有达到我的目标。 我想过扩展OutputStream类,并实现我自己的OutputStream.write方法。但这超出了我的理解。如果有人已经做过这样的事,请给我建议。

+0

只是为了好奇,你为什么要这么做? –

+1

我正在开发TCP代理,并希望它能够快速检测静默丢弃的连接以清理新连接。所以我认为TCP Keepalive不会达到'快速'的目的。我希望你能帮助! – JoeAngel

+1

嗯,我有一种感觉,你会在这一个小河上。我不得不看看规范,但我敢打赌,没有定义的行为,这不仅意味着Java,而且即使硬件或硬件驱动程序也可能决定不发送“数据包”,因为它在制造商中是空的自由裁量权。 –

回答

3

如果您只想快速检测静默丢弃的连接,则可以使用Socket.setKeepAlive(true)。此方法要求TCP/IP处理心跳探测,而无需任何数据包或应用程序编程。但是,如果您想要更好地控制心跳频率,则应该使用应用程序级数据包实现心跳。

在这里看到更多的细节:http://mindprod.com/jgloss/socket.html#DISCONNECT

+0

是的,我应该实施它。按顺序发送零数据包将需要另一端的ACK,这可以帮助我知道连接是否仍在工作。零数据,因此不需要修改远程主机。 – JoeAngel

+0

您链接的网站是错误信息的臭名昭着的来源,更糟的是他不接受更正。我试过了。例如:“我发现Java的连接连续性测试不足100%可靠”。 Java *根本没有任何连续性测试:*它由操作系统的TCP堆栈完成。我在八年前告诉了他所有这些。 – EJP

-2

有没有这样的事,作为一个空的TCP数据包,因为没有这样的东西作为一个TCP数据包。 TCP是一种字节流协议。如果你发送零字节,没有任何反应。

要检测连接断开,保持活动状态不足,它只能在两小时后帮助您,您必须依赖读取超时和写入例外。

+1

我说零数据包,在问题描述中。有可能发送这样的数据包,我使用一个名为jpcap的特殊软件包。远程主机承认它。那么,为什么你说没有这样的事情? 我想做同样的事情,但使用JDK本身(没有jpcap)。你知不知道怎么? – JoeAngel

+0

@JoeAngel通过写(“”)没有这样的事情。getBytes(),OK?当然,还有SYN,ACK,RST和FIN数据包,以及TCP keepalive通过发送带有错误序列号的ACK参与的诡计。还有一种叫'JPcap'的软件包。坦率地说,我的回答仅限于理智的界限。 – EJP

+0

NB在你的问题中没有关于JPcap的内容,但是有关'write((“”)。getBytes())',这就是我的回答。 – EJP