我刚刚尝试了一个非常简单的示例,以开始使用套接字在C应用程序和Python之间进行通信。这里是非常简单的Python脚本:C和Python之间的Socket通信
import socket
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect("/tmp/demo_socket")
print "Sending..."
s.send("Hello C from Python!")
data = s.recv(1024)
s.close()
print 'Received', repr(data)
在这里,相应的C代码,无需标题:
int main(void)
{
struct sockaddr_un address;
int socket_fd, connection_fd;
socklen_t address_length;
pid_t child;
char buffer[256];
int n;
socket_fd = socket(AF_UNIX, SOCK_STREAM, 0);
if (socket_fd < 0){
printf("socket() failed\n");
return 1;
}
unlink("/tmp/demo_socket");
memset(&address, 0, sizeof(struct sockaddr_un));
address.sun_family = AF_UNIX;
snprintf(address.sun_path, UNIX_PATH_MAX, "/tmp/demo_socket");
if (bind(socket_fd, (struct sockaddr *) &address, sizeof(struct sockaddr_un)) != 0) {
printf("bind() failed\n");
return 1;
}
if(listen(socket_fd, 5) != 0) {
printf("listen() failed\n");
return 1;
}
address_length = sizeof(address);
while((connection_fd = accept(socket_fd,
(struct sockaddr *) &address,
&address_length)) > -1)
{
printf("successfully received data\n");
bzero(buffer,256);
n = read(connection_fd,buffer,255);
if (n < 0) error("ERROR reading from socket");
printf("Here is the message: %s\n\n", buffer);
strcpy(buffer, "Hi back from the C world");
n = write(connection_fd, buffer, strlen(buffer));
if (n < 0)
printf("ERROR writing to socket\n");
break;
}
close(socket_fd);
close(socket_fd);
return(0);
}
的输出是并行运行时,它们如下:
Successfully received data
Here is the message: Hello C from Python!
ERROR writing to socket
close failed in file object destructor:
Error in sys.excepthook:
Original exception was:
所以好消息是,从Python世界收到的东西工作正常,但在尝试写回某些东西时出现错误,而且看起来我最终得到异常。任何人都知道我在这里做错了吗?
编辑:谢谢你们,我这样做,你的建议的修正,消息交换工作正常,只是C-应用程序仍在作祟,我不知道为什么......
close failed in file object destructor:
Error in sys.excepthook:
Original exception was:
当你从'write'中得到错误时,你可以使用['strerror'](http://en.cppreference.com/w/c/string/byte/strerror)打印错误是什么。然而在你的情况下很容易看到......只需检查你正在写入的_which_套接字! –
你得到什么样的错误? – alk
哦,是的,人为失败...... ;-) @JoachimPileborg – alk