[질문] 간단한 소켓 플밍
글쓴이: 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문제는 아직도 잘 모르겠네요.
연구좀 해봐야겠습니다.
댓글 달기