我正在做个snmp的winform项目。遇到两个问题希望大家帮忙。1.怎样判断网络断开(如:拔出网线,设备掉电等)2.如果发生了上述情况能否在网络恢复后自动继续数据访问。

解决方案 »

  1.   

    楼主的问题解决方法有好多种。我只说一种简单,这些类中都提供对象超时的属性如timeout,只要判断是否超时就知道是否断线一类的问题了,在默认的情况下是0,就是永远不超时,建议用我这种方法判断的话,把这个数据改成你认为多长时间是超时了。
    第二问题,你要实现的话,只有采用断点转送,当再次连接到,查询断开点的数据位置,然后发送这些消息给另外一个机子,从断点处开始发送数据就可以了,如迅雷就是用的断点转送和多线程技术来下载的。
      

  2.   

    另外补充一句,udp只保证发送出去数据,不保证数据是否会发送成功,不和tcp接发数据一样。说穿了,接收和发送数据关键是c/s两端的协议如何定。
      

  3.   

    1.心跳包...超时时间内未收到包,则视为断开,此时socket.close(),再重连.
    2.能,在收到每个心跳包记录接收或发送数据的index,下次连接时从该index开始继续接收或发送.
      

  4.   

    请问calltaotao什么是心跳包呢??怎样设计这样的数据包啊?
      

  5.   

    udp是无连接的,只保证数据的发送,不能确定是否能够被接收,这个需要在你的应用层进行处理.
      

  6.   

    所谓心跳包就是客户端定时发送简单的数据包,告诉服务器自己还活着。提供另外一个思路,楼主可以参考。1、首先在创建数据包时加入一个唯一性的特征码,可以是时间戳或者表关键字。
    2、发送方A建一个Queue和Hashtable,Queue是数据包发送队列,Hashtable保存已发送但未判断是否被接收方接收的数据包特征码。
    3、接收方B接收到数据包时提取数据包中的特征码,创建包含特征码的数据包并发送回原发送方A,表示B已经收到数据包。
    4、发送方A收到B的返回包,并提取特征码,然后删除Hashtable中的值。
    5、可以对Hashtable设定一个阀值,当超过该值是Queue就不再发送数据包。
    6、当链接恢复时,优先发送Hashtable中的特征码有关的数据包。
      

  7.   

    感谢13楼。但是对方设备的源码是不开放的也无法在对方设备上加入任何的标志。我想知道C#中是否存在一种可以提示网络连接是否正常的exception类型。如果有的话我用try catch  ...exception的方式应该可以解决判断网络是否断线的问题。但是怎样在网络恢复的时立即开始新的查询呢?
      

  8.   

    是想做网管的东西?用snmp取一些日志或者报警信息的东西?
      

  9.   

    udp不需要考虑网络断开的情况,假设你发送的目标地址根本不存在,发送照样能成功,不会发生任何异常。你只有在每次发送后,让对方回应一个确认信息回来才行,模拟TCP的3次握手,不过这里只需要2次,无需对确认信息再次确认了,因为如果确认信息收不到,发送方最多再发送一遍,而接收方大不了重新返回一下确认信息,接收到的信息无视。