我现在是在UDP上实现SNMP数据包的编码和解码,
主要是为了以后的各个版本兼容问题。现在编码
和解码都已经实现。其中解码函数能够解出网络
上发过来的SNMP数据包,而我生成的数据包发送
到其他SNMP代理上,在UDP上接收的时候,返回
错误,错误代码为10054,意思是(An existing 
connection was forcibly closed by the remote
 host. )不知道是什么原因?既然解码都能通过,
那为什么SNMP代理不认我的数据包呢?就算我的
格式错误也应该返回一个SNMP格式的错误说明啊!
怎么会产生socket错误呢?

解决方案 »

  1.   

    win2000上写SNMP有现成函数,没必要自己写socket程序.
    所以,我从未碰到这种问题.
      

  2.   

    但是win2000的只能支持到snmpv1和snmpv2版本啊,如果以后有snmpv3版本呢?
      

  3.   

    工作流程:
        我生成了一个隐含窗口用于端口消息的接收,接收WM_SNMP和WM_TRAP消息。当我在主窗口菜单下选择 发送SNMP数据包 菜单时,会调用我自己的SNMP数据包编码函数,填入相关的信息。然后sendto本局域网内的一台机器。发过去就不管了,对方机器上有SNMP服务,在接收到我的数据包后,如果是正确的话,因该返回我指定的OID的先对应的值,但是现在是返回了什么我也不知道,反正是现在在我的隐含窗口的消息处理函数中,recvform()函数返回-1,用GetLastError()函数取了错误值为10054。如果正常的话,应该进入解码函数,得出值才对啊!
        不知道是不是 Microsoft 是不是在Snmp上作了什么手脚?有可能吗?
      

  4.   

    错误原因可能:1.应该是你的编码函数错误,编码的数据格式不对。
    2.你发送数据的地址错误,根本就没有发送到你要发送的那台机器,所以你收不到任何错误信息。
    3.你的目的机器程序有问题,它根本就没接受到你发过去的东西。
    4.你的recvform()的接收地址和时机是否有错?我觉得可能就是以上错误,你可以再仔细查看一下。
      

  5.   

    1:基本编码不会有误,因为我有一个基于winsnmp的程序发出的snmp数据报和我生成的数据报格式一摸一样,最起码是在UDP上是。
    2:地址绝对没错,而且已经发到对方机器。
    3:接受程序没问题,因为它只有在161端口上有数据才会中断,而且我们有一台HP OPENVIEW的服务器平时的数据报它都能解出来,只不过它的值为空,因为它是在实时查询网络主机的信息,所以值为空。
    4:肯定不会有错。不过倒是可以考虑一下抓取对方返回的数据报,不过这几天没空还没试过。
      

  6.   

    惭愧,知道昨天晚上才有兴趣再来调试,用CaptureNet抓取了一下数据包,立马就看出原因来了。强烈建议所有写网络软件的人必备数据包抓取工具,现在结分!