Вот для потоковых протоколов, например TCP, сокеты, имеющие функции send/recv полностью адекватны.
Но для датаграммных протоколов, типа UDP, IP, Ethernet, итп функция recv мне кажется совсем неверной по сути. По идее, вместо вызова recv было бы адекватнее из вызывать коллбэк, в который бы передавались данные и длина пришедшего пакета.
На низком уровне собственно так и происходит: сетевая карточка при приходе пакета дергает прерывание и тем самым вызывает обработчик прерывания, входящий в драйвер сетевой карты, который считывает очередной пакет и обрабатывает его.
Это адекватно самому протоколу ethernet.
А вот дальше все это оборачивается в recv, и как мне кажется, совершенно зря.
Точнее, сама то функция может и не так уж плоха, но вот возможности повесить коллбэк на приход пакета явно не хватает