Разница между формальными параметрами между sendto () и recvfrom () в C - PullRequest
2 голосов
/ 18 октября 2019

Я использую recvfrom () https://linux.die.net/man/2/recvfrom и sendto () https://linux.die.net/man/2/sendto для приема и отправки пакетов UDP

Я заметил, что recvfrom () в качестве последнего параметра требует указатель на переменную для хранения длины адреса сервера, в то время как sendto () требует переменную , в которой хранится длина адреса клиента.

Почему существует эта разница?

Ответы [ 2 ]

3 голосов
/ 18 октября 2019

Я заметил, что recvfrom () в качестве последнего параметра требует указатель на переменную, хранящую длину адреса сервера, в то время как sendto () требует переменную, которая хранит длину адреса клиента.

Вы на самом деле отвечаете на свой вопрос

recvfrom() as last parameter requires a pointer to
the variable storing the length of server address.


while sendto() requires the variable that stores 
the length of the client address.

recvfrom() нужен указатель, потому что он хранит значение в том месте, куда указывает этот указатель. Поскольку в c нет ничего, что называется вызов по ссылке, вам нужно передать указатель для имитации поведения вызова по ссылке.

2 голосов
/ 18 октября 2019

Поскольку UDP не основан на соединении (нет вызова connect(sd, ...), в котором вы говорите: с этого момента все данные, связанные с дескриптором сокета sd будут поступать из хорошо известной пары IP-портов), всякий раз, когда вы выдаете recvfrom() он (попытается) вернуть вам адрес, откуда поступают входящие данные.

Он записывает адрес в src_addr буфер, если он не равен NULL. Этот буфер предоставляется вызывающей стороной, и для его размера должен быть указан параметр addr_len . Он передается по указателю, потому что recvfrom, после использования его для ограничения объема данных, записанных в src_addr , перезапишет его с фактической длиной адреса. Можно сказать, что addr_len является параметром ввода-вывода.

С другой стороны, вызывающий sendto() будет точно знать адрес назначения, поэтому addr_len в этом случае передается по значению, потому что это параметр только для ввода.

Эта информация четко объяснена в руководстве, которое вы связали в вопросе.

...