我正在使用recvfrom()
andsendto()
来接收和发送 UDP 数据包。
我注意到recvfrom()
最后一个参数需要一个指向存储服务器地址长度的变量的指针,而sendto()
需要存储客户端地址长度的变量。
为什么会有这种差异?
我注意到 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
没有所谓的引用调用,因此您需要传递指针来模拟引用调用行为。
由于 UDP 不是基于连接的(没有connect(sd, ...)
你说的调用:从现在开始,与套接字描述符相关的所有数据sd
都将来自一个众所周知的 IP 端口对),无论何时发出recvfrom()
它都会(尝试)返回地址传入数据的来源。
如果它不为 NULL,它会将地址写入src_addr缓冲区。此缓冲区由调用者提供,并且必须通过设置addr_len参数指定其大小。它是通过指针传递的,因为recvfrom()
在使用它来限制写入src_addr的数据量之后,会用实际的地址长度覆盖它。我们可以说addr_len是一个输入输出参数。
sendto()
另一方面,的调用者将确切地知道目标地址,因此在这种情况下addr_len是按值传递的,因为它是一个仅输入参数。
您在问题中链接的指南中清楚地解释了此信息。