【问题标题】:How to develop a server in Windows如何在 Windows 中开发服务器
【发布时间】:2012-03-10 14:16:06
【问题描述】:

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

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

是否立即构建 Windows 服务 应用程序?调试过程真的是as obnoxious as it seems吗? Windows 开发人员是否从 命令行应用程序 开始以进行调试,然后仅将其转换为服务以进行部署?

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

  1. 以日志的形式生成大部分人类可读的输出,
  2. 接受来自操作系统的输入(例如网络或文件系统事件),而不是“用户单击按钮”或“用户键入命令”,并且
  3. 被部署为守护进程。

Windows 系统管理员可能希望启动、停止和管理服务器的界面完全不同。我对此完全持开放态度;我只是还没有看到事情的全部方面。

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

【问题讨论】:

  • 我原来的问题很清楚地说是“服务器”,而不是“Windows 服务”。这是故意的,因为我不知道我是否想要 Windows 服务。因此,我已恢复编辑。

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


【解决方案1】:

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

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

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

您可能已经看到了一些附加信息here

【讨论】:

    【解决方案2】:

    在 Windows 上,服务是这样的东西

    1. 以发送到事件日志的事件形式产生大部分人类可读的输出;

    2. 通过它喜欢响应的任何事件接受来自操作系统的输入,但必须始终响应来自服务控制管理器 (SCM) 的请求(例如“启动服务”、“停止服务”、“暂停服务”…… )。

      这些事件的具体传递方式取决于您使用的所选编程语言的功能;在 C 中(即在操作系统级别),您必须设置一个事件循环并检查接收到的事件。通常,您将在单独的线程中执行实际工作,主线程位于事件循环中。

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

    有关 .NET 中服务的更多信息,请参阅here;有关这一切如何在 C 级别工作(即没有任何花哨的语言工具)的详细信息,请参阅here

    【讨论】:

    • 开发+调试过程呢? “安装、启动、附加到进程”似乎是开发一些似乎符合要求的东西的大量开销。
    • 似乎别无选择(尽管您可以通过将安装服务定义为自定义构建操作并将调试器设置为默认附加到进程而不是尝试启动它来简化您的工作)。跨度>
    猜你喜欢
    • 1970-01-01
    • 2010-12-05
    • 2010-11-24
    • 2012-01-13
    • 1970-01-01
    • 2014-12-21
    • 2016-08-23
    • 2010-10-06
    • 1970-01-01
    相关资源
    最近更新 更多