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

求教:socket初始化在bind时,出现adress already in use?
socket初始化在bind时,出现adress   already   in   use.请问如何修改?
我用虚拟机下的红帽9GCC   编译运行的,用netstat查处于TIMEWAIT状态,执行多次也bind不上,不知道时什么原因?求教!


static   int
initialize_listen_socket(   usockaddr*   usaP,   int   port)
{
        int   listen_fd;
        int   i;

        memset(   usaP,   0,   sizeof(usockaddr)   );
        usaP-> sa.sa_family   =   AF_INET;        
        usaP-> sa_in.sin_addr.s_addr   =   htonl(   INADDR_ANY   );
        usaP-> sa_in.sin_port   =   htons(   port   );    

        listen_fd   =   socket(   usaP-> sa.sa_family,   SOCK_STREAM,   0   );  
        if   (   listen_fd   <   0   ){
perror(   "alarm:   socket "   );
return   -1;
        }
   
        (void)   fcntl(   listen_fd,   F_SETFD,   1   );    
        i   =   1;
        if   (   setsockopt(   listen_fd,SOL_SOCKET,   SO_REUSEADDR,   (char*)   &i,   sizeof(i)   )   <   0   )    
        {
perror(   "alarm:   setsockopt "   );
return   -1;
        }
 
        if   (   bind(   listen_fd,   &usaP-> sa,   sizeof(struct   sockaddr_in)   )   <   0   )    
        {
perror(   "alarm:   bind "   );
return   -1;
        }
   
        if   (   listen(   listen_fd,   1024   )   <   0   )    
        {
perror(   "alarm:   listen "   );
return   -1;
        }

        return   listen_fd;
}

------解决方案--------------------
照理说设置了端口复用就可以了。你可以试一下其他系统,看看是否rh9的原因。
------解决方案--------------------
1.首先,运行ps -aux |grep lsnr ,看一下是否有进程占用
2.有的话kill掉,就可以了
------解决方案--------------------
lsof -i:22或者netstat -an|grep 22察看