我创建了一个UDP服务器类,我的程序创建了一个进程(在后台运行)。它是一个命令行实用程序,因此运行'udpserver.exe start'会绑定套接字并在recvfrom()
循环内开始阻塞for(;;)
调用。
安全和'优雅'停止服务器的最佳方法是什么?
我在考虑'udpserver.exe stop'会发送一个udp msg,例如'stop',来自'udpserver.exe start'的正在进行的进程会识别这个msg,从循环中断,并清理(closesocket / wsacleanup)。
另外,刚刚杀死这个过程不是一个好主意吗?
答案 0 :(得分:0)
为什么要将UDP服务器作为外部进程而不是作为主程序内的工作线程运行?这将使管理服务器变得更加容易。简单地关闭套接字,它将中止被阻塞的recvfrom()
,从而允许线程自行终止。
但是如果你必须在外部进程中运行UDP服务器,我个人就是要快速而简单地杀死这个进程。但如果你真的希望优雅,你可以通过SetConsoleCtrlHandler()
使服务器程序处理 CTRL-BREAK ,这样它就知道何时需要关闭它套接字,停止recvfrom()
。然后,您可以让主程序通过CreateProcess()
使用CREATE_NEW_PROCESS_GROUP
标志生成服务器程序,以获取组ID,然后可以使用该组ID将 CTRL-BREAK 发送到服务器在需要时通过GenerateConsoleCtrlEvent()
处理。