【问题标题】:IdUDPServer sending header checksum as 0x00IdUDPServer 发送标头校验和为 0x00
【发布时间】:2012-12-28 18:08:00
【问题描述】:

我正在用一个众所周知的服务器制作一个简单的 UDP P2P 聊天程序。 客户端通过单个 IdUDPServer 从服务器和客户端发送和接收数据。

客户端现在可以登录和注销,即他们可以向服务器发送数据。 每当服务器发送任何数据时,它都会被丢弃在节点的 NIC 端,因为正如wireshark 所通知的那样,嵌入式 ip 标头校验和为 0x00。

IdUDPServer 设置(客户端/服务器)

主动:真

绑定:

广播:错误

缓冲区大小:8192

默认端口:10000

IPVersion : Id_IPv4

线程事件:假

使用的命令

中只使用了一个命令

UDPServer.SendBuffer (ED_Host.Text, StrToInt (ED_Port.Text), 缓冲区);

类似的配置在我的另一个程序中运行良好。

【问题讨论】:

  • SendBuffer() 只是将数据按原样传递给套接字 API sendto() 函数,因此生成校验和的是 OS/NIC,而不是 Indy。
  • 好的...那么我可以检查什么让它再次工作?端口打开,防火墙关闭,校验和仍然...
  • 现在大多数 NIC 将执行校验和验证和生成,而不是 os 网络堆栈。这是为了提高性能,称为校验和卸载。因此,wireshark 会将校验和丢失的事实报告为错误,但通常可以忽略它,或者在 Wire Shark 设置中关闭该错误。
  • 某些 NIC 驱动程序允许您关闭校验和卸载。试试这个并重新测试代码
  • 它解决了标头问题,但 udp 保持在原来的位置......即使实施 tcp 也无济于事,服务器不会像 udp 的情况那样通信......但我认为我应该为此提出一个新问题...

标签: delphi indy delphi-xe3


【解决方案1】:

如今,大多数 NIC 将执行校验和验证和生成,而不是 os 网络堆栈。这是为了提高性能,称为校验和卸载。因此,wireshark 会将校验和丢失的事实报告为错误,但通常可以忽略它或在 Wire Shark 设置中关闭错误。

某些 NIC 驱动程序允许您关闭校验和卸载。试试这个并重新测试代码

【讨论】:

  • ...这是一种解决方法,但这里的 UDP 数据包仍然格式不正确... :( 在 IdUDPServer 级别发送之前,是否无法在 UDP 标头中设置 UDP 校验和?否IdUDPServer 级别的相应事件?UDP 校验和非常基本(这是一个简单的 16 位累积,AFAIR)。
  • 您必须修改源代码并创建一个 hack 类来公开所需的方法/字段。我只是做了解决方法,并没有打扰校验和,因为我将它包含在我的消息包中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
相关资源
最近更新 更多