Эта библиотека пытается быть совместимой с т.н. "сокетами Беркли", поэтому половина функций названы по прототипам 80-х годов. А что не влезло -- по современным. Это создаёт путаницу. Тогда ещё не было методологии именования функций, в т.ч. системных, поэтому функции приёма и передачи данных называются просто recv и send. А что в программе могут быть другие функции отправки и приёма другими способами -- никого не волнует.

recv просто так не вернёт вам управление, пока не получит данные или пока не сработает таймаут. Да, у меня на приём отдельный поток, но всё равно я хочу иногда чем-нибудь ещё заниматься, а не только ждать, пока мне пришлют запрос. Как же проверить, сколько байт пришло?

А для этого есть специальный флаговый параметр, который должен быть установлен в MSG_PEEK. Тогда мы сразу получим то, что уже готово.

Функция возвращает число типа int. Оно обозначает количество принятых байт. Если нам пока ничего не пришло, сколько байт вернётся? Наверное, ноль.

Но нет. Ноль зарезервирован для случая отключения второй стороны/ошибки связи. А сколько должна вернуть функция, если ничего не пришло, в документации Microsoft не указано!

Поэтому я поставил эксперимент и обнаружил, что в случае, если данные не пришли, recv возвращает -1. Это оказалось неожиданно.

Пожалуйста, ознакомьтесь с комментариями!