创建套接字文件是否需要 AF_INET?

创建套接字文件是否需要 AF_INET?

关于为AF_INET.

为了AF_UNIX在同一主机内进行通信,我们创建套接字文件示例/tmp/name_of_the_socket_file

怎么样AF_INET,是否需要创建套接字文件?

AFAIK,我不需要创建套接字文件,AF_INET我可以与简单的客户端和服务器模型进行通信。

我的同事告诉我,我需要创建以AF_INETIP 地址作为文件名的套接字文件,我不明白有人可以澄清我吗?

答案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 地址,并以其各种形式(单播、多播、广播...)创建通信。

相关内容:

相关内容