Como soquetes nomeados Linux

38

Eu sei que existem soquetes e pipes nomeados (fifo) no Linux.

Em ls -l, eles teriam a seguinte aparência: (alterei os nomes dos arquivos para demonstração.)

prw-r--r-- 1 root root 0 Nov  8 16:31 /tmp/fifo
srwxrwxrwx 1 root root 0 Nov  8 15:54 /tmp/socket

Agora, um pipe nomeado pode ser criado usando mkfifo. Existe um comando para criar um soquete nomeado?

A última opção seria escrever um programa em C, que chamaria a função mknod, mas queria saber se já existe um comando para isso.

O que tentei:
tentei procurar por qualquer opção para o mknod & mkfifo, mas não consegui encontrar uma.

NOTA: Não estou discutindo sobre o modelo servidor-cliente pela Ethernet / rede. O arquivo de soquete nomeado será usado por 2 processos no mesmo sistema.

anishsane
fonte
2
Apenas uma observação: eu tenho 2 processos - qemu e virsh, que podem se comunicar usando soquete nomeado (conforme meu entendimento com base na documentação) Mas não sei como criar um soquete nomeado. Embora existam outras opções para usar o virsh com o qemu, eu estava procurando uma opção, na qual eu possa anexar o virsh a um processo existente do qemu e ele precisa de um soquete nomeado ao iniciar o processo do qemu. O nome fifo não funciona. Além disso, acho que será interessante saber como criar um soquete nomeado, caso seja necessário mais tarde.
Anishsane 8/11

Respostas:

24

Um arquivo de soquete Unix / Linux é basicamente um FIFO bidirecional. Como os soquetes foram criados originalmente como uma maneira de gerenciar as comunicações de rede, é possível manipulá-los usando as chamadas send()e do recv()sistema. No entanto, no espírito Unix de "tudo é um arquivo", você também pode usar write()e read(). Você precisa usar socketpair()ou socket()criar soquetes nomeados. Um tutorial para usar soquetes em C pode ser encontrado aqui: Guia do Beej para Unix IPC: Unix Sockets .

O socatutilitário de linha de comando é útil quando você deseja brincar com soquetes sem escrever um programa "real". É semelhante netcate atua como um adaptador entre diferentes redes e interfaces de arquivos.

Ligações:

Joakim Nohlgård
fonte
1
socketpair () ou socket () cria um soquete sem nome, que será útil apenas de dentro do programa C.
anishsane
Seria interessante verificar se é possível criar um soquete nomeado usando socat. Provavelmente, crie um soquete sem nome, vincule-o ao localhost: some_port e use socat com essa porta?
anishsane
3
É possível criar soquetes nomeados usando socato comando UNIX-LISTEN, consulte man socatou este manual HTML
Joakim Nohlgård
1
Eu tentei este comando rápida e suja e criou um arquivo socket f1: socat UNIX-LISTEN:f1 LISTEN:f2.
Totor
1
Ele está enterrado nos detalhes do site socat, mas, se for útil, há uma sintaxe para tratar dois pipes nomeados unidirecionais (fifo's) como uma única unidade bidirecional que pode ser conectada a outras entidades bidirecionais, como soquetes Unix ou TCP. Você une os pipes nomeados com !!(socat 1.x) ou %(socat 2.x), com o pipe nomeado de escrita à esquerda e o pipe nomeado de leitura à direita. por exemplosocat 'PIPE:/tmp/outstream!!PIPE:/tmp/instream' UNIX-CONNECT:/tmp/mysocket
Ivan X
17

Crie um soquete rapidamente em python:

~]# python -c "import socket as s; sock = s.socket(s.AF_UNIX); sock.bind('/tmp/somesocket')"
~]# ll /tmp/somesocket 
srwxr-xr-x. 1 root root 0 Mar  3 19:30 /tmp/somesocket

Ou com um pequeno programa C , por exemplo, salve o seguinte em create-a-socket.c:

#include <fcntl.h>
#include <sys/un.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    // The following line expects the socket path to be first argument
    char * mysocketpath = argv[1];
    // Alternatively, you could comment that and set it statically:
    //char * mysocketpath = "/tmp/mysock";
    struct sockaddr_un namesock;
    int fd;
    namesock.sun_family = AF_UNIX;
    strncpy(namesock.sun_path, (char *)mysocketpath, sizeof(namesock.sun_path));
    fd = socket(AF_UNIX, SOCK_DGRAM, 0);
    bind(fd, (struct sockaddr *) &namesock, sizeof(struct sockaddr_un));
    close(fd);
    return 0;
}

Em seguida, instale o gcc, compile-o e faça o seguinte:

~]# gcc -o create-a-socket create-a-socket.c
~]# ./create-a-socket mysock
~]# ll mysock
srwxr-xr-x. 1 root root 0 Mar  3 17:45 mysock
rsaw
fonte
1

Não há ferramenta de linha de comando para criar soquetes, pois um soquete sempre está conectado a um servidor que lida com as solicitações enviadas a esse soquete.

Então você terá que escrever um servidor e deixar isso criar o soquete. Aqui está um tutorial .

Aaron Digulla
fonte
Ainda seria um soquete sem nome. Eu quero criar um soquete, que seria usado por outros 2 processos, como o fifo bidirecional.
anishsane
Verifique o link na minha resposta. Ele mostra como configurar bind()para se conectar"/home/beej/mysocket"
Aaron Digulla 8/12