0
제 질문은 AF_UNIX와 SOCK_DGRAM을 사용하는 IPC에 관한 것입니다. 코드에서 일부 오류 검사를 제거한 후 내 서버 코드는 다음과 같습니다SOCK_DGRAM을 사용하여 AF_UNIX를 사용하면 유닉스 소켓 이름 길이에 문제가 발생합니다.
는sd = socket(AF_UNIX, SOCK_DGRAM, 0);
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sun_family = AF_UNIX;
strcpy(serveraddr.sun_path, SERVER_PATH);
length = BUFFER_LENGTH;
rc = setsockopt(sd, SOL_SOCKET, SO_RCVLOWAT, (char *)&length, sizeof(length));
rc = bind(sd, (struct sockaddr *)&serveraddr, SUN_LEN(&serveraddr));
rc = recv(sd, buffer, sizeof(buffer), 0));
코드에서 일부 오류 검사를 제거한 후 내 클라이언트 코드는 다음과 같습니다
sd = socket(AF_UNIX, SOCK_DGRAM, 0);
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sun_family = AF_UNIX;
strcpy(serveraddr.sun_path, SERVER_PATH);
memset(buffer, 'a', sizeof(buffer));
socklen_t server_length = sizeof(struct sockaddr);
sendto(sd, buffer, sizeof(buffer), 0, (struct sockaddr *)&serveraddr, server_length);
weired 문제는 내가이의 거짓말을 볼 수 있습니다 SERVER_PATH의 정의. 내 SERVER_PATH의 길이가 14자를 넘으면 클라이언트 전송 (...)이 오류 ("해당 파일 또는 디렉토리 없음")와 함께 실패합니다.
몇 가지 포인트는주의 사항 : 내가 레드햇 64 비트를 사용하고
- . 다음과 같이 내가 SERVER_PATH을 정의
- : #DEFINE의 SERVER_PATH "/ tmp를/aaaaaaaaaa을"
- 내가 연결을 추가 한 후 SOCK_DGRAM하지만 SOCK_STREAM를 (사용하지 않도록 코드를 변경할 때, 듣고 http://publib.boulder.ibm.com/infocenter/iseries/v6r1m0/index.jsp?topic=/rzab6/xafunixcl.htm과 같이 코드 방법을 수용 및 http://publib.boulder.ibm.com/infocenter/iseries/v5r3/index.jsp?topic=/rzab6/rzab6xafunixsrv.htm 소켓 이름 길이 아무 문제가 없습니다.
어떤 생각?
내 문제를 발견했으면 좋겠지 만 문제는 아닙니다. 덕분에 . – Oded
죄송합니다. 귀하의 제안을 다시 확인했으며 문제가 해결 된 것으로 보입니다. 감사합니다. – Oded
반갑습니다. – NPE