【发布时间】:2020-09-17 09:43:06
【问题描述】:
我正在使用线程在 C 中创建并发服务器/客户端程序。每当客户端连接时,我都会创建一个新线程来处理它。
我的问题是:我希望能够从客户端关闭服务器。例如,使用命令“..”。当我在客户端输入“..”时,我希望服务器立即关闭。
我想过有一个全局变量,它指示服务器是否应该关闭。问题是:当创建线程来处理客户端时,主线程返回到accept(),它无法检查该变量。因此,它只会在新客户端连接时关闭。
关于如何解决这个问题的任何想法?
谢谢!
【问题讨论】:
-
对此我不太确定,但我的出发点是找出套接字上的
shutdown是否会中断正在进行的accept调用。 -
当我使用shutdown() 时,accept() 返回-1,并显示“无效参数”...如何处理这些信息?如果 accept() 返回 -1,我应该只返回 0 吗? @mrksngl
-
我的意思是:当您的任何客户端线程在套接字上调用 shutdown 时,主线程 a) 要么就在
accept内部,它返回EINVAL要么 b) 它会稍后再次调用accept,也会导致EINVAL。因此,在您从接受中获得 EINVAL 后,您可以检查您的停止条件。 -
你能不能只从你的客户端线程中调用你的操作系统“终止进程”、“退出”?你的操作系统,如果不是平凡的,(例如linux,Windows),然后会很高兴地喷出所有其他线程等。
-
所以我读到了
shutdown,修改了我上面的陈述:你不能在未连接的套接字上调用shutdown。这意味着:你可以,但它会失败(ENOTCONN),因为它只适用于连接的套接字。相反,关闭套接字是一个坏主意,因为它会导致竞争条件。请在此处考虑其他 cmets 和答案。