Sockets Solaris 11上的JNI/C套接字连接错误

Sockets Solaris 11上的JNI/C套接字连接错误,sockets,java-native-interface,solaris,Sockets,Java Native Interface,Solaris,我们的应用程序使用几个用c实现的套接字连接(到localhost),其中一个连接使用jni/c套接字连接。它们都调用相同的include来打开套接字,当我们在Solaris 10上运行应用程序时,所有这些都是成功的。 迁移到Solaris 11时,我们发现只有c中内置的套接字连接可以工作,而一个jni/c连接不能工作。我添加了输出,以查看究竟发送到connect调用的是什么,并且该调用似乎得到了所需的一切: "sock_connect: socket status: 0, sock_d: 27,

我们的应用程序使用几个用c实现的套接字连接(到localhost),其中一个连接使用jni/c套接字连接。它们都调用相同的include来打开套接字,当我们在Solaris 10上运行应用程序时,所有这些都是成功的。 迁移到Solaris 11时,我们发现只有c中内置的套接字连接可以工作,而一个jni/c连接不能工作。我添加了输出,以查看究竟发送到connect调用的是什么,并且该调用似乎得到了所需的一切:

"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");
.
.
.
“sock\u connect:socket状态:0,sock\u d:27,服务地址:**,大小:16”
对于下面的调用,sock_d=27
serv_addr=(它返回一个好的IP,但我的PM说如果我输入实际的IP,他会杀了我)
sizeof(服务地址)=16
这应该是下面代码段中connect()所需的所有参数。
.
.
.
.
状态=连接(sock_d,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
如果(状态<0){
fprintf(标准,“sock_connect 4:连接后错误号:%i,错误%sn”,错误号,strerror(错误号));
如果(errno==EINPROGRESS){
fprintf(stderr,“sock_connect,errno==EINPROGRESS\n”);
.
.
.
失败连接的Truss输出似乎表明一个
EINPROGRESS
错误。我们的代码应该验证这种可能性,但它不会触发一个if语句来检查
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");
if(状态<0){
fprintf(标准,“sock_connect 4:连接后错误号:%i,错误%sn”,错误号,strerror(错误号));
如果(errno==EINPROGRESS){
fprintf(stderr,“sock_connect,errno==EINPROGRESS\n”);
各国(强调我国):

errno
的值只能在调用明确规定要设置的函数后定义,直到下一次函数调用改变它,或者如果应用程序给它赋值

根据,
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");
错误

对于
printf()
fprintf()
,以及
dprintf()
将失败或可能失败,请参阅fputc(3C)或fputwc(3C)

如果出现以下情况,
snprintf()
函数将失败:

EOVERFLOW

n的值大于INT_MAX或所需的字节数 保持输出(不包括终止null)大于 INT_MAX

如果出现以下情况,所有形式的
printf()
都将失败:

EILSEQ

与有效字符不对应的宽字符代码 已检测到

EINVAL

没有足够的论据

如果出现以下情况,
dprintf()
功能将失败:

EBADF

fildes
参数不是有效的文件描述符

printf()
如果出现以下情况,则可能由于潜在的
malloc(3C)
故障而失败:

EAGAIN

存储空间暂时不可用

ENOMEM

可用存储空间不足


好的,我删除了fprintf语句,但仍然得到了相同的结果。尽管truss输出指示EINPROGRESS错误,它仍然绕过EINPROGRESS错误:
3699/24:so_socket(PF_INET6,SOCK_STREAM,IPPROTO_IP,0,SOV_DEFAULT)=7 3699/2:connect(6,0xFE01F854,16,SOV#U默认值)Err#150 EINPROGRESS 3699/24:getsockname(0,0xB611DAE4,0xB611DB04,SOV#U默认值)Err#95 ENOTSOCK
@user9608801然后是其他问题。但是如果没有一个完整的示例可以用来复制您的问题,就无法判断。问题出现在Solaris 11中而不是您的代码中的几率非常非常低。我会首先寻找一些人做一些愚蠢的事情,比如重新定义
errno
(对系统定义的
errno
宏执行任何操作都会导致未定义的行为…)。您也可以对代码进行预处理,而不是一路编译,只是为了看看是否有一些宏把事情搞砸了。