
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 socat
utilidad de línea de comando es útil cuando quieres jugar con sockets sin escribir un programa "real". Es similar netcat
y 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.