Linux llamado cómo hacer sockets

38

Sé que hay sockets con nombre y tubos con nombre (fifo) en Linux.

En ls -l, se verían a continuación: (He cambiado los nombres de archivo, para demostración).

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

Ahora, se puede crear una tubería con nombre usando mkfifo. ¿Hay un comando para crear un socket con nombre?

La última opción sería escribir un programa en C, que llamaría a la función mknod, pero quería saber si ya hay un comando para eso.

Lo que he intentado:
intenté buscar cualquier opción para mknod & mkfifo, pero no pude encontrar una.

NOTA: No estoy discutiendo sobre el modelo servidor-cliente a través de Ethernet / red. El archivo de socket con nombre será utilizado por 2 procesos en el mismo sistema.

anishsane
fuente
2
Solo una nota: tengo 2 procesos: qemu y virsh, que pueden comunicarse entre sí mediante un socket con nombre (según mi entendimiento basado en la documentación) Pero no sé cómo crear un socket con nombre. Si bien hay otras opciones para usar virsh con qemu, estaba buscando una opción, en la que puedo adjuntar virsh a un proceso de qemu existente y necesita un socket con nombre , al iniciar el proceso de qemu. Nombrado quince no funciona. Además, creo que será interesante saber cómo crear un socket con nombre, en caso de que se requiera más adelante.
anishsane

Respuestas:

24

Un archivo de socket Unix / Linux es básicamente un FIFO bidireccional. Desde tomas fueron creados originalmente como una forma de gestionar las comunicaciones de red, es posible manipularlos utilizando las send()y recv()llamadas al sistema. Sin embargo, en el espíritu de Unix de "todo es un archivo", también puede usar write()y read(). Necesita usar socketpair()o socket()crear sockets con nombre. Puede encontrar un tutorial para usar sockets en C aquí: Guía de Beej para Unix IPC: Unix Sockets .

La socatutilidad de línea de comando es útil cuando quieres jugar con sockets sin escribir un programa "real". Es similar netcaty actúa como un adaptador entre diferentes redes e interfaces de archivo.

Campo de golf:

Joakim Nohlgård
fuente
1
socketpair () o socket () crea un socket sin nombre, que será útil solo desde el programa C.
anishsane
Sería interesante comprobar si es posible crear un socket con nombre usando socat. Probablemente, cree un socket sin nombre, vincúlelo a localhost: some_port y luego use socat con ese puerto.
anishsane
3
Es posible crear sockets socatcon nombre usando el comando UNIX-LISTEN, vea man socato este manual HTML
Joakim Nohlgård
1
Probé este comando rápido y sucio, y se creó un archivo de socket f1: socat UNIX-LISTEN:f1 LISTEN:f2.
Totor
1
Está enterrado en los detalles del sitio web de socat, pero en caso de que sea útil, hay una sintaxis para tratar dos tuberías con nombre unidireccionales (fifo) como una sola unidad bidireccional que se puede conectar a otras entidades bidireccionales como los enchufes Unix o TCP. !!Une las canalizaciones con nombre con (socat 1.x) o %(socat 2.x), con la escritura de la tubería con nombre a la izquierda y la lectura de la tubería con nombre a la derecha. por ejemplosocat 'PIPE:/tmp/outstream!!PIPE:/tmp/instream' UNIX-CONNECT:/tmp/mysocket
Ivan X
17

Crea un socket rápidamente en 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

O con un pequeño programa en C , por ejemplo, guarde lo siguiente en 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;
}

Luego instale gcc, compílelo y ta-da:

~]# 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
fuente
1

No existe una herramienta de línea de comando para crear sockets, ya que un socket siempre se conecta a un servidor que maneja las solicitudes enviadas a ese socket.

Entonces tendrá que escribir un servidor y dejar que eso cree el socket. Aquí hay un tutorial .

Aaron Digulla
fuente
Eso todavía sería un socket sin nombre. Quiero crear un socket, que sería utilizado por otros 2 procesos, como Fifo bidireccional.
anishsane
Mira el enlace en mi respuesta. Muestra cómo configurar bind()para conectarse"/home/beej/mysocket"
Aaron Digulla