Поскольку UDP не основан на соединении (нет вызова connect(sd, ...)
, в котором вы говорите: с этого момента все данные, связанные с дескриптором сокета sd
будут поступать из хорошо известной пары IP-портов), всякий раз, когда вы выдаете recvfrom()
он (попытается) вернуть вам адрес, откуда поступают входящие данные.
Он записывает адрес в src_addr буфер, если он не равен NULL. Этот буфер предоставляется вызывающей стороной, и для его размера должен быть указан параметр addr_len . Он передается по указателю, потому что recvfrom, после использования его для ограничения объема данных, записанных в src_addr , перезапишет его с фактической длиной адреса. Можно сказать, что addr_len является параметром ввода-вывода.
С другой стороны, вызывающий sendto()
будет точно знать адрес назначения, поэтому addr_len в этом случае передается по значению, потому что это параметр только для ввода.
Эта информация четко объяснена в руководстве, которое вы связали в вопросе.