recvfrom 非阻塞返回 C++ 中的 BAD ADDRESS 错误

问题描述

我在尝试收听而不是发送时收到“错误地址”错误。发送与 sendto() 完美结合。

这是创建要侦听的套接字的函数。 IP 和 Port 是本地的(这是为了在同一个本地网络中执行,实际上是在使用 linux 虚拟机和 windows 机器的同一台电脑上)。

在 getaddrinfo(NULL,port,&hints,&addrInfoResults) 中使用 NULL;似乎是要走的路:不知道为什么使用发件人的本地 IP(例如 192.168.1.50)不起作用。但是发送有效。

    int socketDescriptor;
    sockaddr socketAddress;

    struct addrinfo hints;
    memset(&hints,sizeof(struct addrinfo));
    hints.ai_family = AF_INET; // Allow only IPv4
    hints.ai_socktype = SOCK_DGRAM; // Datagram socket,type of packages used in UDP
    hints.ai_protocol = IPPROTO_UDP; // UDP protocol
    hints.ai_flags = AI_PASSIVE; // USE MY IP


    // resolve dynamically IP adress by getaddrinfo()
    struct addrinfo *addrInfoResults;
    int resVal = getaddrinfo(ip,&addrInfoResults);
    if (resVal != 0) {
        // ERROR
        return false;
    }

    struct addrinfo *addInf;
    for(addInf = addrInfoResults;addInf != NULL; addInf = addInf->ai_next) {
        if (addInf->ai_family == AF_INET) { // IPv4
            struct sockaddr_in *ipv4 = (struct sockaddr_in *)addInf->ai_addr;
            void *addr = &(ipv4->sin_addr);

            // convert the IP to a string
            char ipstr[16]; // IPv4 is 16
            inet_ntop(addInf->ai_family,addr,ipstr,sizeof ipstr);
            break;
        }
    }

    // Create connection with socket
    socketDescriptor = 0;
    if ( (socketDescriptor = socket(addInf->ai_family,addInf->ai_socktype,addInf->ai_protocol)) == -1)
    {
        // ERROR...
        return false;
    }

    // Try to bind to that address
    if (bind(socketDescriptor,addInf->ai_addr,addInf->ai_addrlen) == -1)
    {
        // ERROR
        return false;
    }

    socketAddress = *(addInf->ai_addr);
    freeaddrinfo(addrInfoResults);

    // Set socket non blocking
    fcntl(socketDescriptor,F_SETFL,O_NONBLOCK);

连接时,没有收到任何呼叫的错误。套接字已创建。 要接收的电话是这个:

    socklen_t addrSize = sizeof(socketAddress);
    int numbytes = recvfrom(socketDescriptor,buffer,sizeof(bufferStruct),&socketAddress,&addrSize);

    if (numbytes < 0)
    {

        int errnoBackup = errno;
        if (errnoBackup != EWOULDBLOCK && errnoBackup != EAGAIN)
        {
            _logFile << "ERROR" << std::endl;
            ....

为什么我会收到 BAD 地址错误?我已经阅读了所有与此相关的帖子,但没有任何帮助。我总是收到 -1。

到目前为止我所做的测试:

  • 检查地址的大小。地址和长度都是一样的。
  • 我创建了两个小控制台程序,令人惊讶的是它可以工作。仅当我将 getaddrinfo 设置为 NULL 时才接收数据,但设置 IP 不起作用。这令人困惑。没有什么不同。

解决方法

只是为了让每个人都知道这一点。 如果您有错误的地址,如 IBM 文档所述:

调用 recvfrom 时:缓冲区(指向 NULL)、地址(指向错误的地方或您没有将引用传递给实际位置而不是指针),或地址的大小(您没有正确计算)。

我的问题是我没有初始化缓冲区。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...