在Solaris 11 JNI / C套接字连接错误

问题描述 投票:1回答:1

我们的应用程序使用C实现几个套接字连接(到本地主机),与使用JNI / C插座连接的一个连接。他们都呼吁同包括打开插座,所有的成功当我们运行在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");
.
.
.

对于失败的连接桁架输出似乎表明一个EINPROGRESS错误。我们的代码应该以验证这种可能性,但它不会触发如果检查语句,看是否error == EINPROGRESS。它从来没有达到第二fprintf声明。我们已经禁用IPv6的服务器上,因为我们认为也许Java是试图迫使该协议,但这并不有所作为无论是。

完全相同的库和可执行文件将工作在两台服务器上,右,直到JNI插座调用。在Solaris 10点一直持续,但Solaris 11中不会。

谁看过这个吗?请让我知道你需要看看还有什么,我会张贴。提前致谢!

sockets java-native-interface solaris
1个回答
1
投票

该代码错误地假定fprintf()永远不会修改errno

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");

POSIX standard for errno国家(重点煤矿):

errno的值应仅后为它明确规定要被设置的功能的呼叫,直到它被下一个函数调用改变或定义如果应用程序分配一个值。

和每个Solaris 11.3 fprintf() man pagefprintf()可以设置errno

错误

对于在其下qazxsw POI,qazxsw POI,和qazxsw POI将失败,并且可能会失败,指的fputc(3C)或fputwc(3C)的条件。

printf()功能将失败:

EOVERFLOW

n的值大于或INT_MAX保持不包括终止空比INT_MAX更大的输出所需的字节数。

fprintf()的所有形式将失败:

EILSEYA

已经探测到一个宽字符代码不对应于有效的字符。

选择

也有观点不够。

dprintf()功能将失败:

EBADF

snprintf()参数不是一个有效的文件描述符。

printf()dprintf()fildesprintf()功能可以因下层fprintf()失败,如果失败:

EAGAIN

存储空间暂时不可用。

ENOMEM

存储空间不足可用。

© www.soinside.com 2019 - 2024. All rights reserved.