Como destruir completamente uma conexão de soquete em C

Eu fiz um cliente de chat no linux usando socket, e eu desejo destruir a conexão completamente. A seguir estão as partes relevantes do código:

int sock, connected, bytes_recieved , true = 1, pid;  
char send_data [1024] , recv_data[1024];     
struct sockaddr_in server_addr,client_addr;    
int sin_size;
label:
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
    perror("Socket");
    exit(1);
}
if (setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,&true,sizeof(int)) == -1)
{
    perror("Setsockopt");
    exit(1);
}
server_addr.sin_family = AF_INET;         
server_addr.sin_port = htons(3128);     
server_addr.sin_addr.s_addr = INADDR_ANY; 
bzero(&(server_addr.sin_zero),8); 
if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr))== -1)
{
    perror("Unable to bind");
    exit(1);
}
if (listen(sock, 5) == -1)
{
    perror("Listen");
    exit(1);
}
printf("\nTCPServer Waiting for client on port 3128");
fflush(stdout);
connected = accept(sock, (struct sockaddr *)&client_addr,&sin_size);
//necessary code
close(sock);
goto label;

mas o fechamento (meia) não parece fechar o destruir a conexão completamente, porque depois de ir 'rotular' o código está saindo mostrando a mensagem de erro

Unable to bind: Address already in use

Essa é a conexão não está acontecendo novamente. Qual pode ser o problema? Desde já, obrigado.

EDIT: O que eu realmente quero é, quando eu executar o script desde o início depois de destruir a conexão, ele deve ser executado como um novo programa. Como eu posso fazer isso?

questionAnswers(5)

yourAnswerToTheQuestion