2

当尝试在 vxWorks 系统上运行的 VM 中创建连接套接字时,我会间歇性地抛出一个相当奇怪的 SocketException。我无法隔离导致异常发生的原因。在不修改任何外部因素的情况下,成功的连接似乎是随机的。

这是堆栈跟踪的顶部(从它进入 java.net 的位置):

(0000069317) java.net.SocketException: errno2: 68, 错误: errno = 0x44 for fd: 38
(0000069323) 在 java.net.PlainSocketImpl.socketConnect(Native Method)
(0000069326)在 java.net.PlainSocketImpl.doConnect(未知来源)
(0000069329)在 java.net.PlainSocketImpl.connectToAddress(未知来源)
(0000069366)在 java.net.PlainSocketImpl.connect(未知来源)
(0000069372)在 java.net.Socket.connect(未知来源)

抛出异常的块如下:

socket = new Socket();
socket.connect(addr, CONNECT_TIMEOUT);

addrjava.net.SocketAddress在哪里。

谁能提供一些关于 errno 0x44 是什么的见解?

4

1 回答 1

1

vxWorks 的 errno 代码编号与 Unix 系统不同。

在 vxWorks 中,errno 0x44 (68) 是 EINPROGRESS。

EINPROGRESS 可以由以下例程设置:aio_read()、aio_return()、aio_write()

EINPROGRESS 通常不会出错。使用异步 IO,它只是表明某事已开始,但尚未完成。

也许 Java 将 68 错误地转换为 EADV。

尝试使用:

socket.connect(addr);

代替

socket.connect(addr, CONNECT_TIMEOUT);

也许这足以避免 AIO 和 EINPROGRESS。

于 2012-05-18T07:30:43.033 回答