Информация об изменениях

Сообщение Re: Socket успешно прочитал 0 байт :( проблемы от 21.05.2020 7:52

Изменено 23.05.2020 9:08 Aquilaware

Re: Socket успешно прочитал 0 байт :( проблемы
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>Как в таких случаях быть?


Удивлен, что до сих пор никто не дал правильного ответа.

Чтение сокета может возвращать ноль если:

1) Происходит реакция сетевого стека на фрагментацию пакетов. Фрагментация может возникать с определенными устройствами в определенных конфигурациях сети при определенных нагрузках или сценариях. Обычно, в локальной сети фрагментация возникает редко, и поэтому многие неопытные разработчики даже не догадываются о такой возможности, потому что она редко (или почти) не возникает в тепличных условиях
2) Спонтанное пробуждение примитивов ожидания ОС, вызванное особенностями работы ядра (обычное явление во многих ОС)

Что делать если сокет вернул 0 или меньше чем ожидалось?

Продолжать читать до тех пор, пока не наберете нужный обьем информации! Или пока сокет не отвалится с ошибкой.
Re: Socket успешно прочитал 0 байт :( проблемы
Здравствуйте, vvv848165@ya.ru, Вы писали:

VYR>Как в таких случаях быть?


Удивлен, что до сих пор никто не дал правильного ответа.

Чтение сокета может возвращать ноль если:

1) Происходит реакция сетевого стека на фрагментацию пакетов. Фрагментация может возникать с определенными устройствами в определенных конфигурациях сети при определенных нагрузках или сценариях. Обычно, в локальной сети фрагментация возникает редко, и поэтому многие неопытные разработчики даже не догадываются о такой возможности, потому что она редко (или почти) не возникает в тепличных условиях
2) Спонтанное пробуждение примитивов ожидания ОС, вызванное особенностями работы ядра (обычное явление во многих ОС)

Что делать если сокет вернул меньше чем ожидалось?

Продолжать читать до тех пор, пока не наберете нужный обьем информации! Или пока сокет не отвалится с ошибкой.

ПОПРАВКА: как верно подметили коллеги, эти рекомендации слишком общие и напоминают сферического коня в ваккуме.

Поэтому нужно учитывать ОС, на которой работает ваше приложение. Подитожу:

  1. В некоторых встраиваемых системах: чтение сокета может спорадически возвращать ноль в виду перечисленных выше причин, и при этом не означать закрытия сокета или ошибки. Это говорит о неполноценной реализации сетевого стека конкретной ОС
  2. Windows: чтение сокета возвращает ноль только при полном или частичном закрытии сокета. Такой сокет уже считается закрытым на чтение, и все дальнейшие попытки прочитать из него будут всегда моментально возвращать 0. Это не означает ошибку, это означает закрытый сокет.
  3. Unix: чтение сокета возвращает ноль только если система не желает удерживать системный вызов в блокирующем состоянии (EINTR, EGAIN, EWOULDBLOCK) или при полном/частичном закрытии сокета.