我和一个朋友用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)
生成套接字后,需要调用函数来修改套接字,以便可重用。
建议类似以下内容:
if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &(int){1}, sizeof(int)) < 0)
error("setsockopt(SO_REUSEADDR) failed");