2012-11-07 9 views
1

C app과 Python 사이에서 통신하기 위해 소켓을 시작하기위한 간단한 예제를 시도했습니다. 헤더없이C와 Python 사이의 소켓 통신

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: 

좋은 소식은 파이썬 세계에서 물건을받은 것은 잘 작동하지만 뭔가를 다시 쓰려고 할 때 오류가 발생하고 결국 예외가 생기는 것 같습니다. 누구나 내가 여기서 뭘 잘못하고 있는거야?

편집 : 고마워, 난 당신이 제안한 보정을했다, 메시지 교환 잘, 단지 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)를 사용하여 오류를 인쇄 할 수 있습니다. 그러나 귀하의 경우에는 쉽게 볼 수 있습니다 ... 단지 당신이 쓰고있는 소켓을 확인하십시오! –

+0

어떤 종류의 오류가 발생합니까? – alk

+0

아 그래, 인간의 실패 ...--) @JoachimPileborg – alk

답변

6

확실하지 않다 청취 소켓에 쓰기를 시도

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

당신은

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

위대한, 잘 작동합니다. 그러나 C 응용 프로그램 측면에서 여전히 이상한 오류 메시지가 있습니다. 파일 객체 소멸자에서 닫기가 실패했습니다. sys.excepthook의 오류 : 원본 예외 : – Patrick

+0

@ 패트릭 : 어떤 종류의 코멘트일까요? – codewarrior

0

당신은 경고 BEC를 시도해야한다 당신은 두 번 socket_fd를 닫습니다.