Client Server Socket bind connect Listen accept recv
통신 방법 [계속] 연결형 Client Server Socket() bind() connect() 연결요청 Listen() accept() recv() send() 데이터 송수신 send() close() Http: //dblab. hannam. ac. kr recv() 종료 HANNAM UNIVERSITY 5
통신 방법 [계속] 비연결형 Client Server Socket() bind() sendto() recvfrom() 데이터 송수신 recvfrom() close() Http: //dblab. hannam. ac. kr sendto() 종료 HANNAM UNIVERSITY 6
데이터그램의 입력/출력 실행 목차 Ü sendto(2) 함수 소개 Ü recvfrom(2) 함수 소개 Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 9
데이터그램의 입력/출력 실행 [계속] <Sendto() Ü 역할 w 데이터그램 기록 w 수신자의 목적 주소 명시 Ü 구조 #include <sys/types. h> #include <sys/socket. h> Int sendto( int s, Const void *msg, Int len, Unsigned flags, Const struct sockaddr *to, Int tolen); Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 11
데이터그램의 입력/출력 실행 [계속] <recvfrom() Ü 역할 w Sendto()와 쌍을 이룸 w 송신자의 주소 획득 Ü 구조 #include <sys/types. h> #include <sys/socket. h> Int recvfrom( int s, void *buf, Int len, Unsigned flags, struct sockaddr *from, Int *fromlen); Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 13
UDP 데이터그램 서버 작성[계속] Ü 초기화 Int main(int argc, char **argv) { int z; char *srvr_addr = NULL; struct sockaddr_in adr_inet; /* AF_INET */ struct sockaddr_in adr_clnt; /* AF_INET */ int len_inet; /* length */ int s; /* Socket */ char dgram[512]; /* Recv buffer */ char dtfmt[512]; /* Date/Time Result */ time_t td; /* Current Time and Date */ 0 struct tm tm; /* Date time values */ if ( argc >= 2 ) { /* Addr on cmdline: */ srvr_addr = argv[1]; } else { /* Use default address: */ srvr_addr = "127. 0. 0. 23"; } Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 16
UDP 데이터그램 서버 작성[계속] Ü 소켓 생성 s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); Ü 주소 생성 memset(&adr_inet, 0, sizeof adr_inet); adr_inet. sin_family = AF_INET; adr_inet. sin_port = htons(9090); adr_inet. sin_addr. s_addr = inet_addr(srvr_addr); if ( adr_inet. sin_addr. s_addr == INADDR_NONE ) bail("bad address. "); len_inet = sizeof adr_inet; Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 17
UDP 데이터그램 서버 작성[계속] Ü 주소 결합 z = bind(s, (struct sockaddr *)&adr_inet, len_inet); if ( z == -1 ) bail("bind()"); Ü 대기 for (; ; ) { } close(s); return 0; } Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 18
UDP 데이터그램 서버 작성[계속] Ü 수신 len_inet = sizeof adr_clnt; z = recvfrom(s, /* Socket */ dgram, /* Receiving buffer */ sizeof dgram, /* Max recv buf size */ 0, /* Flags: no options */ (struct sockaddr *)&adr_clnt, /* Addr */ &len_inet); /* Addr len, in & out */ if ( z < 0 ) bail("recvfrom(2)"); Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 19
UDP 데이터그램 서버 작성[계속] Ü 응답 w 요청 처리 dgram[z] = 0; /* null terminate */ if ( !strcasecmp(dgram, "QUIT") ) break; /* Quit server */ time(&td); tm = *localtime(&td); strftime(dtfmt, sizeof dtfmt, dgram, &tm); Http: //dblab. hannam. ac. kr /* Get current time & date */ /* Formatted result */ /* Max result size */ /* Input date/time format */ HANNAM UNIVERSITY 20
UDP 데이터그램 서버 작성[계속] w 메시지 송신 z = sendto(s, /* Socket to send result */ dtfmt, /* The datagram result to snd */ strlen(dtfmt), /* The datagram lngth */ 0, /* Flags: no options */ (struct sockaddr *)&adr_clnt, /* addr */ len_inet); /* Client address length */ if ( z < 0 ) bail("sendto(2)"); Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 21
UDP 데이터그램 서버 작성[계속] Ü 서버 프로그램 실행 방법 w 백그라운드로 실행 $. /dgramsrvr & [1] 4339 w 다른 IP로 실행 $. /dgramsrvr 192. 168. 0. 1 & [1] 4341 Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 22
UDP 데이터그램 클라이언트 작성[계속] Ü초기화 Int main(int argc, char **argv) { int z; int x; char *srvr_addr = NULL; struct sockaddr_in adr_srvr; struct sockaddr_in adr; int len_inet; int s; char dgram[512]; /* AF_INET */ /* length */ /* Socket */ if ( argc >= 2 ) { /* Addr on cmdline: */ srvr_addr = argv[1]; } else { /* Use default address: */ srvr_addr = "127. 0. 0. 23"; Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 24
UDP 데이터그램 클라이언트 작성[계속] Ü주소 생성 memset(&adr_srvr, 0, sizeof adr_srvr); adr_srvr. sin_family = AF_INET; adr_srvr. sin_port = htons(9090); adr_srvr. sin_addr. s_addr = inet_addr(srvr_addr); if ( adr_srvr. sin_addr. s_addr == INADDR_NONE ) bail("bad address. "); len_inet = sizeof adr_srvr; Ü소켓 생성 s = socket(AF_INET, SOCK_DGRAM, 0); if ( s == -1 ) bail("socket()"); Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 25
UDP 데이터그램 클라이언트 작성[계속] Ü사용자 입력 fputs("n. Enter format string: ", stdout); if ( !fgets(dgram, sizeof dgram, stdin) ) break; /* EOF */ z = strlen(dgram); if ( z > 0 && dgram[--z] == 'n' ) dgram[z] = 0; Ü메시지 전송 Http: //dblab. hannam. ac. kr z = sendto(s, /* Socket to send result */ dgram, /* The datagram result to snd */ strlen(dgram), /* The datagram lngth */ 0, /* Flags: no options */ (struct sockaddr *)&adr_srvr, /* addr */ len_inet); /* Server address length */ if ( z < 0 ) bail("sendto(2)"); if ( !strcasecmp(dgram, "QUIT") ) break; HANNAM UNIVERSITY 26
UDP 데이터그램 클라이언트 작성[계속] Ü메시지 수신 x = sizeof adr; z = recvfrom(s, /* Socket */ dgram, /* Receiving buffer */ sizeof dgram, /* Max recv buf size */ 0, /* Flags: no options */ (struct sockaddr *)&adr, /* Addr */ &x); /* Addr len, in & out */ if ( z < 0 ) bail("recvfrom(2)"); dgram[z] = 0; Ü결과 출력 printf("Result from %s port %u : nt'%s'n", inet_ntoa(adr. sin_addr), (unsigned)ntohs(adr. sin_port), dgram); Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 27
데이터그램 클라이언트와 서버 테스트 <서버 실행 방법 $. /dgramsrvr & [1] 4405 <클라이언트 실행 방법 $. /dgramclnt Enter format string : Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 30
데이터그램 클라이언트와 서버 테스트 <서버 없는 테스트 $. /dgramclnt Enter format string : %D Connection refused : recvfrom(2) $ Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 31
데이터그램 클라이언트와 서버 테스트 <다른 IP 주소로 테스트 Ü 서버 실행 [ 192. 168. 0. 1 ] $. /dgramsrvr 192. 168. 0. 1 & [1] 4416 Ü 클라이언트 실행 [ 192. 168. 0. 2 ] $. /dgramclnt 192. 168. 0. 1 Enter format string : %D Result from 192. 168. 0. 1 port 9090: ’ 08/13/99’ Enter format string : QUIT $ Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 32
데이터그램 클라이언트와 서버 테스트 <Wild 주소의 적용 Ü printf(3) 구문의 추가 Prinft(“Client from %s port %u; n, inet_ntoa(adr_clnt. sin_addr), (unsigned)ntohs(adr_clnt. sin_port)); Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 33
요약 Http: //dblab. hannam. ac. kr HANNAM UNIVERSITY 34
- Slides: 34