간단한 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");
그것은 (작동) 패킷을 보내는 패킷을 수신하고 그것을 밖으로 인쇄해야합니다,하지만이 프로그램은 '아무튼 패킷을 수신 할 수있는 것 같습니다. 여기서 내가 잘못하고있는 것입니까, 아니면 유닉스 소켓에 대한 근본적인 오해가 있습니까? 감사!
가 사건입니다, 나는 데이터 그램 소켓 (안 SOCK_STREAM)를 사용하고 있기 때문에, 그것을 내가 처음부터 연결할 필요없이 어디서나 데이터 그램을 보낼 수있는 UDP와 같은 종류의 기능을해야합니까? 앞서 언급 한 것처럼 클라이언트가 서버에 보내는 부분이 실제로 작동합니다. 감사! – fyhuang