recvfrom()将src_addr另存为什么字节顺序?
收藏

size_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
src_addr参数按什么字节顺序写入?网络还是主机?我在recvfrom主页或谷歌搜索中找不到这个。


最佳答案:

假设套接字是IPv4或IPv6套接字,则存储在src_addr中的主机和端口将按网络字节顺序排列。
这在man page for IPv4 (man 7 ip)中记录如下:
地址格式
IP套接字地址定义为IP接口的组合
地址和16位端口号。基本IP协议没有
提供端口号,它们由更高级别的协议实现
比如udp(7)和tcp(7)。在原始套接字上,端口设置为IP
协议。

   struct sockaddr_in {
       sa_family_t    sin_family; /* address family: AF_INET */
       in_port_t      sin_port;   /* port in network byte order */
       struct in_addr sin_addr;   /* internet address */
   };

   /* Internet address. */
   struct in_addr {
       uint32_t       s_addr;     /* address in network byte order */
   };

sin_family始终设置为AF_INET。这是必需的;在Linux中
2.2当此设置丢失时,大多数网络功能返回EINVALsin_port按网络字节顺序包含端口。这个
低于1024的端口号称为特权端口(有时:
保留端口)。只有特权进程(在Linux上:进程
在用户命名空间中具有cap_net_bind_服务功能的
管理其网络命名空间)可以将(2)绑定到这些套接字。
注意,原始IPv4协议本身没有端口的概念,
它们仅由更高的协议实现,如TCP(7)和
UDP(7)。
sin_addr是IP主机地址。结构的s_addr成员
in_addr按网络字节顺序包含主机接口地址。
in_addr应指定其中一个INADDR_*值(例如,
INADDR_LOOPBACK)使用htonl(3)或使用inet(3)设置,
inet_addr(3)、inet_makeaddr(3)库函数或直接使用
名称解析程序(请参见gethostbyname(3))。
ipv6手册页也有类似的措辞。
因此,当读取端口号时,使用ntohs将其提取出来。读取地址时,使用inet_ntop将其转换为文本格式。

公众号