简体   繁体   English

无法使用Python连接Unix域套接字:没有这样的文件或目录

[英]Can't connect a Unix domain socket using Python: No such file or directory

I have several pieces of codes to establish a Unix domain socket and a service using this socket. 我有几段代码来建立Unix域套接字和使用此套接字的服务。 While there are some confusing errors here leading to a failure. 虽然这里有一些令人困惑的错误导致失败。

the code that creats the Unix domain socket is written in c: 创建Unix域套接字的代码用c编写:

#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/un.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>

int main(int ac, char *av[])
{
if (ac != 4) {
    printf("Usage: %s dummy-fd sockpath binary\n", av[0]);
    exit(-1);
    }

    char *sockpn = av[2];
    char *bin = av[3];

    int srvfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (srvfd < 0) {
    perror("socket");
    exit(-1);
    }

    fcntl(srvfd, F_SETFD, FD_CLOEXEC);

    struct stat st;
    if (stat(sockpn, &st) >= 0) {
    if (!S_ISSOCK(st.st_mode)) {
        fprintf(stderr, "socket pathname %s exists and is not a socket\n",
            sockpn);
        exit(-1);
    }

    unlink(sockpn);
    }

    struct sockaddr_un addr;
    addr.sun_family = AF_UNIX;
    snprintf(&addr.sun_path[0], sizeof(addr.sun_path), "%s", sockpn);
    if (bind(srvfd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
        fprintf(stderr, "WARNING: cannot bind to socket %s (%s), exiting\n",
                sockpn, strerror(errno));
    exit(-1);
    }

    // allow anyone to connect; for access control, use directory permissions
    chmod(sockpn, 0777);

    listen(srvfd, 5);
    signal(SIGCHLD, SIG_IGN);
    signal(SIGPIPE, SIG_IGN);

    for (;;) {
    struct sockaddr_un client_addr;
    unsigned int addrlen = sizeof(client_addr);

    int cfd = accept(srvfd, (struct sockaddr *) &client_addr, &addrlen);
    if (cfd < 0) {
        perror("accept");
        continue;
    }

    int pid = fork();
    if (pid < 0) {
        perror("fork");
        close(cfd);
        continue;
    }

    if (pid == 0) {
        // Child process
        dup2(cfd, 0);
        dup2(cfd, 1);
        close(cfd);

        execl(bin, bin, 0);
        perror("execl");
        exit(-1);
    }

    close(cfd);
    }
}

the client Python to using this sock is as follow(unixclient.py): 使用此袜子的客户端Python如下(unixclient.py):

def call(pn, req):
    sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
    sock.connect(pn)
    sock.send(req)
    sock.shutdown(socket.SHUT_DOWN)
    data = ""
    while True:
        buf = sock.recv(1024)
        if not buf:
             break
        data += buf
    sock.close()
    return data

And I trigger this piece of client code in another Python code, by importing this file and call the call funciton: (Both "/jail/zoobar/echosvc" and "/jail/zoobar/echosvc/sock" will fail) 我触发此片的客户端代码中的另一个Python代码,通过导入此文件并调用call功能可按:(无论“/监狱/ zoobar / echosvc”和“/监狱/ zoobar / echosvc /袜子”将失败)

   resp = call("/jail/zoobar/echosvc", str1)

There the error occurs, showing that: 出现错误,表明:

   FIle "zoobar/unixclient.py", line 8, in call
    sock.connect(pn)
   File "<string>", line 1, in connect
   error: [ERROR 2] No such file or directory

Yet I swear the directory and the socket does exist(/jail/zoobar/echosvc/sock), and the permission is correct, too(777), so I can't understand this weird error. 但是我发誓目录并且套接字确实存在(/ jail / zoobar / echosvc / sock),并且权限也是正确的(777),所以我无法理解这个奇怪的错误。 Does anyone know about it? 有人知道吗?

I would appreciate very much for sparing time to help. 我非常感谢您抽出宝贵的时间来提供帮助。

Looks like you're trying to open the wrong filename. 似乎您正在尝试打开错误的文件名。 The code looks like: 代码如下:

resp = call("/jail/zoobar/echosvc", str1)

But you say "the file exists": 但是您说“文件存在”:

/jail/zoobar/echosvc/sock

Try changing your call line to: 尝试将电话线路更改为:

resp = call("/jail/zoobar/echosvc/sock", str1)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM