当尝试在vxWorks系统上运行的VM中创建连接套接字时,我会间歇性地抛出相当奇怪的SocketException。我无法隔离导致异常发生的原因。在不修改任何外部因素的情况下,成功连接似乎是随机的。
这是堆栈跟踪的顶部(从它进入java.net的位置):
(0000069317) java.net.SocketException: errno2: 68, error: errno = 0x44 for fd: 38 (0000069323) at java.net.PlainSocketImpl.socketConnect(Native Method) (0000069326) at java.net.PlainSocketImpl.doConnect(Unknown Source) (0000069329) at java.net.PlainSocketImpl.connectToAddress(Unknown Source) (0000069366) at java.net.PlainSocketImpl.connect(Unknown Source) (0000069372) at java.net.Socket.connect(Unknown Source)
抛出异常的块如下:
socket = new Socket();
socket.connect(addr, CONNECT_TIMEOUT);
其中addr
是java.net.SocketAddress。
任何人都可以提供一些有关errno 0x44的信息吗?
答案 0 :(得分:1)
vxWorks具有与Unix系统不同的errno代码编号。
在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。