首页未分类 › 使用Socket套接字绑定函数bind的一个细节

使用Socket套接字绑定函数bind的一个细节

只要稍微接触Socket套接字进行过网络编程的人,对Socket客户端调用流程或服务端调用流程都会很熟悉,传输层协议采用TCP也好,或UDP也罢。但是要写好这套“固化”的流程代码,如果稍不小心,或缺乏经历,还是很容易犯错误的,尤其当项目程序在迭代开发过程中,功能越来越多,也越来越复杂的情况下。

就在前几天,我碰到了这样一个细节问题。

协议栈Demo程序中有个设备校时的功能,采用NTP协议进行设备间的时钟同步。Demo程序在我和一位同事的PC (操作系统为MS XP)上测试时钟同步,怎么测,都没问题。但是拿到Windows 7系统下,却可能会发生问题,后来我在Windows Server 2003系统下,也碰到这个问题。

Demo A要向 Demo B发送登录请求,登出……并发送时钟同步请求(A向B登录请求时创建的套接字和A向B时钟同步请求创建的套接字不同),A 也要向Demo C登录;B向C登录。在Windows 7系统下,若打开A和B,A直接向B时钟同步请求,结果成功;若先打开A和C,A向C登录成功后,再打开B,A向B时钟同步请求,则失败。但该问题在开发环境PC XP系统下不会发生,后来在和另一位同事的共同努力下,最终找到了问题所在,并改掉了此Bug,不亦乐乎!

下边我写了一个简易的测试程序,再现了造成时钟同步请求可能会失败的关键所在。

下面是udp_bind.exe在XP系统下的运行结果截图
5
下面是在Server 2003系统下的截图
6
相同的代码在不同的系统下跑出不同的结果,令人有些费解!将上述测试代码中对应地方改为如下,就OK了。

看到这里,您也应该明白我们Demo程序中时钟同步的问题所在了吧?
俗话说,细节决定成败。
不论做产品,做项目,还是开发网络程序,都会面对很多细节问题,要重视你碰到的细节问题!

发表评论