Cómo realizar sockets con nombre en Linux

Cómo realizar sockets con nombre en Linux

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

En ls -l, se verían como se muestra a continuación: (He cambiado los nombres de los archivos, 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. ¿Existe 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 existe un comando para eso.

Lo que intenté:
intenté buscar opciones para mknod y mkfifo, pero no pude encontrar ninguna.

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

Respuesta1

Un archivo de socket Unix/Linux es básicamente un FIFO bidireccional. Dado que los sockets se crearon originalmente como una forma de administrar las comunicaciones de la red, es posible manipularlos mediante las llamadas al sistema send()y . recv()Sin embargo, en el espíritu Unix de “todo es un archivo”, también puedes usar write()y read(). Necesita utilizar socketpair()o socket()crear sockets con nombre. Puede encontrar un tutorial para usar sockets en C aquí: Guía de Beej para Unix IPC: sockets Unix.

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 archivos.

Enlaces:

Respuesta2

Cree 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

Ocon 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

Respuesta3

No existe una herramienta de línea de comandos para crear sockets, ya que un socket siempre está conectado a un servidor que maneja las solicitudes enviadas a ese socket.

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

información relacionada