O AF_INET requer a criação de um arquivo de soquete?

1

Pergunta sobre a criação do arquivo de soquete para o AF_INET .

Para AF_UNIX falando no mesmo host, criamos o exemplo de arquivo de soquete /tmp/name_of_the_socket_file

Que tal AF_INET , ele requer que o arquivo de soquete seja criado?

AFAIK, não preciso criar um arquivo de soquete para AF_INET e posso me comunicar com um modelo simples de cliente e servidor.

Meu colega me disse que preciso criar um arquivo de soquete para o endereço AF_INET com IP como o nome do arquivo. Não entendo que alguém possa me esclarecer?

    
por danglingpointer 28.02.2018 / 14:30

1 resposta

3

My colleague told me I need to create socket file for the AF_INET

Seu colega está errado. Dando uma olhada nas páginas de manual de bind(2) você pode ver que diferentes tipos de soquete têm regras:

The rules used in name binding vary between address families. Consult the manual entries in Section 7 for detailed information. For AF_INET, see ip(7); for AF_INET6, see ipv6(7); for AF_UNIX, see packet(7); for AF_X25, see x25(7); and for AF_NETLINK, see netlink(7).

Você verá no ip(7) que não há nenhuma invocação envolvendo AF_INET que possa criar um arquivo . Há também este excelente documento da IBM sobre essa estrutura de soquete e um pouco da história sobre isso . Forma de estrutura legada (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];
};

Estrutura atual:

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 */
};

Veja, nenhuma menção à criação de arquivos.

Citando outra parte do ip(7) manpages sobre como esse tipo de soquete ( AF_INET ) funciona:

When a process wants to receive new incoming packets or connections, it should bind a socket to a local interface address using bind(2). In this case, only one IP socket may be bound to any given local (address, port) pair. When INADDR_ANY is specified in the bind call, the socket will be bound to all local interfaces. When listen(2) is called on an unbound socket, the socket is automatically bound to a random free port with the local address set to INADDR_ANY. When connect(2) is called on an unbound socket, the socket is automatically bound to a random free port or to a usable shared port with the local address set to INADDR_ANY.

- snip--

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.

Mas se você olhar para unix(7) manpages você verá alguns exemplos de AF_UNIX tipo de soquete e sua estrutura básica. Existe até um campo chamado sun_path , que é o caminho para os arquivos de socket (veja Relacionado abaixo):

#define UNIX_PATH_MAX    108

struct sockaddr_un {
  sa_family_t sun_family;               /* AF_UNIX */
  char        sun_path[UNIX_PATH_MAX];  /* pathname */
};

tl, dr: AF_UNIX é para sockets (e usam arquivos), enquanto AF_INET é para ligação a endereços IP e para criar comunicações em suas várias formas (unicast, multicast, broadcast ...).

Itens relacionados:

por 28.02.2018 / 14:50

Tags