什么是 .sock 文件以及如何与它们通信

Jul*_*son 7 sockets netcat

  • 什么是 .sock 文件?
  • 如何与 .sock 文件通信?

详细说明第二个要点,我知道 .sock 文件用于进程间通信。我如何与他们“交流”?假设一个 sock 文件旨在以特定方式响应(例如:它需要输入“时间”并打印出当前时间)。

与 C/C++ 相比,我更喜欢更高级别的编程语言(python)。如果有人可以将我指向一些应用程序(比如 nc 也许?),我可以用它以快速而肮脏的方式与 .sock 文件进行通信,那也会更好?

谢谢

小智 5

Sock 文件是套接字文件,它们是通信管道中的端点。

如何创建套接字文件:

  • 让 uwsgi 在与服务器(例如 nginx)交互时创建它们 sudo uwsgi --ini /path/to/ini/file/ 在 ini 文件中,您需要将路径传递到要添加套接字文件的位置。ini 文件将在 UNIX 系统上位于 /etc/uwsgi/sites/*.ini

  • 使用高级语言创建套接字文件尝试 python: python -c "import socket as s; sock = s.socket(s.AF_UNIX); sock.bind('/tmp/test.sock')"

  • 使用 nc 服务器端有: nc -l -p 1234 客户端有: nc -l -p 1234 这样你就有了一个可以通信的开放套接字。我把这个留在这里


Ser*_*yan 2

这里是有关在 Python 中使用套接字的详细信息

\n\n

https://pymotw.com/2/socket/uds.html

\n\n

netcat-openbsd您可以使用或与套接字通信socat

\n\n

nc -U <path_to_socket_file>

\n\n

socat - UNIX-CONNECT:<path_to_socket_file>

\n\n

第二部分的来源:https://unix.stackexchange.com/questions/26715/how-can-i-communicate-with-a-unix-domain-socket-via-the-shell-on-debian-squeeze

\n\n

更新:这是从第一个链接获取的套接字服务器的示例

\n\n
import socket\nimport sys\nimport os\n\nserver_address = \'./uds_socket\'\n\n# Make sure the socket does not already exist\ntry:\n    os.unlink(server_address)\nexcept OSError:\n    if os.path.exists(server_address):\n        raise\n\n# Create a UDS socket\nsock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)\n\n# Bind the socket to the port\nprint >>sys.stderr, \'starting up on %s\' % server_address\nsock.bind(server_address)\n\n# Listen for incoming connections\nsock.listen(1)\n\nwhile True:\n    # Wait for a connection\n    print >>sys.stderr, \'waiting for a connection\'\n    connection, client_address = sock.accept()\n    try:\n        print >>sys.stderr, \'connection from\', client_address\n\n        # Receive the data in small chunks and retransmit it\n        while True:\n            data = connection.recv(16)\n            print >>sys.stderr, \'received "%s"\' % data\n            if data:\n                print >>sys.stderr, \'sending data back to the client\'\n                connection.sendall(data.upper())\n            else:\n                print >>sys.stderr, \'no more data from\', client_address\n                break\n\n    finally:\n        # Clean up the connection\n        connection.close()\n
Run Code Online (Sandbox Code Playgroud)\n\n

将其保存到名为sock.py的文件中并运行

\n\n
~/Development/temp \xe1\x90\x85 python sock.py\nstarting up on ./uds_socket\nwaiting for a connection\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后使用socat连接

\n\n
~/Development/temp \xe1\x90\x85 socat - UNIX-CONNECT:uds_socket\nhello\nHELLO\n
Run Code Online (Sandbox Code Playgroud)\n\n

写一些东西 - 你会收到同样的东西,但以大写形式作为回复。

\n