我在自写的一个FTP服务器程序时,使用主动模式,利用bind绑定到20端口号对客户端发起连接,没有设置端口复用,在频繁的数据传输,还没等20端口的挥手释放完成后,继续bind20端口时,此时控制台打印出端口被占用,按理说是,已经退出调用bind的函数了(我这里使用判断bind == -1,exit(-1) 掉传输数据的进程。),但是系统还是会使用一个未被占用的高位端口对客户端发起连接,并且进行数据传输。
int connect_client(int clt2,Message* msg)
{
int rst=0;
char tbuf[BUF_SIZE];
struct sockaddr_in client;
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(20);
server.sin_addr.s_addr = inet_addr(SEVER_IPADS);
client.sin_family = AF_INET;
client.sin_port = htons(msg->port_info[4]*256+msg->port_info[5]);
int opt =1;
//setsockopt(clt2,SOL_SOCKET,SO_REUSEADDR,(const void*)&opt,sizeof(opt));
if(bind(clt2,(struct sockaddr*)&server,sizeof(struct sockaddr_in))<0)
{
perror("bind failed");
exit(-1);
}
printf("CONNER PORT IS %d\n",msg->port_info[4]*256+msg->port_info[5]);
bzero(tbuf,BUF_SIZE);
snprintf(tbuf,BUF_SIZE,"%d.%d.%d.%d",msg->port_info[0],msg->port_info[1],msg->port_info[2],msg->port_info[3]);
client.sin_addr.s_addr = inet_addr(tbuf);
if(connect(clt2,(struct sockaddr*)&client,sizeof(struct sockaddr_in))==-1)
{
printf("connect is failed \n");
exit(-1);
}
return 0;
}
并没有退出进程,而是继续执行。
这里我设置端口复用可以解决问题了,但是还是想知道为什么系统不会马上exit进程
按你的描述bind没有绑定失败自然不会退出了.是否有打印"bind failed"?