Эта мини-игра клиент-сервер не перезапустится - PullRequest
0 голосов
/ 13 марта 2020

Мы с другом завершили мини-игру клиент-сервер на языке C для экзамена по расширенному программированию Unix. Мы устанавливаем alarm(), и когда этот парень заканчивает работу, мы фиксируем его с помощью signal(), и мы сделали функцию для чтения такого сигнала и перезапуска сервера. Но что происходит постоянно, так это то, что сервер закрывается, но выдает следующую ошибку: ["bind error in server" : Address already in use].

Мы пытались присвоить ему sleep(), но ошибка продолжает появляться. PS: вся мини-игра работает, даже с 10 клиентами. Вот частичный код:

void restartServerAlarm(int numSegnale){
printf("Riavvio del server in corso...\n");
unlink("localhost");
close(s_fd);

/Deallocamento mutex usati/
deallocaMutexs();

/Deallocamento di tutti i giocatori/
eliminaGiocatori(giocatori,posizioneGiocatori);
//Tutte le altre strutture sono statiche

sleep(10);

execl("./start.sh",0);
perror("Errore nel restarting del server.\n");
exit(EXIT_FAILURE);
}

"Nuova Connessione = Новое соединение" Start. sh - это простой скрипт, содержащий "./server.out"

while (1)
{
    c_fd = malloc(sizeof(int));
    client_len = sizeof(client_addr);
    if ((c_fd = accept(s_fd, (struct sockaddr)&client_addr, &client_len)) < 0)
        perror("accept error nel server \a\n"), exit(1);
    printf("Server: Nuova connessione da [%d] \n", *c_fd);
    pthread_create(&tid, NULL, handle, (void *)c_fd);
    pthread_detach(tid);

    serverLog(inet_ntoa(client_addr.sin_addr));

}

How i start the server right now :
  /*Accensione del server*/
if ((s_fd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
    perror("socket error nel server\a\n"), exit(1);
if (setsockopt(s_fd, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int)) < 0)
error("setsockopt(SO_REUSEADDR) failed");
if (bind(s_fd, (struct sockaddr *)&sa, sizeof(sa)) < 0)
    perror("bind error nel server \a\n"), exit(1);
if (listen(s_fd, 15) < 0) // Il socket si mette in ascolto
    perror("listen error nel server \a\n"), exit(1)

1 Ответ

0 голосов
/ 15 марта 2020

после генерации сокета, необходимо вызвать функцию, чтобы изменить сокет, чтобы его можно было повторно использовать.

предложить что-то похожее на:

if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int)) < 0)
    error("setsockopt(SO_REUSEADDR) failed");
...