Asio UDP 套接字接收失败



尝试使用此代码使用 Asio UDP 套接字发送/接收(减压版本(

asio::io_service service;
asio::ip::udp::socket sock(service);
asio::ip::udp::endpoint endpoint(asio::ip::address::from_string("127.0.0.1"), 20100);
sock.connect(endpoint);
sock.send(buffer("testingn"));
std::string buffer;
size_t length = sock.receive(asio::buffer(buffer)); <--- spawn exception

但出现以下错误:

An existing connection was forcibly closed by the remote host

这里有什么问题吗?感谢您的任何帮助!

我不知道

你是如何构建你的udp服务器的,但我想它有问题。我写了一个示例程序来解释您收到的错误消息:

#include <stdio.h>  
#include <errno.h>  
#include <stdlib.h>  
#include <string.h>  
#include <sys/types.h>  
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>  
int main()  
{    
    struct sockaddr_in addr;  
    int fd, cnt, ret;  
    if ((fd=socket(AF_INET, SOCK_DGRAM, 0)) < 0) {  
        printf("error");
        exit(1);  
    }
    memset(&addr, 0, sizeof(addr));  
    addr.sin_family=AF_INET;  
    addr.sin_addr.s_addr=inet_addr("127.0.0.1");
    addr.sin_port=htons(9090); // address which is not bound
    ret = connect(fd,(struct sockaddr *)&addr,sizeof(addr));  
    char buf[512];
    cnt =  send(fd, "hello", sizeof("hello"), 0);  
    if(cnt < 0)  
        perror("send:");  
    cnt = recv(fd, buf, 512, 0); // error: Connection refused
    if(cnt < 0)  
        perror("recv:");  
     return 0;  
} 

我尝试将数据发送到本地主机的 udp 端口 9090 或任何没有 udp 套接字绑定到端口 9090 的主机。 send()成功,但recv()失败。根据 udp 的手册页:

所有致命错误都将传递给 用户作为错误返回,即使 插座未连接。这包括 从 网络。您可能会收到错误 在 相同的套接字。此行为不同 从许多其他 BSD 套接字 未通过任何 错误,除非套接字已连接。 Linux 的行为是由 根据 RFC 1122

其中说:

UDP 必须将它从 IP 层收到的所有 ICMP 错误消息传递给应用层。至少从概念上讲,这可以通过调用ERROR_REPORT例程来实现

send()成功,但它会导致 ICMP 错误消息(您可以使用 tcpdump 看到它(,然后recv()看到此错误(您可能会收到在同一套接字上发送的早期数据包的错误(,因此它失败。

相关内容

最新更新