Почему ресурс временно недоступен recvfrom () в C macOS - PullRequest
1 голос
/ 15 апреля 2020

Итак, я пытаюсь написать свою собственную программу PING. Я получил почти все, кроме recvfrom части. Я постоянно получаю Ресурс временно недоступен. Я пытался увеличить время ожидания, скажем, 5 секунд. Это не сработало. Pa c - мой ICMP-пакет. Я также использую сокет raw и он находится под IPv4.

    clock_gettime(CLOCK_MONOTONIC, &sent);
    if (sendto(socketfd, &pac, sizeof(pac), 0, (struct sockaddr*)&out_addr, sizeof(out_addr)) == -1)
    {
        perror("SENDING FAILED");
    }else{
        sent_packet++;
    }

    socklen_t in_addr_len = sizeof(in_addr); 
    if (recvfrom(socketfd, &pac, sizeof(pac), 0, (struct sockaddr*)&in_addr, &in_addr_len) == -1)
    {
        perror("\nRECEIVING FAILED");
    }else{
        received_packet++;
    }
    clock_gettime(CLOCK_MONOTONIC, &received);

Я также настроил параметры сокета

    if (setsockopt(socketfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&timeout, sizeof(timeout)) < 0)
    {
        perror("SET TIMEOUT FAILED");
    }

В результате, когда я пингую свой школьный веб-сайт, моя программа распечатывает это, в то время как обычно поле времени должно быть около 11 мс

    RECEIVING FAILED: Resource temporarily unavailable
    64 bytes from 128.151.77.39: icmp_seq = 0 ttl = 64 time = 0.816000 ms
    RECEIVING FAILED: Resource temporarily unavailable
    64 bytes from 128.151.77.39: icmp_seq = 1 ttl = 64 time = -998.741000 ms

Я понятия не имею, почему. Я попробовал все другие методы онлайн. Большое спасибо за помощь!

...