我正在使用线程在C中编写并发服务器/客户端程序。每当客户端连接时,我都会创建一个新线程来处理它。
我的问题是:我希望能够从客户端关闭服务器。以命令“ ..”为例。在客户端中输入“ ..”时,我希望服务器立即关闭。
我考虑过要使用一个全局变量,该变量指示服务器是否应该关闭。问题是:创建线程以处理客户端时,主线程返回到accept(),并且它无法检查该变量。因此,它将仅在有新客户端连接时关闭。
关于如何解决此问题的任何想法?
谢谢!
正如我在评论中已经提到的,我不确定这是否始终有效,即是否可以保证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
上没有考虑任何同步方面。