2012-10-12 74 views
1

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

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

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

任何想法?我一直在搜索,并找不到其他人有这个问题。大多数结果让我转向了stackoverflow,所以我在这里问。

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

+0

请不要在解决问题时编辑您的问题。添加的材料更适合作为您接受的答案的评论。 –

回答

3

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

如果可能,我强烈建议使用wireshark或类似的东西来观察UDP交换,并查看是否可以识别任何其他问题。我不熟悉TFTP协议,并且不能在那里提供很多输入。

+0

感谢您的回复。 当你说“它回应一个IP数据包,表明主机没有在监听”这听起来很像你描述的是TCP而不是UDP。 我不认为将UDP数据包发送到另一个地址会导致该机器的任何响应。我认为,如果这个数据包没有被这样的事情摄入,那么它就会落在地板上。 但是,谢谢关于wireshark的提示。我会尝试的。 – user1739763

+0

@ user1739763指示“主机未在监听”的协议是ICMP。你可以得到TCP或UDP无法访问的ICMP端口,我期望它能够响应你发送的数据包,期待没有任何事情发生。 – janm

+0

@ user1739763:更具体地说,TCP和UDP都会发送ICMP端口不可达数据包。对于未连接的UDP套接字(通过'connect'调用),您的操作系统不会通知您。但是,如果您发出了“连接”呼叫,则会按照我所述将失败传递给您。 –