Как обнаружить получение дейтаграммы UDP длиной 0 - PullRequest
9 голосов
/ 15 марта 2011

Я рассматривал написание / реализацию протокола на основе UDP, который использовал бы дейтаграмму нулевой длины в качестве сообщения приветствия. И хотя я не ожидаю проблем с отправкой дейтаграммы нулевой длины, я не уверен, что смогу ее получить.

recvfrom возвращает количество прочитанных байтов, но 0 зарезервировано для упорядоченного отключения.

read возвращает количество прочитанных байтов, но 0 зарезервировано для EOF.

select"будет отслеживаться, чтобы увидеть, станут ли символы доступными для чтения".

Как можно обнаружить получение дейтаграммы нулевой длины?

Ответы [ 2 ]

10 голосов
/ 15 марта 2011

При вызове recvfrom через сокет TCP вы получите считывание нулевого байта, если пакет FIN был получен (упорядоченное завершение работы).UDP не имеет концепции упорядоченного отключения, и от отправителя к получателю не передаются данные, указывающие на закрытие сокета.Протокол полностью не имеет состояния, и каждая полученная дейтаграмма независима от точки зрения получателя.Таким образом, я не знаю ни одного сценария, в котором нулевой байт-код возврата из recvfrom на сокете UDP был бы вызван чем-либо, кроме принимаемой дейтаграммы нулевой длины.

0 голосов
/ 15 июня 2015

Для udp обычный вызов recvfrom вернет 0 при получении пакета udp с полезной нагрузкой 0 длины (см. В Linux, может ли recv когда-либо возвращать 0 по UDP? ).

Вы можете проверить это, выполнив простой тест sendto / recvfrom:

    const int howManyBytesToSend = 0;
    if(sendto(sock, buf, howManyBytesToSend, 0, (struct sockaddr*) &addr, addrlen) < 0)
    {
        return EXIT_FAILURE;
    }

    if((recv_len = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *) &addr, (socklen_t*)&addrlen)) < 0)
    {
        return EXIT_FAILURE;
    }

Документация, которую вы цитируете, находится на странице man для recvfrom: "возвращает количество прочитанных байтов, но 0зарезервировано для упорядоченного отключения ".Это утверждение относится только к TCP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...