【问题标题】:Shut down a UDP Server receiving requests关闭接收请求的 UDP 服务器
【发布时间】:2014-10-23 20:20:08
【问题描述】:

我创建了一个 UDP 服务器类,我的程序创建了一个进程(在后台运行)。它是一个命令行实用程序,因此运行“udpserver.exe start”将绑定套接字并在for(;;) 循环内开始阻塞recvfrom() 调用。

安全和“优雅地”停止服务器的最佳方法是什么?

我在想“udpserver.exe stop”会发送一个 udp msg,例如“stop”,而来自“udpserver.exe start”的正在进行的进程会识别这个 msg,从循环中中断并清理(closesocket/ wsacleanup)。

另外,杀死进程不是一个好主意吗?

【问题讨论】:

    标签: windows visual-c++ winsock


    【解决方案1】:

    为什么将 UDP 服务器作为外部进程而不是作为主程序内部的工作线程运行?这将使管理服务器变得容易得多。简单地关闭套接字,这将中止阻塞的recvfrom(),从而允许线程自行终止。

    但是,如果您必须在外部进程中运行 UDP 服务器,我个人会直接终止该进程,快速而简单。但是如果你真的想对它优雅,你可以让服务器程序通过SetConsoleCtrlHandler()处理CTRL-BREAK,这样它就知道什么时候需要关闭它的套接字,停止recvfrom()。然后您可以让主程序通过CreateProcess() 使用CREATE_NEW_PROCESS_GROUP 标志生成服务器程序,以获取组ID,然后可以使用该组ID 通过@987654323 将CTRL-BREAK 发送到服务器进程@ 需要时。

    【讨论】:

    • 我正在将我的工作集成到启动外部进程的现有程序中(很确定它是CreateProcess()。实际上我确实创建了一个工作线程来执行recvfrom() if 'udpserver.exe start' 正在运行。如果进程已经在运行,closesocket() 将如何识别/知道要关闭哪个/哪里的套接字?
    • 如果您将套接字放入自己的进程中,那么该进程必须是关闭它为自己创建的套接字的进程。因此我建议将 CTRL-C 发送到进程,以便它知道何时关闭其套接字。
    • 我最终创建了一个 CloseServer() 函数,它向服务器发送消息,服务器识别消息并进行清理。你觉得这样也行吗?
    • 通过这样做,您将打开服务器以被您的 UDP 客户端关闭。那是你真正想要的吗?您最好的选择是根本不使用单独的过程。否则,至少考虑另一种关闭信号,例如通过CreateEvent() 命名的事件对象。当主程序使用SetEvent() 发出事件信号时,您的服务器可以等待事件并关闭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多