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

15
  • 什么是 .sock 文件?
  • 我如何与 .sock 文件进行通信?

针对第二个问题,我了解到 .sock 文件用于进程间通信。我该如何“通信”?假设一个 sock 文件被设计为以特定方式响应(例如:它接收“time”输入并打印出当前时间)。

我更喜欢高级编程语言(如 Python)而不是 C/C++。如果有人能指点一些应用程序(例如 nc),让我以快速而简单的方式与 .sock 文件通信,那就更好了。

谢谢


请提供一些上下文,以便我们知道您在问什么。您在哪里遇到了一个“.sock”文件? - President James K. Polk
詹姆斯,.sock文件已经预先编程提供了“挑战-响应”算法。例如: 我对.sock说:“我的用户名” .sock对我说:“这是你的令牌:a_token”。我需要找出如何以双向方式与.sock通信。 - Julian Simpson
你好,欢迎来到StackOverflow!为了获得更好的答案,并且避免你的回答被删除,你需要阅读并遵守一些基本规则和约定,这将有助于大家更好地沟通和帮助。请访问https://stackoverflow.com/help,并阅读关于“我可以在这里询问哪些主题?”和“应避免提出哪些类型的问题?”的主题。 - Jonathan Gagne
2个回答

5

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

如何创建套接字文件:

  • 让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 这样您就有了一个可以进行通信的开放式套接字。 我在这里留下这个。

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

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

您可以使用netcat-openbsdsocat来使用套接字进行通信。

nc -U <path_to_socket_file>

socat - UNIX-CONNECT:<path_to_socket_file>

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

更新:以下是从第一个链接中提取的套接字服务器示例。

import socket
import sys
import os

server_address = './uds_socket'

# Make sure the socket does not already exist
try:
    os.unlink(server_address)
except OSError:
    if os.path.exists(server_address):
        raise

# Create a UDS socket
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)

# Bind the socket to the port
print >>sys.stderr, 'starting up on %s' % server_address
sock.bind(server_address)

# Listen for incoming connections
sock.listen(1)

while True:
    # Wait for a connection
    print >>sys.stderr, 'waiting for a connection'
    connection, client_address = sock.accept()
    try:
        print >>sys.stderr, 'connection from', client_address

        # Receive the data in small chunks and retransmit it
        while True:
            data = connection.recv(16)
            print >>sys.stderr, 'received "%s"' % data
            if data:
                print >>sys.stderr, 'sending data back to the client'
                connection.sendall(data.upper())
            else:
                print >>sys.stderr, 'no more data from', client_address
                break

    finally:
        # Clean up the connection
        connection.close()

将此保存为名为sock.py的文件并运行。
~/Development/temp ᐅ python sock.py
starting up on ./uds_socket
waiting for a connection

然后使用socat进行连接。
~/Development/temp ᐅ socat - UNIX-CONNECT:uds_socket
hello
HELLO

“写点什么 - 你会收到同样的东西但是是大写的作为回复。”

我安装了netcat-openbsd和socat。看起来我可以向.sock发送消息,但似乎无法收集它生成的响应: nc: user:~/test$ nc -U /path/to/the.sock user:~/test$socat: user:~/test$ socat - UNIX-CONNECT:/path/to/the.sock user:~/test$如何收集由/path/to/the.sock生成的响应。 - Julian Simpson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接