关于为AF_INET
.
为了AF_UNIX
在同一主机内进行通信,我们创建套接字文件示例/tmp/name_of_the_socket_file
怎么样AF_INET
,是否需要创建套接字文件?
AFAIK,我不需要创建套接字文件AF_INET
,我可以与简单的客户端和服务器模型进行通信。
我的同事告诉我,我需要创建以AF_INET
IP 地址作为文件名的套接字文件,我不明白有人可以澄清我吗?
小智 5
我的同事告诉我我需要为
AF_INET
你的同事错了。查看联机帮助页bind(2)
可以发现不同的套接字类型有规则:
名称绑定中使用的规则因地址族而异。有关详细信息,请参阅第 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];
};
Run Code Online (Sandbox Code Playgroud)
当前结构:
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 */
};
Run Code Online (Sandbox Code Playgroud)
看,没有提到任何文件创建。
引用手册页的其他部分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 */
};
Run Code Online (Sandbox Code Playgroud)
tl,dr: AF_UNIX
用于套接字(它们使用文件),而AF_INET
用于绑定到 IP 地址,并以其各种形式(单播、多播、广播...)创建通信。
相关内容:
归档时间: |
|
查看次数: |
1323 次 |
最近记录: |