关闭并发服务器套接字(TCP)

问题描述 投票:0回答:1

我正在使用线程在C中编写并发服务器/客户端程序。每当客户端连接时,我都会创建一个新线程来处理它。

我的问题是:我希望能够从客户端关闭服务器。以命令“ ..”为例。在客户端中输入“ ..”时,我希望服务器立即关闭。

我考虑过要使用一个全局变量,该变量指示服务器是否应该关闭。问题是:创建线程以处理客户端时,主线程返回到accept(),并且它无法检查该变量。因此,它将仅在有新客户端连接时关闭。

关于如何解决此问题的任何想法?

谢谢!

c sockets server client
1个回答
0
投票

正如我在评论中已经提到的,我不确定这是否始终有效,即是否可以保证accept可以处理已经为shutdown的套接字。

int stop = 0;

void mainloop() {
  while (!stop) {
    int ret = accept(fd, ...);
    if (ret < 0) {
      if (errno == EINVAL && stop)
        break;
      /* here: handle other errors */
    } else {
      accept_connection(ret);
    }
  }
  /* here: stop condition is triggered -> cleanup and do whatever you wanted to do */
}

void doStop() {
  stop = 1; 
  shutdown(fd, SHUT_RDWR);
}

您肯定要在清理中使用close套接字-但还要确保此后没有其他客户端调用shutdown:在关闭后,相同的描述符可以用于其他套接字或文件。还要注意,我在stop上没有考虑任何同步方面。

© www.soinside.com 2019 - 2024. All rights reserved.