【问题标题】:This client-server minigame won't restart itself此客户端-服务器迷你游戏不会自行重启
【发布时间】:2020-06-25 18:48:42
【问题描述】:

我和一个朋友用 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)

【问题讨论】:

  • 关于:execl("./start.sh",0); 我希望这是:execl( "./start.sh", "start.sh", NULL );
  • 既然您希望警报处理代码始终可用,为什么在生成的子代码中没有调用fork(),然后调用execl()

标签: c server client client-server


【解决方案1】:

生成socket后,需要调用函数修改socket,使其可重用。

建议类似于:

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

【讨论】:

  • 不幸的是,这个函数没有起到作用,但还是谢谢!
  • 函数:setsockopt()必须在server.c文件中,紧跟在sock_t sockfd = socket( .... );之后
  • 是的,这就是我更新它的方式,我已经在此处添加了主代码部分。
猜你喜欢
  • 2015-03-24
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
相关资源
最近更新 更多