关于为AF_INET
.
为了AF_UNIX
在同一主机内进行通信,我们创建套接字文件示例/tmp/name_of_the_socket_file
怎么样AF_INET
,是否需要创建套接字文件?
AFAIK,我不需要创建套接字文件,AF_INET
我可以与简单的客户端和服务器模型进行通信。
我的同事告诉我,我需要创建以AF_INET
IP 地址作为文件名的套接字文件,我不明白有人可以澄清我吗?
答案1
我的同事告诉我我需要为
AF_INET
你的同事错了。看看 manpagesbind(2)
可以看到不同的socket类型有规则:
名称绑定中使用的规则因地址族而异。有关详细信息,请参阅第 7 节中的手册条目。对于
AF_INET
,请参阅ip(7)
;对于AF_INET6
,参见ipv6(7)
;对于AF_UNIX
,参见packet(7)
;对于AF_X25
,参见x25(7)
;对于AF_NETLINK
,参见netlink(7)
。
你会看到ip(7)
没有涉及AF_INET
可以创建文件的调用。还有这个厉害的IBM 论文关于这个套接字结构以及它的一些历史。遗留结构形式(BSD 4.4/Unix 98):
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
当前结构:
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 */
};
看,没有提到任何文件创建。
引用其他部分ip(7)
关于这种 socket( AF_INET
) 如何工作的手册页:
当进程想要接收新的传入数据包或连接时,它应该使用将套接字绑定到本地接口地址
bind(2)
。在这种情况下,只有一个 IP 套接字可以绑定到任何给定的本地(地址、端口)对。当INADDR_ANY
在绑定调用中指定 时,套接字将绑定到所有本地接口。当listen(2)
在未绑定的套接字上调用时,该套接字会自动绑定到本地地址设置为 的随机空闲端口INADDR_ANY
。当connect(2)
在未绑定的套接字上调用时,套接字会自动绑定到随机空闲端口或本地地址设置为 的可用共享端口INADDR_ANY
。
--剪断--
地址格式
IP套接字地址被定义为IP接口的组合 地址和 16 位端口号。基本 IP 协议不提供端口号,它们由更高级别的协议(如 udp(7) 和 tcp(7))实现。在原始套接字上,sin_port 设置为 IP 协议。
但如果你看看unix(7)
AF_UNIX
在联机帮助页中,您将看到一些套接字类型及其基本结构的示例。甚至还有一个名为sun_path
套接字文件路径的字段(请参阅下面的相关内容):
#define UNIX_PATH_MAX 108
struct sockaddr_un {
sa_family_t sun_family; /* AF_UNIX */
char sun_path[UNIX_PATH_MAX]; /* pathname */
};
TL,博士: AF_UNIX
用于套接字(它们使用文件),而AF_INET
用于绑定到 IP 地址,并以其各种形式(单播、多播、广播...)创建通信。
相关内容: