size_t recvfrom(int sockfd,void * buf,size_t len,int flags,struct sockaddr * src_addr,socklen_t * addrlen)
以什么字节顺序写入src_addr参数?网络还是主机?我找不到这个……
假设套接字是IPv4或IPv6套接字,则存储的主机和端口 src_addr 将按网络字节顺序排列。
src_addr
这是记录在 IPv4手册页( man 7 ip ) 如下:
man 7 ip
地址格式 IP套接字地址定义为IP接口的组合 地址和16位端口号。基本的IP协议没有 提供端口号,它们由更高级别的协议实现 像udp(7)和tcp(7)。在原始套接字上,sin_port设置为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大多数网络功能返回 EINVAL 何时缺少此设置。 的 sin_port 包含网络字节顺序的端口。 强> 该 低于1024的端口号称为特权端口(或有时: 保留港口)。只有一个特权进程(在Linux上:一个进程 在用户命名空间中具有CAP_NET_BIND_SERVICE功能 管理其网络命名空间)可以绑定(2)这些套接字。 请注意,原始IPv4协议本身没有端口的概念, 它们只能由更高级的协议实现,如tcp(7)和 UDP(7)。 的 sin_addr 是IP主机地址。该 s_addr 结构的成员 in_addr 包含网络字节顺序的主机接口地址。 强> in_addr 应该分配一个 INADDR_* 价值观(例如, INADDR_LOOPBACK )使用htonl(3)或使用inet_aton(3)设置, inet_addr(3),inet_makeaddr(3)库函数或直接用 名称解析器(参见gethostbyname(3))。
地址格式
IP套接字地址定义为IP接口的组合 地址和16位端口号。基本的IP协议没有 提供端口号,它们由更高级别的协议实现 像udp(7)和tcp(7)。在原始套接字上,sin_port设置为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大多数网络功能返回 EINVAL 何时缺少此设置。 的 sin_port 包含网络字节顺序的端口。 强> 该 低于1024的端口号称为特权端口(或有时: 保留港口)。只有一个特权进程(在Linux上:一个进程 在用户命名空间中具有CAP_NET_BIND_SERVICE功能 管理其网络命名空间)可以绑定(2)这些套接字。 请注意,原始IPv4协议本身没有端口的概念, 它们只能由更高级的协议实现,如tcp(7)和 UDP(7)。
sin_family
AF_INET
EINVAL
sin_port
的 sin_addr 是IP主机地址。该 s_addr 结构的成员 in_addr 包含网络字节顺序的主机接口地址。 强> in_addr 应该分配一个 INADDR_* 价值观(例如, INADDR_LOOPBACK )使用htonl(3)或使用inet_aton(3)设置, inet_addr(3),inet_makeaddr(3)库函数或直接用 名称解析器(参见gethostbyname(3))。
sin_addr
s_addr
in_addr
INADDR_*
INADDR_LOOPBACK
ipv6手册页有类似的措辞。
所以在读取端口号时,请使用 ntohs 提取它。阅读地址时,请使用 inet_ntop 将其转换为文本形式。
ntohs
inet_ntop