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:
'write'에서 오류가 발생하면 [strerror'] (http://en.cppreference.com/w/c/string/byte/strerror)를 사용하여 오류를 인쇄 할 수 있습니다. 그러나 귀하의 경우에는 쉽게 볼 수 있습니다 ... 단지 당신이 쓰고있는 소켓을 확인하십시오! –
어떤 종류의 오류가 발생합니까? – alk
아 그래, 인간의 실패 ...--) @JoachimPileborg – alk