如何在Windows中开发服务器

时间:2012-03-10 14:16:06

标签: c# c++ windows windows-services daemon

我认为这个问题是一个具有强大Linux系统编程背景的人。我在Windows开发方面的经验很少,到目前为止仅限于“控制台应用程序”类型的程序。

开发服务器的规范流程是什么,知道它必须在Windows上运行?

是否有人立即构建 Windows服务应用程序?调试过程真的是as obnoxious as it seems吗? Windows开发人员是否为了调试而开始使用命令行应用程序,并且只将其转换为服务以进行部署?

为了比较,我将提供Linux“服务器”是所选语言的常规命令行程序。我将服务器定义为一个刻板的程序,

  1. 以日志的形式生成大部分人类可读的输出,
  2. 接受来自操作系统的输入(例如网络或文件系统事件),而不是“用户点击按钮”或“用户键入命令”,
  3. 被部署为守护进程。
  4. Windows系统管理员可能希望完全不同的界面来启动,停止和管理服务器。我对此绝对开放;我还没有看到事情的那一面。

    $ ./my-server &
    Starting...
    $ head /var/my-server.log
    2012-3-10 14:34:43.934 [info] Server started! Waiting for connection from client
    $ 
    

2 个答案:

答案 0 :(得分:3)

首先:是的,Windows上的服务器几乎总是优先实现为系统服务。但是,如果服务器也可以从命令行运行以进行故障排除,那么这是一个额外的好处。

构造代码通常不太困难,以便将特定于服务的逻辑抽象为可以检查您是作为服务运行还是在命令行上运行并且相应地运行的函数。我更喜欢只有一个包含main()函数和特定于服务的东西的源模块。为了获得最佳结果,请确保只有此模块知道您正在运行的模式。(另请注意,此模块通常可以从一个项目继承到下一个项目,只需要适度更改。)

这样做的另一个好处是,它意味着您可以在命令行模式下完成大部分调试,而无需多个构建选项。您仍然需要测试(并可能调试)服务逻辑本身,但这是一个小得多的工作。

您可能已经看过一些其他信息here

答案 1 :(得分:2)

在Windows上,服务是

  1. 以发送到事件日志的事件形式生成大部分人类可读输出;
  2. 通过其喜欢响应的任何事件接受来自操作系统的输入,但必须始终响应来自服务控制管理器(SCM)的请求(例如“启动服务”“停止服务”,“暂停服务”, ...)。

    这些事件究竟是如何传递的,取决于您使用的所选编程语言的设施;在C中(即在OS级别),您必须设置一个事件循环并检查收到的事件。通常情况下,您将在事件循环中使用主线程在分离的线程中执行实际工作。

  3. 部署为服务,通常是将自身注册到SCM的控制台可执行文件。

  4. 有关.NET中服务的更多信息,请参阅here;关于这一切在C级如何运作的细节(即没有任何奇特的语言设施),请参阅here