1

我遇到了来自 boost::asio 的奇怪错误的问题。我正在实现 TFTP 服务器的一半(仅限服务器-> 客户端)。我在第一个套接字上的端口 69 上获得第一个 RRQ 数据包,然后创建另一个套接字来执行 DATA、ACK 交换。我在该套接字上启动 async_receive(),然后对第一个数据包执行 send()。然后我得到接收的处理程序回调(我假设 ACK 进来),它给出了错误“无法建立连接,因为目标机器主动拒绝了它”,我从另一个线程理解这里意味着 ERROR_PORT_UNREACHABLE。

我真的不明白接收呼叫如何导致 UNREACHABLE 错误,因为我没有接触任何东西,我正在接收。我检查了 send() 的结果,那里没有错误。

我检查了套接字中的本地和远程端点(在错误之前和之后),它们都有正确的 IP 地址和端口。

有任何想法吗?我用谷歌搜索,找不到其他人有这个问题。大多数结果导致我使用stackoverflow,所以我在这里问。

编辑—— 我的问题是我正在使用调试器。当我开始发送第一个数据包时,客户端在大约一秒钟内发送了十几个请求后,客户端超时并放弃了,我的数据来不及了。当我在没有断点的情况下运行时,它工作正常。感谢大家的建议。正是观察 Wireshark 中的数据包给了我线索。

4

1 回答 1

3

发送成功的原因是因为发送只是表明数据包已被提供给操作系统。特别是,操作系统随后将该数据包发送到目的地,并以指示主机未在侦听的 IP 数据包进行响应。然后您的操作系统接收它,并在您的套接字上设置一个标志,导致下一次读取失败。由于您已经在执行异步接收,因此会导致接收返回错误。

如果可能的话,我强烈建议使用wireshark 或类似的东西来观察UDP 交换,看看你是否能发现任何其他问题。我不熟悉 TFTP 协议,因此无法提供太多输入。

于 2012-10-12T01:42:29.990 回答