关闭接收请求的UDP服务器

时间:2014-10-23 20:20:08

标签: windows visual-c++ winsock

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

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

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

另外,刚刚杀死这个过程不是一个好主意吗?

1 个答案:

答案 0 :(得分:0)

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

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