【问题标题】:Closing concurrent server socket (TCP)关闭并发服务器套接字 (TCP)
【发布时间】: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 和答案。

标签: c sockets server client


【解决方案1】:

使用select()(e)poll() 或等效项等待客户端连接,然后再调用accept() 接受连接。这些函数允许您指定超时,这将允许您停止定期等待以检查其他条件,例如关闭请求。在某些平台上,您甚至可以让这些函数不仅在侦听套接字上等待,而且还可以在您为自己私人创建的单独管道上等待,当您想“唤醒”您的等待循环做某事时,只需将一个字节写入该管道,当循环检测到该字节到达时,它可以相应地采取行动。

【讨论】:

  • 感谢您的信息!我不知道这些电话的存在。我使用信号解决了我的问题,但我也会尝试实施此解决方案。
猜你喜欢
  • 2017-03-06
  • 1970-01-01
  • 2015-01-09
  • 2015-01-21
  • 2014-01-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多