代码之家  ›  专栏  ›  技术社区  ›  TekuConcept

当未连接到网络(AF_路由)时,没有此类过程(3)

  •  0
  • TekuConcept  · 技术社区  · 7 年前

    当我连接到网络时,我可以发送 struct rt_msghdr* send() errno = ESRCH (3) No such process

    通用代码:(在MacOS上测试)

    int sd = create_socket(AF_ROUTE, IPPROTO_RAW, AF_UNSPEC);
    
    memset(&buffer[0], 0, buffer.size());
    struct rt_msghdr* rmh = (struct rt_msghdr*)(&buffer[0]);
    rmh->rtm_msglen       = sizeof(struct rt_msghdr) + sizeof(struct sockaddr_in);
    rmh->rtm_version      = RTM_VERSION;
    rmh->rtm_type         = RTM_GET;
    rmh->rtm_addrs        = RTA_DST;
    rmh->rtm_pid          = getpid();
    rmh->rtm_seq          = 1;
    struct sockaddr_in* sa_in = (struct sockaddr_in*)(rmh + 1);
    sa_in->sin_len            = sizeof(struct sockaddr_in);
    sa_in->sin_family         = AF_INET;
    
    int status;
    if ((status = send(sd, rmh, rmh->rtm_msglen, 0) < 0) {
        rmh->rtm_msglen =
            sizeof(struct rt_msghdr) + sizeof(struct sockaddr_in6);
        struct sockaddr_in6* sa_in6 = (struct sockaddr_in6*)(rmh + 1);
        memset(sa_in6, 0, sizeof(struct sockaddr_in6));
        sa_in6->sin6_len    = sizeof(struct sockaddr_in6);
        sa_in6->sin6_family = AF_INET6;
        if ((status = send(sd, rmh, rmh->rtm_msglen, 0) < 0) {
            // process errno
            // * issue happens here when not connected to a network
        }
    }
    
    // receive kernel response(s)
    // process responses
    
    close(sd);
    

    我验证了进程ID(pid)在标头中的设置是否正确。当未连接到网络时,netstat-nr返回默认路由而不出现问题。我很难理解为什么此代码依赖于网络连接。

    netstat -nr :

    # with a network connection (Internet)
    Destination        Gateway     Flags          Refs      Use   Netif Expire
    default            X.X.X.X     UGSc           58        0     en1
    
    # without a network connection (Internet6)
    Destination        Gateway            Flags         Netif Expire
    default            fe80::%utun0       UGcI          utun0 
    
    0 回复  |  直到 7 年前