首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从非阻塞返回c++中的坏地址错误

从非阻塞返回c++中的坏地址错误
EN

Stack Overflow用户
提问于 2021-03-25 19:21:27
回答 1查看 254关注 0票数 0

当我试图倾听而不是发送时,我得到了一个“坏地址”错误。发送非常适合sendto()。

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

在getaddrinfo中使用NULL (NULL,port,&提示,&addrInfoResults);似乎是要走的路:不知道为什么使用发送方的本地IP (例如,192.168.1.50)将无法工作。但派人去。

代码语言:javascript
复制
    int socketDescriptor;
    sockaddr socketAddress;

    struct addrinfo hints;
    memset(&hints, 0, 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, port, &hints, &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);

连接时,不接收来自任何呼叫的错误。套接字被创建。接听电话是这样的:

代码语言:javascript
复制
    socklen_t addrSize = sizeof(socketAddress);
    int numbytes = recvfrom(socketDescriptor,
                        buffer,
                        sizeof(bufferStruct),
                        0,
                        &socketAddress,
                        &addrSize);

    if (numbytes < 0)
    {

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

为什么我的地址出错了?我看过所有与此相关的文章,没有任何帮助。我总是收到1分。

我迄今所做的测试:

  • 检查addr的大小。在地址和长度上都是一样的,
  • I创建了两个小控制台程序,令人惊讶的是它能工作。只有当我将getaddrinfo设置为NULL时才会接收数据,但是设置IP不起作用。令人费解。没有什么是不同的。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-26 10:04:00

让每个人都知道这件事。如果您有错误的地址,正如IBM文档所描述的那样:

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66806245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档