AWPStar писал(а):Я думаю. Это input-аргумент. Он передает значение, а не возвращает. Это не размер буфера.
Ты неправильно думаешь. Дважды неправильно.
Это не input-аргумент. Это input/output-аргумент в случае
recvfrom.
Через него передаётся указатель на ячейку памяти, которая на входе содержит размер буфера, предоставленного вызывающей стороной под запись адресной структуры.
На выходе из функции туда записывается количество реально записанных байтов.
Это не буфер под данные, верно, но это буфер (произвольного размера), куда функция запишет адрес, вернее структуру, кодирующую адрес. Поскольку может использоваться разная адресация, может быть использовано множество разных sockaddr-структур разного размера (под IPv4 — одна структура с одним размером, под IPv6 — другая структура с другим размером, под ещё какой-то протокол, над которым тоже можно инкапсулировать UDP — ещё какая-то третья структура со своим размером).
Поэтому функция сделана именно так, чтобы программист мог скормить ей заведомо большой буфер и при этом иметь возможность сообщить функции, насколько велик этот буфер, чтобы функция не вышла случайно за его пределы, записывая туда данные, а после возврата мог как-то посмотреть, сколько именно было записано. Это буфер не под данные, а под адрес, который записывается в виде структур, имеющих разную
структуру, в зависимости от используемого уровнем ниже протокола.