gpt4 book ai didi

python - 使用抽象命名空间 unix 套接字时连接被拒绝

转载 作者:行者123 更新时间:2023-11-30 17:08:54 25 4
gpt4 key购买 nike

在使用 Python 和“纯”C 时(Python 3.x,但看起来 2.x 也有同样的问题),我在使用所谓的抽象命名空间的 unix 套接字(美国)方面遇到了一个奇怪的问题。“普通” socket 就像一个魅力。对于“抽象”US,我的代码仅当我使用相同的“代码平台”(C 或 Python)时才有效。

首先,我认为它与 memset/str(n)cpy 有关(请参阅 Can not connect to an abstract unix socket in python ),但恕我直言,情况并非如此。

测试矩阵(srv - 服务器,cli - 客户端):

  • srv + cli @“抽象”unix sock:
    • python + python = 确定
    • c + c = 确定
  • srv + cli @“普通”unix sock:
    • python + python = 确定
    • c + c = 确定
  • srv + cli @“普通”unix sock:
    • python + c = 确定
    • c + python = 好
  • srv + cli @“抽象”unix sock:
    • python + c = FAIL [cli/strace 输出:ECONNREFUSED(连接被拒绝)]
    • c + python = FAIL [cli/引发异常:socket.error: [Errno 111] 连接被拒绝]

/proc/net/unix/lsofstrace 没有显示任何异常:

  • 工作“正常”套接字 C 客户端:
    //...
    套接字(PF_LOCAL,SOCK_STREAM,0)= 3
    connect(3, {sa_family=AF_LOCAL, sun_path=@"/var/tmp/sock.tmp"}, 110) = 0
    //...

  • “抽象”套接字 C 客户端行为不当:
    //...
    套接字(PF_LOCAL,SOCK_STREAM,0)= 3
    connect(3, {sa_family=AF_LOCAL, sun_path=@"/var/tmp/sock.tmp"}, 110) = -1 ECONNREFUSED(连接被拒绝)
    //...

Python 错误还是什么......?

带有我的测试矩阵的代码示例的要点:https://gist.github.com/soutys/ffbe2e76a86835a9cc6b

原始代码/示例:

更新2015-11-02

有关系统和编译的更多信息:

  • 主机系统:Ubuntu 14.04.3 LTS (x64);
  • 使用 gcc 编译的所有 C 测试文件(例如:gcc -Wall -Wextra -pedantic -o abs_cli abs_cli.c);
  • 所有程序(编译的和内置的 python)都以非 root 用户身份运行;

最佳答案

将 UNIX 域套接字绑定(bind)到抽象名称时,addrlen 参数应为 sizeof(struct sockaddr_un's sun_family) + 抽象名称中的字符数 + 1。“+1”表示抽象名称前面的空字节sockaddr_un 的 sun_path 中的名称。让我们看一个例子:

  • 服务器位于 C:

    int sockfd;
    struct sockaddr_un addr;
    /* create socket, set addr.sun_family, set addr.sun_path to
    null byte followed by abstract_name */
    bind(sockfd, (struct sockaddr *)&addr, sizeof(addr.sun_family) +
    strlen(abstract_name) + 1);
  • Python 客户端:

    client = socket.socket(socket.AF_UNIX, ...)
    client.connect( "\0abstract_name" )

引用文献:

关于python - 使用抽象命名空间 unix 套接字时连接被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33465094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com