Python服务器和c客户端不工作的Unix域套接字(找不到套接字文件)

Python服务器和c客户端不工作的Unix域套接字(找不到套接字文件),python,c,sockets,ipc,unix-socket,Python,C,Sockets,Ipc,Unix Socket,我不熟悉unix域套接字(但对套接字的一般概念并不完全陌生),并尝试让用Python编写的服务器与用C编写的客户机通信,以了解更多关于它们的信息。我使用了和中的代码示例。据我理解,它们应该是兼容的。我唯一更改的是套接字路径,因此它们是相同的。但是,当我尝试连接它们时(尽管它们位于同一目录中,python服务器创建套接字文件),客户机无法找到套接字文件的路径。当我使用Python服务器和客户机或C套接字和客户机时,它工作得非常好,但我需要它与Python服务器和C客户机一起工作。我正在运行OSX,

我不熟悉unix域套接字(但对套接字的一般概念并不完全陌生),并尝试让用Python编写的服务器与用C编写的客户机通信,以了解更多关于它们的信息。我使用了和中的代码示例。据我理解,它们应该是兼容的。我唯一更改的是套接字路径,因此它们是相同的。但是,当我尝试连接它们时(尽管它们位于同一目录中,python服务器创建套接字文件),客户机无法找到套接字文件的路径。当我使用Python服务器和客户机或C套接字和客户机时,它工作得非常好,但我需要它与Python服务器和C客户机一起工作。我正在运行OSX,在服务器上使用Python2.7,并使用gcc编译客户端


编辑: 这是我的服务器代码:

import socket
import sys
import os

server_address = 'echo_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(100)
            print >>sys.stderr, 'received "%s"' % data
            if data:
                print >>sys.stderr, 'sending data back to the client'
                connection.sendall(data)
            else:
                print >>sys.stderr, 'no more data from', client_address
                break

    finally:
        # Clean up the connection
        connection.close()
这是我的客户代码:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCK_PATH "echo_socket"

int main(void)
{
    int s, t, len;
    struct sockaddr_un remote;
    char str[100];

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

    printf("Trying to connect...\n");

    remote.sun_family = AF_UNIX;
    strcpy(remote.sun_path, SOCK_PATH);
    len = strlen(remote.sun_path) + sizeof(remote.sun_family);
    if (connect(s, (struct sockaddr *)&remote, len) == -1) {
        perror("connect");
        exit(1);
    }

    printf("Connected.\n");

    while(printf("> "), fgets(str, 100, stdin), !feof(stdin)) {
        if (send(s, str, strlen(str), 0) == -1) {
            perror("send");
            exit(1);
        }

        if ((t=recv(s, str, 100, 0)) > 0) {
            str[t] = '\0';
            printf("echo> %s", str);
        } else {
            if (t < 0) perror("recv");
            else printf("Server closed connection\n");
            exit(1);
        }
    }

    close(s);

    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义SOCK\u路径“echo\u socket”
内部主(空)
{
int s,t,len;
结构sockaddr_un remote;
char-str[100];
if((s=socket(AF_UNIX,SOCK_STREAM,0))=-1){
佩罗(“插座”);
出口(1);
}
printf(“正在尝试连接…\n”);
remote.sun_family=AF_UNIX;
strcpy(remote.sun\u路径、SOCK\u路径);
len=strlen(remote.sun_路径)+sizeof(remote.sun_族);
如果(连接,(结构sockaddr*)和远程,len)=-1){
perror(“连接”);
出口(1);
}
printf(“已连接。\n”);
而(printf(“>”),fgets(str,100,stdin),!feof(stdin)){
如果(发送(s,str,strlen(str),0)=-1){
佩罗(“发送”);
出口(1);
}
如果((t=recv(s,str,100,0))>0){
str[t]='\0';
printf(“echo>%s”,str);
}否则{
如果(t<0)perror(“recv”);
else printf(“服务器关闭连接”);
出口(1);
}
}
关闭(s);;
返回0;
}

由于我没有UDS方面的经验,我非常感谢您的帮助


提前谢谢

请出示您的实际代码。我们怎么知道你是否输入了错误的东西,或者只是修改了“这一点点”,或者一百万个其他原因导致代码不起作用?我确实只修改了一行,但没问题。我再加上。等等,我不知道这是否是问题的根本原因,但客户端示例中似乎至少有一个bug。上面说:“描述封闭的sockaddr_un结构的addrlen参数的值应至少为:
offsetof(struct sockaddr_un,sun_path)+strlen(addr.sun_path)+1
”。示例代码缺少
+1
。好的,我试试看,谢谢!(尽管它与C服务器一起工作)是的,它工作了!非常感谢你!请出示您的实际代码。我们怎么知道你是否输入了错误的东西,或者只是修改了“这一点点”,或者一百万个其他原因导致代码不起作用?我确实只修改了一行,但没问题。我再加上。等等,我不知道这是否是问题的根本原因,但客户端示例中似乎至少有一个bug。上面说:“描述封闭的sockaddr_un结构的addrlen参数的值应至少为:
offsetof(struct sockaddr_un,sun_path)+strlen(addr.sun_path)+1
”。示例代码缺少
+1
。好的,我试试看,谢谢!(尽管它与C服务器一起工作)是的,它工作了!非常感谢你!