recvfrom() 将 src_addr 保存为什么字节顺序?
What byte order does recvfrom() save src_addr as?
size_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
src_addr
参数以什么字节顺序写入?网络还是主机?我无法在 recvfrom
手册页或通过 google 和 SO 进行搜索时找到它。
假设套接字是 IPv4 或 IPv6 套接字,src_addr
中存储的主机和端口将按网络字节顺序排列。
这在man page for IPv4 (man 7 ip
)中记录如下:
Address format
An IP socket address is defined as a combination of an IP interface
address and a 16-bit port number. The basic IP protocol does not
supply port numbers, they are implemented by higher level protocols
like udp(7) and tcp(7). On raw sockets sin_port is set to the IP
protocol.
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
is always set to AF_INET
. This is required; in Linux
2.2 most networking functions return EINVAL
when this setting is missing. sin_port
contains the port in network byte order. The
port numbers below 1024 are called privileged ports (or sometimes:
reserved ports). Only a privileged process (on Linux: a process
that has the CAP_NET_BIND_SERVICE capability in the user namespace
governing its network namespace) may bind(2) to these sockets.
Note that the raw IPv4 protocol as such has no concept of a port,
they are implemented only by higher protocols like tcp(7) and
udp(7).
sin_addr
is the IP host address. The s_addr
member of struct
in_addr
contains the host interface address in network byte order.
in_addr
should be assigned one of the INADDR_*
values (e.g.,
INADDR_LOOPBACK
) using htonl(3) or set using the inet_aton(3),
inet_addr(3), inet_makeaddr(3) library functions or directly with
the name resolver (see gethostbyname(3)).
ipv6 手册页有类似的措辞。
所以在读取端口号的时候,用ntohs
提取出来。读取地址时,使用inet_ntop
将其转换为文本形式。
size_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen)
src_addr
参数以什么字节顺序写入?网络还是主机?我无法在 recvfrom
手册页或通过 google 和 SO 进行搜索时找到它。
假设套接字是 IPv4 或 IPv6 套接字,src_addr
中存储的主机和端口将按网络字节顺序排列。
这在man page for IPv4 (man 7 ip
)中记录如下:
Address format
An IP socket address is defined as a combination of an IP interface address and a 16-bit port number. The basic IP protocol does not supply port numbers, they are implemented by higher level protocols
like udp(7) and tcp(7). On raw sockets sin_port is set to the IP protocol.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
is always set toAF_INET
. This is required; in Linux 2.2 most networking functions returnEINVAL
when this setting is missing.sin_port
contains the port in network byte order. The port numbers below 1024 are called privileged ports (or sometimes: reserved ports). Only a privileged process (on Linux: a process that has the CAP_NET_BIND_SERVICE capability in the user namespace governing its network namespace) may bind(2) to these sockets. Note that the raw IPv4 protocol as such has no concept of a port, they are implemented only by higher protocols like tcp(7) and udp(7).
sin_addr
is the IP host address. Thes_addr
member of structin_addr
contains the host interface address in network byte order.in_addr
should be assigned one of theINADDR_*
values (e.g.,INADDR_LOOPBACK
) using htonl(3) or set using the inet_aton(3), inet_addr(3), inet_makeaddr(3) library functions or directly with the name resolver (see gethostbyname(3)).
ipv6 手册页有类似的措辞。
所以在读取端口号的时候,用ntohs
提取出来。读取地址时,使用inet_ntop
将其转换为文本形式。