[질문] 간단한 소켓 플밍
글쓴이: gostop / 작성시간: 수, 2004/03/31 - 4:59오전
소켓 프로그래밍을 공부중입니다.
아래는 제가 만들어본 간단한 echo 클라이언트 소스입니다.
#define SIZE 1024 void error(char *m) { fputs(m, stderr); fputc('\n', stderr); exit(1); } void usage(char *u) { fprintf(stderr, "usage: %s -h <hostname or ip> -p <port>\n", u); exit(1); } int main(int argc, char **argv) { int ch, sock, len, port; char echo[SIZE], *hostname; struct sockaddr_in addr; struct hostent *host; if(argc<3) { usage(argv[0]); } while((ch=getopt(argc, argv, "h:p"))!=EOF) { switch(ch) { case 'h': hostname=optarg; break; case 'p': port=atoi(optarg); break; default: usage(argv[0]); } } if(!(host=gethostbyname(hostname))) error("gethostbyname() error!"); sock=socket(PF_INET, SOCK_STREAM, 0); if(sock==-1) error("socket() error!"); memset(echo, 0, SIZE); memset(&addr, 0, sizeof(addr)); addr.sin_family=AF_INET; addr.sin_addr=*(struct in_addr *)host->h_addr; addr.sin_port=htons(port); if(connect(sock, (struct sockaddr *)&addr, sizeof(addr))==-1) error("connect() error!"); while(1) { fputs("message <q to quit>: ", stdout); fgets(echo, SIZE, stdin); if(!strcmp(echo, "q\n")) break; write(sock, echo, strlen(echo)); len=read(sock, echo, SIZE-1); echo[len]=0; printf("message from server: %s\n", echo); } close(sock); return 0; }
컴파일은 잘 되는데 실행하면 세그폴트가 떨어지네요.
뭐가 잘못 된걸까요?
그리고 위의 프로그램에서 -h 1.1.1.1 처럼 도메인네임이 아닌 아이피를 주면 어떻게 되나요?
제가 지금 공부하는 책에선 gethostbyname() 에 대한 설명이 자세히 안나와서 잘 모르겠습니다.
또, 책에선 socket() 함수의 인자로 PF_INET을 쓰는걸로 나와있는데..
여기저기 검색하다 보니 대부분 AF_INET으로 쓰네요..
즉 socket(AF_INET, SOCK_STREAM, 0);
이런식으로요..
어짜피 같은 값이니 상관은 없겠지만 대부분 저렇게 사용하던데 제가 모르는 특별한 이유가 있나요?
답변에 미리 감사드립니다.
Forums:
PF_INET은 protocol familyAF_INET은 add
PF_INET은 protocol family
AF_INET은 address family로 알고있는데...
지금은 그 정의된 값이 같아서 문제없을지 모르겠지만
이왕이면 정확한 의미상으로나, 나중을 대비해서라도
변수나 함수가 요구하는대로 주는 게 좋을 것 같습니다.
답변 감사합니다.역시 특별한 이유는 없고 책에 나온데로 해주는게 정석
답변 감사합니다.
역시 특별한 이유는 없고 책에 나온데로 해주는게 정석인가 보군요.
근데 위의 2문제는 아직도 잘 모르겠네요.
연구좀 해봐야겠습니다.
댓글 달기