为什么FTPserver主动模式 bind失败引起的进程无法掉exit

我在自写的一个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"?