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