我们的应用程序使用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中不会。
谁看过这个吗?请让我知道你需要看看还有什么,我会张贴。提前致谢!
该代码错误地假定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 page,fprintf()
可以设置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()
,fildes
和printf()
功能可以因下层fprintf()
失败,如果失败:EAGAIN
存储空间暂时不可用。
ENOMEM
存储空间不足可用。