求教: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察看