如何创建公共unix域套接字?

如何创建公共unix域套接字?

考虑/var/run/acpid.socket。我可以随时连接到它并断开连接。与以下内容进行比较nc

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

nc显然只允许一次性插座。那么问题是,如何创建一个类似于 的套接字/var/run/acpid.socket以供多次使用和重用?

答案1

您可以选择-k来执行此操作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.

例子:

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

建议unlink()在使用后使用套接字——但事实上,大多数程序会检查它是否存在并将其删除呼唤bind()它;如果文件系统中存在套接字路径并且您尝试访问它,即使没有程序以任何方式使用它,bind()您也会收到错误。EADDRINUSE

在 Linux 上避免这种混乱的一种方法是使用“抽象的”unix 套接字,但它们似乎不受netcat.

相关内容