daemon socket 코드 주석달린부분 설명좀..
글쓴이: domiisa / 작성시간: 금, 2011/04/01 - 12:24오후
제 역량까지는 알겠는데 주석친부분 자세한 설명좀 부탁드립니다.
#include <stdio.h> #include <string.h> #include <unistd.h> #include <stddef.h> #include <sys/socket.h> #include <sys/un.h> int makeAddr(const char* name, struct sockaddr_un* pAddr, socklen_t* pSockLen) { int nameLen = strlen(name); //nameLen = 19 /* 값:107 담을공간보다 Len이 크면 에러 pAddr = 110 , ->sun_path = 108 이러케 나오는데 -1해주는 이유??? */ if (nameLen >= (int) sizeof(pAddr->sun_path) -1) return -1; pAddr->sun_path[0] = '\0'; /* 왜 첫번째 배열만 초기화??? */ strcpy(pAddr->sun_path+1, name); //위에와같이 첫번째만 초기화하고 2번째부터 넣나여? pAddr->sun_family = AF_LOCAL; *pSockLen = 1 + nameLen + offsetof(struct sockaddr_un, sun_path); return 0; } int main(int argc, char** argv) { static const char* message = "hello, world!"; struct sockaddr_un sockAddr; socklen_t sockLen; int result = 1; //c와s 가 왜나오는지 모르겠네요?? argc는 파일 갯수.. if (argc != 2 || (argv[1][0] != 'c' && argv[1][0] != 's')) { printf("Usage: {c|s}\n"); return 2; } if (makeAddr("com.test.uds", &sockAddr, &sockLen) < 0) return 1; int fd = socket(AF_LOCAL, SOCK_STREAM, PF_UNIX); if (fd < 0) { perror("client socket()"); return 1; } if (argv[1][0] == 's') { printf("SERVER %s\n", sockAddr.sun_path+1); if (bind(fd, (const struct sockaddr*) &sockAddr, sockLen) < 0) { perror("server bind()"); goto bail; } if (listen(fd, 5) < 0) { perror("server listen()"); goto bail; } int clientSock = accept(fd, NULL, NULL); if (clientSock < 0) { perror("server accept"); goto bail; } char buf[64]; memset(buf, 0, 64); int count = read(clientSock, buf, sizeof(buf)); if (count < 0) { perror("server read"); goto bail; } printf("GOT: '%s'\n", buf); char buff2[513]; memset(buff2, 0, 513); memset(buff2, 100, 512); //sprintf(buff2, "test_%s", buf); write(clientSock, buff2, strlen(buff2)); close(clientSock); } result = 0; bail: close(fd); return result; }
Forums:
코드 전체를 보지는 않았습니다만, 몇가지 대답을
코드 전체를 보지는 않았습니다만, 몇가지 대답을 드리자면요..
1.
makeAddr()함수의 성공여부를 return value로 알려주는 것입니다.
부분에 사용되고 있네요.
2.
우선 argc는 파일갯수가 아니고, command line의 argument의 갯수 입니다.
만약 프로그램 이름이 'abc'라고 한다면,
"./abc c" 또는 "./abc s"처럼 argument로 'c'또는 's'를 받겠다는 의미입니다.
c와 s는 client와 server로 보이는군요 :)
==============================
꿈꾸는소년
댓글 달기