Como criar um soquete de domínio unix público?

1

Considere /var/run/acpid.socket . A qualquer momento, posso me conectar a ele e me desconectar dele. Compare isso com nc :

$ nc -l -U ./myunixsocket.sock
Ncat: bind to ./myunixsocket.sock: Address already in use. QUITTING.

nc aparentemente permite apenas soquetes de uso único. A questão é, então, como criar um soquete análogo a /var/run/acpid.socket , para uso múltiplo e reutilização?

    
por Sergiy Kolodyazhnyy 21.09.2018 / 09:09

1 resposta

1

Você faz isso com a opção -k para nc .

-k      Forces nc to stay listening for another connection after its cur-
         rent connection is completed.  It is an error to use this option
         without the -l option.  When used together with the -u option,
         the server socket is not connected and it can receive UDP data-
         grams from multiple hosts.

Exemplo:

$ rm -f /tmp/socket    # unlink the socket if it already exists
$ nc -vklU /tmp/socket # the server
Connection from mack  received!
yes
Connection from mack  received!
yes
...

É recomendado para unlink() o socket após o uso - mas, na verdade, a maioria dos programas verifica se ele existe e o remove antes de chamar bind() nele; se o caminho do soquete existir no sistema de arquivos e você tentar bind() , você receberá um erro EADDRINUSE mesmo quando nenhum programa estiver usando-o de alguma forma.

Uma forma de evitar toda essa bagunça no linux é usar " abstract ", mas eles não parecem ser suportados por netcat .

    
por 21.09.2018 / 14:16