Unix 도메인 소켓으로 몇 가지 테스트를하고 있는데 문제없이 통신 할 수 있습니다. 그러나 내 테스트 프로그램의 서버 측에 accept()
을 호출하면 struct sockaddr_un
sun_path
을 포함하지 않습니다.Unix Domain Sockets : accept() not sun_path를 설정하십시오.
Inet 소켓이 accept()
호출 후에 제대로 주소와 포트를 입력했는지 확신 할 수 있습니다. 테스트 프로그램에서 잘못되었거나 잘못된 결과가 예상됩니까?
CentOS 6.2 및 gcc 4.4.6을 실행 중입니다.
샘플 코드 :
server.c
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define NAME "socket"
int main(int argc, char **argv)
{
int sock, msgsock, rval;
struct sockaddr_un server, client;
char buf[1024];
sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock < 0) {
perror("opening stream socket");
exit(1);
}
server.sun_family = AF_UNIX;
strcpy(server.sun_path, NAME);
if (bind(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un))) {
perror("binding stream socket");
exit(1);
}
printf("Socket has name %s\n", server.sun_path);
listen(sock, 5);
for (;;) {
socklen_t len = sizeof(client);
msgsock = accept(sock, (struct sockaddr *)&client, &len);
if (msgsock == -1)
perror("accept");
else do {
printf("strlen(sun_path) = %zu\n", strlen(client.sun_path));
bzero(buf, sizeof(buf));
if ((rval = read(msgsock, buf, 1024)) < 0)
perror("reading stream message");
else if (rval == 0)
printf("Ending connection\n");
else
printf("-->%s\n", buf);
} while (rval > 0);
close(msgsock);
}
close(sock);
unlink(NAME);
return 0;
}
client.c
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define DATA "Half a league, half a league . . ."
int main(int argc, char **argv)
{
int sock;
struct sockaddr_un server;
if (argc < 2) {
printf("usage:%s <pathname>", argv[0]);
exit(1);
}
sock = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock < 0) {
perror("opening stream socket");
exit(1);
}
server.sun_family = AF_UNIX;
strcpy(server.sun_path, argv[1]);
if (connect(sock, (struct sockaddr *) &server,
sizeof(struct sockaddr_un)) < 0) {
close(sock);
perror("connecting stream socket");
exit(1);
}
if (write(sock, DATA, sizeof(DATA)) < 0)
perror("writing on stream socket");
close(sock);
return 0;
}
그냥 질문을 반복하기 :
후에 작성되지sun_path
왜
accept()
서버를 호출 하시겠습니까?
정말 기적입니다.'len'은'sizeof (sa_family_t)'가되어 소켓에 묶여 있지 않을 때만 일어날 수 있습니다. 그러나 여러분의 경우에는 분명히 바인딩되어 있습니다 ... – kirelagin
나도 노력했습니다. 추상 소켓으로, 다시,이 길이는 항상'2'이며, 그것은 명백히 잘못되었습니다. 이것은 man 페이지에 있습니다. – kirelagin
이것이 정상적인 것 같습니다. 'socketpair()'에 의해 반환 된 소켓과 마찬가지로, 이러한 유형의 소켓은 어떤 경로에도 바인딩되지 않지만 그럼에도 불구하고 다른 끝에있는 다른 소켓에 연결됩니다. – Celada