日期:2014-05-16  浏览次数:20719 次

HP主机上“Address already in use”问题
我的socket通讯程序,在sco unix和aix均正常,但是放到hp主机上后,发现经常出现“Address already in use”的问题,对于setsockopt的参数reuse我已经设置,但就是还会在某些特殊情况下重启后台服务端时报错“Address already in use”,上来请教一下。服务端创建sock的程序段如下:
  ……
  sock = socket( AF_INET, SOCK_STREAM, 0 );
  if( sock < 0 ){
  writeLog("Create socket error[%s]!", strerror(errno));
  return( -1 );
  }

  on = 1;
  if( setsockopt( sock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof( int ) ) < 0 ){
  writeLog( "setsockopt SO_REUSEADDR error[%s]!", strerror(errno) );
  return( -1 );
  }
  ling.l_onoff=1;
  ling.l_linger=0;
  if( setsockopt(sock,SOL_SOCKET,SO_LINGER,&ling,sizeof(ling))<0 )
  {
  writeLog( "setsockopt SO_LINGER error[%s]!", strerror(errno) );
  close( sock );
  return( -1 );
  }
  memset( &localaddr, 0, sizeof( localaddr ) );

  localaddr.sin_family = AF_INET;
  localaddr.sin_addr.s_addr = htonl( INADDR_ANY );
  localaddr.sin_port = htons( port );

  if( bind( sock, (struct sockaddr *)&localaddr, sizeof( struct sockaddr_in )
) < 0 ){
  writeLog("Can't bind local address[%s]!", strerror(errno) );
  return( -1 );
  }

  ……

  不知道是否是因为HP上特殊,有什么需要调整的地方?理论上应该不会这样才对。

  另外一个状况:在HP的开发机上,一般是偶尔会有这种重启时的报错!但是,在我的生产环境,由于主机是双机热备,启动了MC双机软件,在这种机器环境下,每次我要重启服务,都会报错“Address already in use”,只能每次停下MC,然后再重启MC,再启动应用才能正常使用

  知道坛子里有很多高人,希望能够得到指点,谢谢!
 
  我的联系方式:3038178@qq.com


------解决方案--------------------
setsockopt( sock,SOL_SOCKET,SO_REUSEADDR,&on,sizeof( int ) 

SOL_SOCKET 貌似应该指明为 TCP 协议吧...
------解决方案--------------------
探讨
setsockopt( sock,TCP,SO_REUSEADDR,&on,sizeof( int )?

------解决方案--------------------
我这里没有HP的server,只有Solaris的,所以爱莫能助哦

个人观点,还是建议楼主自己看一下HP的man,是不是有特殊要求,不要这样人云亦云...