【发布时间】:2018-04-06 22:08:06
【问题描述】:
我们的应用程序使用了几个用 c 实现的套接字连接(到 localhost),其中一个连接使用 jni/c 套接字连接。它们都调用相同的 include 来打开套接字,当我们在 Solaris 10 上运行应用程序时,它们都成功了。 迁移到 Solaris 11,我们发现只有 c 中内置的套接字连接有效,一个 jni/c 连接不起作用。我添加了输出以查看究竟是什么被发送到连接调用,看起来调用正在获得它需要的一切:
"sock_connect: socket status: 0, sock_d: 27, serv_addr: ***.***.***.***, sizeof: 16"
So for the call below, sock_d = 27
serv_addr = (it returns a good IP, but my PM said he'd kill me if I put the actual IP)
sizeof(serv_addr) = 16
which should be all the parameters connect() needs in the code snippet below.
.
.
.
.
status = connect(sock_d, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
if (status < 0){
fprintf(stderr, "sock_connect 4: after connect errno: %i, error %sn", errno, strerror(errno));
if (errno == EINPROGRESS){
fprintf(stderr, "sock_connect, errno == EINPROGRESS\n");
.
.
.
连接失败的Truss 输出似乎表明EINPROGRESS 错误。我们的代码应该验证这种可能性,但它不会触发 if 语句来检查 error == EINPROGRESS 是否存在。它永远不会到达第二个fprintf 语句。我们已经在服务器上禁用了 IPv6,因为我们认为 java 可能试图强制使用此协议,但这也没有什么不同。
完全相同的库和可执行文件将在两台服务器上运行,直到进行 jni 套接字调用。从那时起,Solaris 10 继续运行,但 Solaris 11 不会。
有人见过这个吗?请让我知道您还需要看什么,我会发布它。提前致谢!
【问题讨论】:
标签: sockets java-native-interface solaris