监听传入数据时,“现有连接被远程主机强制closures”

在使用boost asio时,我偶然发现了一些奇怪的行为,我不太明白。 我写了一个最小的testing程序来复制这个问题:

#include <boost/asio.hpp> #include <iostream> using boost::asio::ip::udp; int main(int argc,char *argv[]) { boost::asio::io_service ioService; udp::resolver resolver(ioService); udp::resolver::query queryListen("127.0.0.1","50001"); auto epListen = *resolver.resolve(queryListen); udp::socket socket(ioService,epListen); udp::resolver::query querySend("127.0.0.1","55006"); auto epSend = *resolver.resolve(querySend); boost::system::error_code err; std::array<char,12> buffer = {'1','2','3','4','5','6','7','8','9','10','11','12'}; socket.send_to( boost::asio::buffer(&buffer[0],buffer.size()), epSend,0,err ); if(!err) { std::cout<<"Sent successfully!"<<std::endl; auto numBytes = socket.receive( boost::asio::buffer(&buffer[0],buffer.size()),0, err ); if(!err) std::cout<<"Received "<<numBytes<<" bytes successfully!"<<std::endl; else std::cout<<"Unable to receive: "<<err.message()<<std::endl; // This is where I'm getting the message "An existing connection was forcibly closed by the remote host" } else std::cout<<"Unable to send: "<<err.message()<<std::endl; for(;;); return 0; } 

如果'send_to'调用的目标端点存在并正在监听,那么这个程序运行得很好。 数据正确发送,然后等待传入的数据。

但是,如果目标端点存在,则行为是相当意外的。 “send_to”调用仍然没有任何错误地发送数据,但是当试图接收数据时,“receive”调用立即返回,并且我得到了“现有连接被远程主机强行closures”错误。 这对我没有任何意义。 首先, 没有远程主机 ,因为没有数据被发送到监听端口。 其次,据我所知,这个节目的接收和发送部分应该是完全独立的,互不影响。 这个假设我错了吗?

//编辑:

我刚刚意识到,为什么这个信息没有任何意义,还有另一个原因。 我正在使用无连接的UDP协议,所以closures了什么“连接”?

Solutions Collecting From Web of "监听传入数据时,“现有连接被远程主机强制closures”"

虽然UDP通常被称为无连接协议,但上下文隐含了无状态协议。 因此, UDP被允许返回一些连接相关的错误消息:

所有针对套接字或IP记录的错误都可能由UDP套接字上的发送或接收返回。

ECONNREFUSED
没有接收者与目的地址相关联。 这可能是由于通过套接字发送的先前数据包造成的。

Winsock recvfrom()函数记录对于UDP,如果先前的发送操作导致ICMP端口不可到达消息,则该函数将与WSAECONNRESET发生错误:

WSAECONNRESET
[…]在UDP数据报套接字上,此错误指示先前的发送操作导致ICMP端口不可到达消息。