Ho creato un client di chat in linux tramite socket e desidero distruggere completamente la connessione. Segue le porzioni rilevanti del codice:Come distruggere completamente una connessione socket in C
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;
ma la stretta (calza) doesnot sembrano per chiudere il distruggere completamente la connessione, perché dopo andando a 'etichetta' il codice sta uscendo con il messaggio di errore
Unable to bind: Address already in use
Questa è la connessione non sta accadendo di nuovo. Quale può essere il problema? Grazie in anticipo.
MODIFICA: Quello che voglio veramente è che, quando eseguo lo script dall'inizio dopo aver distrutto la connessione, dovrebbe funzionare come un nuovo programma. Come posso farlo?
Perché lo stai facendo? Dovresti tornare indietro prima di 'accept', non ricreare il socket del server. – Mat
Perché vuoi chiudere e riaprire il socket di ascolto invece di andare in giro per 'accept()'? – dwalter
possibile duplicato di [Qual è il significato di SO_REUSEADDR (opzione setsockopt) - Linux?] (Http://stackoverflow.com/questions/3229860/what-is-the-meaning-of-so-reuseaddr-setsockopt-option- linux) –