【发布时间】:2013-03-01 22:43:23
【问题描述】:
我在我的程序中使用 recvfrom 从我在 src_addr 中指定的服务器获取 DGRAM 数据。但是,我不确定为什么需要初始化并传入 addrlen。
我阅读了手册页,但我并没有真正理解它的含义。
如果 src_addr 不为 NULL,且底层协议提供源地址,则填写此源地址。当 src_addr 为NULL,什么都不填;在这种情况下, addrlen 不是 已使用,也应为 NULL。参数 addrlen 是一个值结果参数,调用者应该在 调用与 src_addr 关联的缓冲区的大小,以及 返回时修改以指示源地址的实际大小。如果提供的缓冲区太小,返回的地址会被截断; 在这种情况下,addrlen 将返回一个大于提供给调用的值。
我猜这与 src_addr 是 ipv4 或 ipv6 有关。这是正确的吗?
谢谢!
【问题讨论】:
-
是的,这确实与 IPv4 与 IPv6 以及每种所需的不同存储量有关。
-
当接收到您的 DGRAM 时,如果数据包中的协议提供了源地址,则将复制到您使用 src_addr 参数提供的缓冲区中。您将长度值设置为作为 src_addr 传递的缓冲区可以接受的最大大小。如果一切顺利,结果将是填充到缓冲区中的源地址,以及通过地址传递的 addr_len 变量中更新的“已使用”字节数。实际上,您是在说“这是一个缓冲区及其大小。如果可以,请用源地址填充它。如果可以,它会这样做,并更新大小以反映实际计数。
-
在 IP 接管世界之前,存在许多不同类型的网络协议。诸如 DECnet、IPX、AppleTalk、NetBIOS、Banyan 之类的东西。每个人对地址的外观都有自己的想法。是的,今天 ip4 与 ip6。