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