C 语言中 sendto() 和 recvfrom() 形式参数的区别

Formal Parameters difference between sendto() and recvfrom() in C

我正在使用 recvfrom() and sendto() 接收和发送 UDP 数据包。

我注意到 recvfrom() 作为最后一个参数需要 指向变量的指针 存储服务器地址的长度,而 sendto() 需要 存储客户端地址长度的变量

为什么会有这种差异?

I have noticed that 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() 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 中没有所谓的引用调用,因此您需要传递指针来模拟引用调用行为。

由于 UDP 不是基于连接的(没有 connect(sd, ...) 调用,您在其中说:从现在开始,与套接字描述符 sd 相关的所有数据都将来自众所周知的 IP 端口对),每当您发出 recvfrom() 时,它都会(尝试)return 您输入数据来源的地址。

将地址写入src_addr缓冲区,如果不为NULL。此缓冲区由调用者提供,其大小必须在设置 addr_len 参数中指定。它是指针传递的,因为recvfrom(),用它来限制写入src_addr的数据量后,会用实际覆盖它 地址长度。我们可以说addr_len是一个输入输出参数。

另一方面,sendto()的调用者会确切地知道目标地址,所以addr_len在这种情况下是按值传递的,因为是一个仅供输入的参数。

您在问题中链接的指南中清楚地解释了此信息。