Java套接字在异常后变得不可用

Java套接字在异常后变得不可用,java,sockets,networking,winsock,Java,Sockets,Networking,Winsock,问题 在桌面网络应用程序中,向DatagramSocket发送数据时,有时会出现例外情况: java.net.SocketException: No buffer space available (maximum connections reached?): Datagram send failed 在此异常之后,套接字完全不可用:它不接收任何内容,send()无限期挂起。复制测试是一个简单的应用程序(创建套接字、绑定,而(true)send();) 只有当我的机器进入睡眠模式,然后在“密集数

问题

在桌面网络应用程序中,向DatagramSocket发送数据时,有时会出现例外情况:

java.net.SocketException: No buffer space available (maximum connections reached?): Datagram send failed
在此异常之后,套接字完全不可用:它不接收任何内容,send()无限期挂起。复制测试是一个简单的应用程序(创建套接字、绑定,而(true)send();)

只有当我的机器进入睡眠模式,然后在“密集数据流”中返回时,我才能在Windows上100%地重复这种行为

问题是

  • bsd套接字在发生错误后变得不可用,这种行为正常吗?或者它是一种WSA错误
  • 有没有办法将故障插座“复位”到工作状态,或者重新打开插座是唯一的解决方案
  • 捕获异常后,是否可以将此类情况与常规I/O错误(即可恢复的错误)区分开来
  • 是否有关于何时重新打开应用程序中的套接字的一般指导/建议(我的意思是:网络地址更改、PC睡眠/唤醒和其他事件)

  • 谢谢!:)

    我认为如果从套接字读取或写入导致抛出异常,则可以安全地假设套接字不再可用。在这种情况下,您希望出现什么样的可恢复I/O错误?

    除了SocketTimeoutException之外,任何异常之后套接字都不可用。

    我猜在发送UDP数据报时,某种类型的“端口不可访问”ICMP消息可能会触发异常。。。没有?:)不,我没料到。如果您发送UDP数据报,如果收到数据包,则不会收到确认,如果无法访问接收器地址,则不会收到错误报告。是的,我知道UDP不可靠,但从某些主机/网络中,我收到了此错误。本机代码的BSD套接字API甚至为此类情况定义了错误代码(主机不可访问、网络不可访问)。。。此外,可以在本地主机上检测到错误条件(例如,没有到主机的路由),因此可以报告错误条件。老实说,我不记得来自java套接字的此类错误,但在本机代码中,忽略此类错误或将其作为可恢复的处理是可以的。还有PortUnreachableException,我现在无法检查,但我认为它也会为UDP套接字抛出,文档说:
    表示连接的数据报上收到了ICMP端口不可访问的消息。
    但是我不知道什么是“连接的数据报”(“套接字”字缺失?)。@tuxSlayer正确,谢谢。在发生PortUnreachableeException之后,最好停止发送到该地址,您可以断开套接字并使用它发送到其他地址。。。嘿。。异常仍然发生,但它不会使套接字不再可用。也就是说,它可以被忽略,套接字上的通信可以继续。在这段时间里,我发现我的Win7中有几个大的更新,所以微软的家伙们可能已经在WSA中修复了一些东西。。。