【发布时间】:2013-08-15 11:13:42
【问题描述】:
上下文:我正在编写一种重要的客户端-服务器 UDP 多播程序,我将其部署在一些无线节点上。部署的方法是我编写的一个脚本,它广播 ping 这些节点所在的网络,获取节点列表(基于 IP 地址),部署我的包并安装它。我注意到有时在部署时并未检测到所有节点,并且我正在开发的最新包没有安装。最终,在一个节点上运行的服务器可能比希望与服务器通信的客户端更老。因为服务器获取数据包,并根据该数据包中的条目分配内存,所以如果结构发生变化,服务器通常会在段错误中崩溃。作为一种解决方案,我正在考虑在客户端和服务器之间发送的数据包中实现版本号,这样如果服务器/客户端读取一个版本号不同的数据包(或者由于重组而成为垃圾)数据包),此数据包将被忽略,并更新日志,或将紧急数据包发送给原始发送者。
所以,我试图想出在编译时获取这个“版本号”的最佳方法,它可以作为#define 放在标头中。我查看了__time__ 预处理器宏,但这是字符串的形式。有没有办法在编译期间获取纪元时间,以便我可以将其位掩码为无符号整数(如果我正确考虑的话,它应该只在 136 年后翻转)?
对不起,如果我不清楚。
【问题讨论】:
-
当然,更好的解决方案是简单地将数据包的大小作为数据包的一部分发送到另一端。
-
您确定要在每次编译时更改版本吗?数据包结构似乎不太可能(对我作为一个不知情的观察者而言)不会随着每次编译而改变。版本更改似乎更像是一种有意识的努力,您偶尔会“手动”更改它。我只是好奇。
-
@MarkWilkins:是的,我也是这么想的。尤其是在开发过程中,每次重新编译代码时都必须分发新的可执行文件,这真的很烦人,这仅仅是因为对某些调试日志进行了小改动,或者诸如此类。
-
@MatsPetersson,我明白你在说什么,但我确实必须将可执行文件分发到至少一个节点,因为我做了一个微不足道的更改,比如调试日志记录。这与甚至 10 个节点之间的差异几乎没有。为什么不分发修复程序,无论我正在测试的所有节点有多小?我想,做这个版本号的事情只是更“自动”。我/可以/仅在更改数据包结构时手动更改数字,但如果我忘记了怎么办?
-
我在这种情况下使用的是,使用来自 CVS 的版本号。也许你的版本控制系统有类似的东西?
标签: c c-preprocessor epoch