3

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

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

为什么会有这种差异?

4

2 回答 2

3

我注意到 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没有所谓的引用调用,因此您需要传递指针来模拟引用调用行为。

于 2019-10-18T12:25:55.027 回答
2

由于 UDP 不是基于连接的(没有connect(sd, ...)你说的调用:从现在开始,与套接字描述符相关的所有数据sd都将来自一个众所周知的 IP 端口对),无论何时发出recvfrom()它都会(尝试)返回地址传入数据的来源。

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

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

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

于 2019-10-18T12:34:47.170 回答