2012-11-07 66 views
1

我刚刚尝试了一个非常简单的示例,以开始使用套接字在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: 
+3

当你从'write'中得到错误时,你可以使用['strerror'](http://en.cppreference.com/w/c/string/byte/strerror)打印错误是什么。然而在你的情况下很容易看到......只需检查你正在写入的_which_套接字! –

+0

你得到什么样的错误? – alk

+0

哦,是的,人为失败...... ;-) @JoachimPileborg – alk

回答

6

你是试图写监听套接字

write(socket_fd, buffer, strlen(buffer)); 

你应该尝试

write(connection_fd, buffer, strlen(buffer)); 
+0

太好了,工作正常。然而,仍然有从C应用程序方面一个奇怪的错误消息:关闭失败的文件对象的析构函数: 错误sys.excepthook: 原始的例外是: – Patrick

+0

@Patrick:什么样的评论? – codewarrior

0

你有警告BEC因为你关闭了两次socket_fd。