当我在调试模式下编译和运行程序时,我有一个使用 win32 用 c++ 编写的简单 udp 侦听器,它运行良好,而且我清楚地能够从我收到的数据包中看到信息。当我运行与发布版本相同的代码时,它编译得很好并且似乎运行良好,但它没有像在发布版本下那样打印出任何数据包信息。我试图镜像构建配置以完全匹配,但它仍在发生。任何建议将不胜感激。
4 回答
输出有关数据包的调试信息的代码可能出于性能原因在发布版本中被删除。
这主要通过两件事来完成:
- 检查调试模式并在该模式下生成适当代码的条件预处理器指令。
- 链接到库的调试版本。
实际上,删除这些东西是您构建发布版本的主要目的。您不需要调试信息,因此您不会为此牺牲性能。如果您真的想这样做,那么您为什么不直接发布调试版本 [更新:如评论中所述,似乎许可证不允许您分发与调试库链接的软件]?这是最相似的配置(你不能得到更多相似而不是相同的配置,对吗?)
这更有可能是没有将变量初始化为某个初始值的问题,因此在调试中它们具有某种值,但在发布中,大多数东西都被初始化为零(NULL)。因此,可能会发生一些您没想到的情况/分支……例如,如果没有您的源代码,就很难发现问题。
这让我不止一次.. :)
这是假设您不希望看到任何使用诸如Mehrdad建议的 OutputDebugString() 之类的东西...
另外,请确保您的数据包大小小于 1024 字节,否则您将无法获得它们。当 XP 出现时,我花了一段时间才弄清楚这个问题,我无法弄清楚为什么我的代码在 2000 上工作,而不是 XP ......即使 send (sendto) 会返回成功,它实际上从未发送过包..
无论如何,我在 Win32 上处理了很多 UDP,所以如果你给我一些示例代码,我应该能够提供更多帮助......
但无论如何,请检查您的所有变量是否已在发送方和接收方上初始化为某种默认值(这只是一个好习惯),然后重新构建它并重试。此外,在发送之前使用 sizeof() 检查您的数据包大小,如果它大于 1024 字节,请不要打扰......检查接收数据包的大小也是一个好主意,如果它不完全是大小你期望,然后丢弃数据包。这对于广播来说更是如此,但仍然适用。
让我知道这是否有帮助,不久前我在另一个问题上发布了很多 UDP 代码,并且该代码有效,您可能想参考它。
你究竟是如何打印信息的?像 TRACE 这样的宏在发布版本中没有任何作用。
或者,如果您使用 fprintf 或类似的工具进行打印,则在您调用 fflush 之前它不一定会写入任何内容 - 调试版本可能会更频繁地为您执行此操作。
迟到的答案,但可能是由 Windows 防火墙引起的。