请教xtang

谢谢xtang的精彩回复,我又有一个问题需要向您请教.
在qnx上通过socket和下位机联接,程序已经编译运行良好,但我想再对程序进行优化情况是这样的.我想在client端突然断开的时候server端能判断到client已经断开了.在windows下有一好像是isconnect( )的函数可以判断到client端是否已经断开.不知到qnx上有没有类似这样的函数,或者是其他的解决方法也行.
谢谢!

不知道Windows的isconnect()可以告诉你什么,(是socket仍然在establish下,还是对方已经不在了)。

tcp/udp从理论上讲,唯一可以切实知道对方是否断开的方法,只有向对方发数据包。想象当一个链接建立以后,把网络线拔掉的情形,上层是不应该知道这个细节的,这样,把网络插回去后,通讯可以完全恢复,这是IP网络的设计要求。

通常,“如何及时判断对方是否断开”的办法是,你在你自己的传递协议上,增加Heart Beat。就是每当idle了一定时间后,就发包向对方问一下。

如果是TCP,有一个协议规定的KEEP_ALIVE,查一下getsockopt()/setsockopt()的KEEP_ALIVE和TCP_KEEP_ALIVE的说明。如果设起这些参数的话,那么tcp协议层会自动向对方发一个heart beat,用来查证对方是否还存在。

果然是高手,佩服佩服!

我最喜欢的方法是,Client每隔一个定时器时间向服务器发一个pulse,而不是服务器向Client询问.这样的好处是,在服务器面对多个Client的情况下,可以有很高的效率来判断每个客户机的状态,不但可以判断网络的状态,更可以判断客户程序的状态.

请教ChenYin,设置定时器战不战用cpu资源?如果占用cpu的话,
对程序的效率会不会产生不利影响?谢谢!

创建一个定时器当然会占用一定的CPU资源,因为定时器的触发是由内核比较系统当前时间与定时器所定时间来决定的.QNX在定时器触发后,仅仅抛出一个事件(一般是一个PULSE),而对这个PULSE的处理,是由你的线程来做的,因此,效率上来说很高的:你自己决定该线程的优先级,你自己决定该定时器处理的优先级.对于判断网络通断这种任务来说,在一秒钟之内得到信息我想已经足够,一个秒级的定时器对系统性能的影响几乎可以不计.