Chinaunix

标题: 请教:网络通讯中如何知道对方是否处于活跃状态? [打印本页]

作者: kingjwj    时间: 2006-10-29 09:50
标题: 请教:网络通讯中如何知道对方是否处于活跃状态?
问题假设:通讯方式不管是TCP还是UDP(可以分类说明方法),通讯双方如果一方是内网IP,另一方是外网IP.
现在要求能够知道对方是否ACTIVE?都有哪些方法???请详细说明.

比如说心跳测试,则说明心跳测试的实现策略.

希望这个帖对我们穷人有所帮助.

作者: longshort    时间: 2006-10-29 09:59
心跳测试

Ping就是个心跳测试的程序。顺便问一下,您真是“穷人”么?...
作者: kingjwj    时间: 2006-10-29 19:57
怎么没人愿意详细接受一下 吗??
作者: sohusina    时间: 2006-10-29 20:09
请问什么是ACTIVE?
作者: kingjwj    时间: 2006-10-29 20:24
原帖由 sohusina 于 2006-10-29 20:09 发表
请问什么是ACTIVE?


这里的active就是活跃的意思,就是判断通讯对方的进程是否还在正常运行,或者是网络已经断开,导致类似于对方进程已经结束,不能提供有效的通讯交互服务。

这样解释有没有说清楚?

感觉这是一个网络编程中经常遇到的问题呀,请高手们都分享一下解决办法。
作者: kingjwj    时间: 2006-10-30 09:41
没人指教吗??

那我再问一个问题,一台内网ip的机器可以通过代理访问外网,现在外网那台机器要发送信息给内网这台IP,是不是内网如果没有往外网这台IP发送过信息,外网机器将无法主动与内网机器通讯??
只有在内网机器主动和外网机器通讯后,在路由信息中有记录,外网ip根据接收到的数据报,解析出源ip,源端口作为发送信息的目的ip与端口,才能发送信息到对应内网ip??
如果这样,内网机器可以视为一个服务器,不管是TCP方式还是UDP方式,都需要邦定IP与端口,难道是绑定自己内网比如192。168。0。10这样的IP???

请高手解释一下详细的过程好吗??

我认为外网是可以与内网进行通讯的,即使网关不开端口对内网IP进行映射。
作者: toiby    时间: 2006-10-30 10:31
在服务器端给客户端定义一个监控的数据包协议,
要求客户端在协议的时间段内给服务器端发送监
控数据包,通过监控到的数据包分析客户端的运行
状态,如果在协议的时间段内服务器没有接收到
客户端的协议数据,则判断客户端已经跟服务器断
开连接。
没做过这方面的程序,构思而已,不是否适合:)
作者: sesame2    时间: 2006-11-02 11:04
原帖由 toiby 于 2006-10-30 10:31 发表
在服务器端给客户端定义一个监控的数据包协议,
要求客户端在协议的时间段内给服务器端发送监
控数据包,通过监控到的数据包分析客户端的运行
状态,如果在协议的时间段内服务器没有接收到
客户端的协议数据, ...


楼上的对通讯理解的完全正确,在直接连同的网络之间完全没问题。
不过楼主强调的应该是内网和外网之间的通讯吧,
好多年没碰过网络了,也不知道怎么处理。
期待别人解答。
作者: yzygift    时间: 2006-11-02 11:30
没人指教吗??

那我再问一个问题,一台内网ip的机器可以通过代理访问外网,现在外网那台机器要发送信息给内网这台IP,是不是内网如果没有往外网这台IP发送过信息,外网机器将无法主动与内网机器通讯??
只有在内网机器主动和外网机器通讯后,在路由信息中有记录,外网ip根据接收到的数据报,解析出源ip,源端口作为发送信息的目的ip与端口,才能发送信息到对应内网ip??
如果这样,内网机器可以视为一个服务器,不管是TCP方式还是UDP方式,都需要邦定IP与端口,难道是绑定自己内网比如192。168。0。10这样的IP???

请高手解释一下详细的过程好吗??

我认为外网是可以与内网进行通讯的,即使网关不开端口对内网IP进行映射。


我个人认为你的理解有误! 首先 ,内网和外网是一个相对的概念!可以这么理解,相对于你,你在的网络属于内网,别人在的网络属于外网.而相对于别人,别人在的网络属于内网,你在的网络属于外网.
所以你的第一点疑问是 外网可以主动与内网机器通信.(个人见解)

而对于第二个疑问:只有在内网机器主动和外网机器通讯后,在路由信息中有记录,外网ip根据接收到的数据报,解析出源ip,源端口作为发送信息的目的ip与端口,才能发送信息到对应内网ip??

外网机器只要知道你代理服务器的ip,进入你的代理ip,利用nat转化就可以访问你的机器了,(我也是自己理解,望共同讨论)
作者: flw2    时间: 2006-11-02 13:28
yzygift  说的有道理。外面过来的包经过你的路由,那么它会判断送给内部谁,然后把目的地址改为你的,而外面是不知道的。
作者: anhongkui    时间: 2006-11-02 15:53
如果外网想要主动连接内网,可以在路由器上弄个端口映射
作者: kingjwj    时间: 2006-11-03 09:31
通过看一些资料,关于内网(局域网IP,通过网关代理上网)外网(外部独立静态IP)的通讯(在这里不考虑在路由器上作端口映射):外网是无法主动连接内网的,即不能主动发起通讯;内网当然可以连接外部静态IP,发起通讯的过程中,UDP可以直接从recvfrom函数的参数返回中可以得到信息,直接回传对应的IP和端口。这样实现了通讯。
其实,看到这里,可以产生一个问题:UDP发送端没有bind()一个端口,怎么实现接受信息呢???我是这样理解的,内网IP发送信息时,虽然没有显示的绑定端口,但是在调用sendto时,应该系统内核作了一个绑定其IP和一随机端口的处理,这样,接受方接到的信息可以有IP和端口信息,而发送方也可以接受到回复信息。

关于状态监控,结合作的项目,我是这样处理的,外网机器因为需要不定时的向内网机器发送一定信息,而他又不能主动进行通讯,因此,我就让内网ip定时向外网ip进行询问,如果外网ip有需要发送的信息,则可以顺利发送到内网机器,而这正好也达到了状态监控的功能,如果内网机器长时间接受不到回复,则可以认为外网机器出现故障,请求其他正常的外网机器进行信息交互。外网机器也一样,如果接受不到询问数据,则认为内网机器出现故障。

上面是我个人的一些想法,也没有系统的去了解通信机制,请大家多指点,一起讨论。

[ 本帖最后由 kingjwj 于 2006-11-3 09:33 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2