2013-10-14 40 views
1

我已经与 DatagramChannel有些疑惑。当套接字被绑定并且接收方法在后台以阻塞模式运行时,我刚刚做了一个拔掉电缆的快速测试。即使我写入这个套接字,也没有抛出异常。
再次插入电缆后,一切都看起来很好 - 插座仍然绑定。
试验后提出了一些问题:

1)如果有必要重新绑定插座? (一些系统或网络事件的场景)
2)网络不可达时会抛出异常吗? (当我写这是不可达接口开往插座,将包中的高速缓存缓冲和等待界面将上升)
3)当套接字通道可通过系统关闭?处理不寻常的网络事件

在此先感谢。你是否知道任何与这类话题有关的书(低级细节)?

回答

1

这在某种程度上是独立的。当电缆断开时,操作系统可能检测到介质发生故障并使所有插座无效,但此处未发生此处。对于一个类似于UDP的协议,它甚至可能不是真正有效的。

即使在写入此套接字时也没有抛出异常。

即使您通过UDP写入连接到黑洞的套接字,您也不在乎。只要发送缓冲区中有空间并且要发送的数据包有效(如大小,寻址),即使路由器被路由器损坏或丢失,也不会有错误。在这里,它刚刚丢失,非常接近原点。

2)网络无法访问时会抛出异常吗? (当我写入一个绑定在无法访问的接口上的套接字时,数据包将被缓存在缓存中并等待接口启动)

一般来说,只是发送数据包而不考虑它在丢失之前会走多远。

3)当用于套接字通道可以通过系统被关闭?

时,它不是一个无连接协议。如果这是TCP,你会发现缺少keepalive数据包和一般通信中断,通道将被打破。

+1

一旦你打开一个连接,我相信它保持打开,直到你自己关闭它,尽管有一个断开的电缆。路由器可能会尝试重新发送它几次,但它可能只是丢弃数据包。 – aglassman

+0

@aglassman如果电缆在机器上拔出,则不会有路由器,只有IP堆栈。 – hexafraction

0

1)如果有必要重新绑定插座? (某些情况下与系统或网络事件)

你不能重新绑定一个插座。

2)网络无法访问时会抛出异常吗?

你不会得到一个例外发送UDP数据报,除非套接字连接到目的地时,你可以得到“无法访问”错误。

(当我写这是不可达接口开往插座,将包在缓存中缓冲,等待界面将上升)

3)何时可以通过系统关闭套接字通道?

从来没有。你必须自己关闭它。

您是否知道与此类主题(低级详细信息)相关的任何书?

对于这种细节,你会去到Oracle,理查德·史蒂文斯,TCP/IP详解,卷I和II。