C++ UDP异步\u接收的asio错误

C++ UDP异步\u接收的asio错误,c++,udp,client-server,boost-asio,tftp,C++,Udp,Client Server,Boost Asio,Tftp,我遇到boost::asio的一个奇怪错误。我正在实现TFTP服务器的一半(仅限服务器->客户端)。我在第一个套接字的端口69上获得第一个RRQ数据包,然后创建另一个套接字来执行数据ACK交换。我在该套接字上启动一个异步_receive(),然后对第一个数据包执行一个send()。然后我得到了接收的处理程序回调(我假设ACK进入),它给出了错误“由于目标机器主动拒绝,无法建立连接”,我从另一个线程这里理解这意味着错误\u端口\u无法访问 我真的不明白接听电话怎么会导致无法到达的错误,因为我没有接

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

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

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

有什么想法吗?我在谷歌上搜索过,找不到其他人有这个问题。大多数结果导致我出现stackoverflow,所以我在这里问

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

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


如果可能的话,我强烈建议您使用wireshark或类似的工具来观看UDP交换,并查看您是否能够识别任何其他问题。我不熟悉TFTP协议,无法提供太多信息。

谢谢您的回复。当你说“它用一个IP数据包响应,表明主机没有监听”时,听起来很像你在描述TCP而不是UDP。我认为向另一个地址发送UDP数据包根本不会引起该机器的任何响应。我想如果包没有被那一端的东西吞下,那么它就会掉在地板上。但是谢谢你给我关于wireshark的提示。我试试。@user1739763表示“主机未在侦听”的协议是ICMP。您可以获得TCP或UDP无法访问的ICMP端口,我希望它是响应您发送的数据包而来的,不希望发生任何事情。@user1739763:更具体地说,TCP和UDP都将发送ICMP端口无法访问的数据包。对于未连接的UDP套接字(通过
connect
调用),操作系统不会通知您。但是,如果您发出了一个
connect
呼叫,那么它会像我描述的那样将故障传递给您。问题解决后,请不要编辑您的问题。添加的材料更适合作为您接受的答案的注释。