eseguendo questo codice praticamente non si chiude la socket e quando vado a far ripartire il server, mi da errore e scrive Bind Fallita : Address already in use
ma perchè? prima di mandare il segnale chiudo la socket eppure mi da errore...
qualcuno sa perchè?
codice:
codice:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <ctype.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#define MAXLENGTH 80
#define SERVERPORT 1313

void minuscolatore (int in,int out,pid_t p,int s){
    char inputline[MAXLENGTH];
    int len,i;
    while((len=recv(in,inputline,MAXLENGTH,0))>0){
        for(i=0;i<len;i++){
            inputline[i]=tolower(inputline[i]);
        }
        send(out,inputline,len,0);
        if(inputline[0]=='f' && inputline[1]=='i' && inputline[2]=='n' && inputline[3]=='e'){
            close(s);
            if(close(s)==-1){
                perror("close fallita");
                exit(-1);
            }
            kill(p,SIGKILL);
        }
    }
}
void maiuscolatore(int in,int out,pid_t p,int s){
    char inputline[MAXLENGTH];
    int len,i;
    while((len=recv(in,inputline,MAXLENGTH,0))>0){
        for(i=0;i<len;i++){
            inputline[i]=toupper(inputline[i]);
        }
        send(out,inputline,len,0);
        if(inputline[0]=='F' && inputline[1]=='I' && inputline[2]=='N' && inputline[3]=='E'){
            close(s);
            kill(p,SIGKILL);
        }        
    }
}
int main(){
    int sock,client_len,fd;
    char c;
    struct sockaddr_in client, server = {AF_INET,htons(SERVERPORT),INADDR_ANY};
    if((sock=socket(AF_INET,SOCK_STREAM,0))==-1){
        perror("Socket fallita");
        exit(1);
    }
    if(bind(sock,(struct sockaddr *)&server,sizeof server)==-1){
        perror("Bind fallita");
        exit(2);
    }
    listen(sock,5);
    while(1){
        client_len=sizeof(client);
        if((fd=accept(sock,(struct sockaddr *)&client,&client_len))<0){
            perror("accept fallita");
            exit(3);
        }
        if (recv(fd,&c,1,0)==-1){
            perror("recv server fallita");
            exit(4);
        }
        if (c=='+'){
        switch(fork()){
            case -1:
                perror("Fork fallita");
                exit(4);
            case 0:
                printf("Aperta connessione\n");
                maiuscolatore(fd,fd,getppid(),sock);
                printf("Chiusa connessione\n");
        }
    }
        else if (c=='-'){
        switch(fork()){
            case -1:
                perror("Fork fallita");
                exit(4);
            case 0:
                printf("Aperta connessione\n");
                minuscolatore(fd,fd,getppid(),sock);
                printf("Chiusa connessione\n");
                fflush(stdout);
        }   
        }
        close(fd);
    }
}