我有一个程序可以使用UDP(数据大小150字节)将数据从一台PC发送到另一台PC。那
程序在delphi 7中编写(TldUDPClient和TldUDPServer组件使用
发送和接收数据)。我需要对30%的数据包丢失进行测试。
我为Windows使用ipfw
(从sourceforge下载):
ipfw -f flush
ipfw add pipe 1 ip from any to any out
ipfw pipe 1 config plr 0.3
使用ping时,我会看到30%的数据丢失。
当我启动delphi程序时,经过一段时间的工作后,它返回一个
错误:
socket error 10004
。错误的描述是:中断的函数调用。调用
WSACancelBlockingCall
中断了阻止操作。网络组件和丢包仿真之间是否存在功能问题?或者在丢包的情况下,我也会在实际情况中看到吗?我可以使用哪个其他防火墙或其他软件来模拟丢包?
最佳答案
听起来更像是丢包模拟问题。 ipfw
工具似乎从this site中断了连接-它是您的版本吗? -源代码未实现此选项-已有4年的历史了。使用ping命令,您只知道您在预期时间内没有收到任何答复-ARP协议(protocol)AFAIR中没有“连接”。
从UDP标准来看,数据包丢失是无痛的:没有向套接字层检索到任何确认或错误消息。
在实际的网络连接上,UDP数据包会静默丢失。
和painfully... perhaps;)