2011-09-06 5 views
4

간단한 Unix 데이터 그램 서버/클라이언트를 작성하려고하는데 문제가 있습니다. 내가 원하는 것은 데이터 그램 소켓에서 수신하고 수신 된 모든 메시지에 대한 응답을 원래 보낸 사람에게 보내는 서버입니다. 나는이 같은 "서버"와 C의 클라이언트를 작성하는 내가 실행하고 socat로 socat를 사용하여 첫 번째 시도하기로 결정 내 이해의 자부합니다SOCK_DGRAM을 사용하여 양방향 유닉스 도메인 소켓을 만드는 방법은 무엇입니까?

socat UNIX-DGRAM:/tmp/test.socket,fork EXEC:echo 

/tmp/test.socket에 듣고 모두에 응답해야하는 같은 문자열로 수신됩니까? 그럼 난 (오류 명확성을 위해 제거 확인) 다음과 같습니다 클라이언트 프로그램이 있습니다

int s = socket(AF_UNIX, SOCK_DGRAM, 0); 
struct sockaddr_un sa; 
sa.sun_family = AF_UNIX; 
strcpy(sa.sun_path, "/tmp/test.socket"); 

const char *data = "Testing data"; 
int err = sendto(s, data, strlen(data), 0, (struct sockaddr *)(&sa), sizeof(struct sockaddr_un)); 

printf("Sent!\n"); 

unsigned char *buffer = malloc(BUFFER_LENGTH); 
struct sockaddr_storage recv_sa; 
int recv_sa_len = 0; 
int recv_len = recvfrom(s, buffer, BUFFER_LENGTH, 0, (struct sockaddr *)&recv_sa, &recv_sa_len); 

for (int i = 0; i < recv_len; i++) { 
    putc(buffer[i], stdout); 
} 
printf("\n"); 

그것은 (작동) 패킷을 보내는 패킷을 수신하고 그것을 밖으로 인쇄해야합니다,하지만이 프로그램은 '아무튼 패킷을 수신 할 수있는 것 같습니다. 여기서 내가 잘못하고있는 것입니까, 아니면 유닉스 소켓에 대한 근본적인 오해가 있습니까? 감사!

답변

0

에코 서버에 아무 것도 보내지 않으려면 번을에 연결하기 전에 연결해야합니다.

살펴 보자 장, 그의 책 리눅스 프로그래밍 인터페이스에 발표 된 클라이언트/서버 프로그램 (client, server)의 마이클 케 리스크의 AF_UNIX SOCK_DGRAM의 예를 살펴 http://beej.us/guide/bgipc/output/html/multipage/unixsock.html

+0

가 사건입니다, 나는 데이터 그램 소켓 (안 SOCK_STREAM)를 사용하고 있기 때문에, 그것을 내가 처음부터 연결할 필요없이 어디서나 데이터 그램을 보낼 수있는 UDP와 같은 종류의 기능을해야합니까? 앞서 언급 한 것처럼 클라이언트가 서버에 보내는 부분이 실제로 작동합니다. 감사! – fyhuang

0

소켓은 패킷 수신을 위해 주소 지정이 필요합니다. send 전에 호출하는 경우는 PID 또는 리눅스 사용에 기반을 둔 독특한 소켓 파일 이름으로 bind()를 호출 할 수 있습니다에게 추상적 주소를 autobound :

bind(s, (const struct sockaddr *)&sa, sizeof(sa_family_t));