uname2 utsname struct utsname char sysnameSYSNMLN char nodenameSYSNMLN

  • Slides: 42
Download presentation

호스트 정보 얻기(계속) – uname(2) <utsname 구조체 struct utsname { char sysname[SYS_NMLN]; char nodename[SYS_NMLN];

호스트 정보 얻기(계속) – uname(2) <utsname 구조체 struct utsname { char sysname[SYS_NMLN]; char nodename[SYS_NMLN]; char release[SYS_NMLN]; char version[SYS_NMLN]; char machine[SYS_NMLN]; char domainname[SYS_NMLN]; }; http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 5

호스트 정보 얻기(계속) – uname(2) <utsname 구초체의 멤버 Member Description sysname 운영체제의 이름 nodename

호스트 정보 얻기(계속) – uname(2) <utsname 구초체의 멤버 Member Description sysname 운영체제의 이름 nodename 호스트 이름 release 시스템의 릴리즈 수준 version 시스템의 버전 번호 machine 시스템의 하드웨어 타입 domainname NIS/YP 도메인 이름 http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 6

호스트 정보 얻기(계속) <초기화 ÜLine 15 : struct utsname u_name; <uname(2)함수 호출 ÜLine 17

호스트 정보 얻기(계속) <초기화 ÜLine 15 : struct utsname u_name; <uname(2)함수 호출 ÜLine 17 : z = uname(&u_name) http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 8

호스트 정보 얻기(계속) <구조체에 접근하여 호스트 정보 출력 ÜLine 25~36 : printf(“ printf(“ http:

호스트 정보 얻기(계속) <구조체에 접근하여 호스트 정보 출력 ÜLine 25~36 : printf(“ printf(“ http: //syssw. hannam. ac. kr sysname[] = ‘%s’; n”, u_name. sysname); nodename[] = ‘%s’; n”, u_name. nodename); release[] = ‘%s’; n”, u_name. release); version[] = ‘%s’; n”, u_name. version); machine[] = ‘%s’; n”, u_name. machine); domainname[] = ‘%s’; n”, u_name. domainname); HANNAM UNIVERSITY 9

호스트 정보 얻기(계속) <실행 결과 $. /uname sysname[] = 'Linux'; nodename[] = 'syssw. hannam.

호스트 정보 얻기(계속) <실행 결과 $. /uname sysname[] = 'Linux'; nodename[] = 'syssw. hannam. ac. kr'; release[] = '2. 2. 14'; version[] = '#1 SMP Sun Jun 25 16: 07: 10 KST 2000'; machine[] = 'i 686'; domainname[] = '(none)'; http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 10

호스트네임 얻기– gethostname(2) <gethostname(2) 함수 Ü현재 호스트 네임을 얻는다. <함수 원형 #include <unistd. h>

호스트네임 얻기– gethostname(2) <gethostname(2) 함수 Ü현재 호스트 네임을 얻는다. <함수 원형 #include <unistd. h> int gethostname(char *name, size_t len); <에러 처리 Ü성공 : 음수가 아닌 정수 반환 Ü에러 : – 1을 반환하고 errno를 설정 http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 11

도메인 네임 얻기 – getdomainname(2) <getdomainname(2)함수 Ü호스트의 NIS 도메인 네임을 기록 <함수 원형 #include

도메인 네임 얻기 – getdomainname(2) <getdomainname(2)함수 Ü호스트의 NIS 도메인 네임을 기록 <함수 원형 #include <unistd. h> int getdomainname(char *name, size_t len); <에러 처리 Ü성공 : 음수가 아닌 정수 반환 Ü에러 : – 1을 반환하고 errno를 설정 http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 12

호스트네임과 도메인 네임 얻기 <예제 9 -2 gethostn. c 초기화 gethostname(2)함수 호출 호스트네임 출력

호스트네임과 도메인 네임 얻기 <예제 9 -2 gethostn. c 초기화 gethostname(2)함수 호출 호스트네임 출력 getdomainname(2)함수 호출 도메인 네임 출력 http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 13

호스트네임과 도메인 네임 얻기(계속) <초기화 ÜLine 13 : int z; ÜLine 14 : char

호스트네임과 도메인 네임 얻기(계속) <초기화 ÜLine 13 : int z; ÜLine 14 : char buf[32]; <gethostname(2) 함수 호출 ÜLine 16 : z = gethostname(buf, sizeof buf); <호스트네임 출력 ÜLine 24 : printf(“host name = ‘%s’n”, buf); http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 14

호스트네임과 도메인 네임 얻기(계속) <getdomainname(2)함수 호출 ÜLine 26 : z = getdomainname(buf, sizeof buf);

호스트네임과 도메인 네임 얻기(계속) <getdomainname(2)함수 호출 ÜLine 26 : z = getdomainname(buf, sizeof buf); <도메인 네임 출력 ÜLine 34 : printf(“domain name = ‘%s’n”, buf); http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 15

호스트네임과 도메인 네임 얻기(계속) <실행 결과 $. /gethostn host name = 'syssw. hannam. ac.

호스트네임과 도메인 네임 얻기(계속) <실행 결과 $. /gethostn host name = 'syssw. hannam. ac. kr' domain name = '(none)' http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 16

원격지 주소 분석(계속) <에러 검출 Üerrno에 세팅되지 않고 h_errno에 세팅된다. Ü원형 #include <netdb. h>

원격지 주소 분석(계속) <에러 검출 Üerrno에 세팅되지 않고 h_errno에 세팅된다. Ü원형 #include <netdb. h> extern int h_errno; http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 18

원격지 주소 분석(계속) <h_errno 에러 사용 함수 Ügethostbyname(3) Ügethostbyaddr(3) <h_errno를 인수로 사용하는 함수 Üherror(3)

원격지 주소 분석(계속) <h_errno 에러 사용 함수 Ügethostbyname(3) Ügethostbyaddr(3) <h_errno를 인수로 사용하는 함수 Üherror(3) Ühstrerror(3) http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 19

원격지 주소 분석(계속) <Error code Error Macro HOST_NOT_FOUND Description 호스트 이름을 알 수 없다

원격지 주소 분석(계속) <Error code Error Macro HOST_NOT_FOUND Description 호스트 이름을 알 수 없다 NO_ADDRESS IP 주소가 없다. NO_DATA NO_ADDRESS와 동일 NO_RECOVERY TRY_AGAIN http: //syssw. hannam. ac. kr 회수 불가능한 네임서버 에러 나중에 다시 시도 HANNAM UNIVERSITY 20

원격지 주소 분석(계속) < gethostbyname(3) 함수 Ü 호스트 데이터베이스 정보를 수집 < 함수 원형

원격지 주소 분석(계속) < gethostbyname(3) 함수 Ü 호스트 데이터베이스 정보를 수집 < 함수 원형 #include <netdb. h> extern int h_error; struct hostent *gethostbyname(const char *name); < 에러처리 Ü 실패 시 널(null) 포인터를 반환 Ü h_errno 에 에러 원인을 포함 http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 21

원격지 주소 분석(계속) <hostent 구조체 struct hostent { char *h_name; char **h_aliases; char h_addrtype

원격지 주소 분석(계속) <hostent 구조체 struct hostent { char *h_name; char **h_aliases; char h_addrtype char h_length; char **h_addr_list; }; http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 22

원격지 주소 분석(계속) <예제 9. 4 lookup. c - gethostbyname(3) 함수 초기화 gethostbyname(3)함수 호출

원격지 주소 분석(계속) <예제 9. 4 lookup. c - gethostbyname(3) 함수 초기화 gethostbyname(3)함수 호출 hostent구조체 접근 호스트 정보 출력 http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 24

원격지 주소 분석(계속) < 초기화 Ü Line 15 : extern int h_errno; Ü Line

원격지 주소 분석(계속) < 초기화 Ü Line 15 : extern int h_errno; Ü Line 19 : int x, x 2; Ü Line 20 : struct hostent *hp; < gethostbyname(3)함수 호출 Ü Linet 26 : hp = gethostbyname(argv[x]); if ( !hp ){ /* Report lookup failure */ fprintf(stderr "%s: host '%s'", hstrerror(h_errno), argv[x]); continue; } http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 25

원격지 주소 분석(계속) <구조체에 접근하여 호스트 정보 출력 ÜLine 40 : printf(“ Officially: t%sn”,

원격지 주소 분석(계속) <구조체에 접근하여 호스트 정보 출력 ÜLine 40 : printf(“ Officially: t%sn”, hp ->h_name); ÜLine 46 : fputs(“ Aliases: t”, stdout); for (x 2=0; hp ->h_aliases[x 2]; ++x 2){ if ( x 2) fputs(“, “, stdout); fputs(hp ->h_aliases[x 2], stdout); } http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 26

원격지 주소 분석(계속) ÜLine 49 : printf(“ Type: tt%sn”, hp ->h_addrtype == AF_INET ?

원격지 주소 분석(계속) ÜLine 49 : printf(“ Type: tt%sn”, hp ->h_addrtype == AF_INET ? “AF_INET” : “AF_INET 6”); ÜLine 53 : if ( hp ->h_addrtype == AF_INET) { for ( x 2=0; hp ->h_addr_list[x 2]; ++x 2) printf(“ Address: t%sn”, inet_ntoa( *(struct in_addr *) hp ->h_addr_list[x 2])); http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 27

원격지 주소 분석(계속) <실행 결과 $. /lookup www. lwn. net sunsite. unc. edu ftp.

원격지 주소 분석(계속) <실행 결과 $. /lookup www. lwn. net sunsite. unc. edu ftp. redhat. com Host www. lwn. net : Officially: lwn. net Aliases: www. lwn. net Type: AF_INET Address: 216. 40. 34. 70 Host sunsite. unc. edu : Officially: sunsite. unc. edu Aliases: Type: AF_INET Address: 152. 2. 210. 81 http: //syssw. hannam. ac. kr Host ftp. redhat. com : Officially: ftp. redhat. com Aliases: Type: AF_INET Address: 63. 240. 14. 64 Address: 216. 148. 218. 201 Address: 63. 240. 14. 63 Address: 216. 148. 218. 192 Address: 63. 240. 14. 62 Address: 216. 148. 218. 202 HANNAM UNIVERSITY 28

원격지 주소 분석(계속) <gethostbyaddr(3) 함수 Ü특정한 IP 주소를 가지는 호스트를 검사 Ü서버상에서 클라이언트의 호출

원격지 주소 분석(계속) <gethostbyaddr(3) 함수 Ü특정한 IP 주소를 가지는 호스트를 검사 Ü서버상에서 클라이언트의 호출 위치 파악 <함수 원형 #include <sys/socket> Struct hostent *gethostbyaddr( const char *addr, /* Input address */ int len, /* Address length */ int type); /* Address type */ http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 29

원격지 주소 분석(계속) <초기화 ÜLine 35 : http: //syssw. hannam. ac. kr int z;

원격지 주소 분석(계속) <초기화 ÜLine 35 : http: //syssw. hannam. ac. kr int z; char *srvr_addr = NULL; char *srvr_port = "9099"; struct sockaddr_in adr_srvr; /* AF_INET */ struct sockaddr_in adr_clnt; /* AF_INET */ int len_inet; /* length */ int s; /* Socket */ int c; /* Client socket */ int n; /* bytes */ time_t td; /* Current date&time */ char dtbuf[128]; /* Date/Time info */ FILE *logf; /* Log file for the server */ struct hostent *hp; /* Host entry ptr */ HANNAM UNIVERSITY 31

원격지 주소 분석(계속) <로그파일 열기 ÜLine 52 : if ( !(logf = fopen("srvr 2.

원격지 주소 분석(계속) <로그파일 열기 ÜLine 52 : if ( !(logf = fopen("srvr 2. log", "w")) ) bail("fopen(3)"); <로그파일 기록(1) ÜLine 138 : fprintf(logf, "Client %s: ", inet_ntoa(adr_clnt. sin_addr)); http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 32

원격지 주소 분석(계속) <서버 주소 설정 ÜLine 62 : if ( argc >= 2

원격지 주소 분석(계속) <서버 주소 설정 ÜLine 62 : if ( argc >= 2 ) /* Addr on cmdline: */ srvr_addr = argv[1]; else /* Use default address: */ srvr_addr = "127. 0. 0. 1"; <서버 포트 설정 ÜLine 74 : http: //syssw. hannam. ac. kr if ( argc >= 3 ) srvr_port = argv[2]; HANNAM UNIVERSITY 33

원격지 주소 분석(계속) <gethostbyaddr(3) 함수 호출 ÜLine 142 : hp = gethostbyaddr( (char *)&adr_clnt.

원격지 주소 분석(계속) <gethostbyaddr(3) 함수 호출 ÜLine 142 : hp = gethostbyaddr( (char *)&adr_clnt. sin_addr, sizeof adr_clnt. sin_addr, adr_clnt. sin_family); <로그파일 기록(2) ÜLine 151 : fprintf(logf, " %s", hp->h_name); http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 34

원격지 주소 분석(계속) <클라이언트에 날짜 출력 ÜLine 158 : time(&td); n = (int) strftime(dtbuf,

원격지 주소 분석(계속) <클라이언트에 날짜 출력 ÜLine 158 : time(&td); n = (int) strftime(dtbuf, sizeof dtbuf, "%A %b %d %H: %M: %S %Y", localtime(&td)); <연결종료 ÜLine 173 : close(C); http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 35

원격지 주소 분석(계속) <실행 결과 Ü서버 실행 %. /srvr 2 Ü로컬에서 실행 % telnet

원격지 주소 분석(계속) <실행 결과 Ü서버 실행 %. /srvr 2 Ü로컬에서 실행 % telnet localhost 9099 Trying 127. 0. 0. 1. . . Connected to localhost. Escape character is '^]'. Wednesday Apr 11 19: 21: 31 2001 Connection closed by foreign host. % telnet syssw. hannam. ac. kr 9099 Trying 203. 247. 40. 32. . . Connected to syssw. hannam. ac. kr. Escape character is '^]'. Wednesday Apr 11 19: 26: 56 2001 Connection closed by foreign host. Übk 21. hannam. ac. kr 에서 실행 http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 36

원격지 주소 분석(계속) <실행 결과 % cat srvr 2. log Client 127. 0. 0.

원격지 주소 분석(계속) <실행 결과 % cat srvr 2. log Client 127. 0. 0. 1: localhost Client 203. 247. 40. 32: syssw. hannam. ac. kr Client 203. 247. 40. 166: bk 21. hannam. ac. kr http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 37

원격지 주소 분석(계속) <sethostent(3) 함수 Ü네임 서버의 질의 실행을 제어 <함수 원형 #include <netdb.

원격지 주소 분석(계속) <sethostent(3) 함수 Ü네임 서버의 질의 실행을 제어 <함수 원형 #include <netdb. h> void sethostent(int stayopen); <인자 ÜTRUE : TCP/IP 소켓을 이용 ÜFALSE : UDP 데이터그램을 사용 http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 38

원격지 주소 분석(계속) <예제 9. 6 lookup 2. c Ü예제 9. 4의 lookup. c

원격지 주소 분석(계속) <예제 9. 6 lookup 2. c Ü예제 9. 4의 lookup. c 와 동일 Ü네임 서버를 제어하는 sethostent(3) 함수를 사용 http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 39

원격지 주소 분석(계속) <실행 결과 % diff -c lookup 2. c *** lookup. c

원격지 주소 분석(계속) <실행 결과 % diff -c lookup 2. c *** lookup. c Sun Sep 5 07: 02: 14 1999 --- lookup 2. c Tue Apr 10 14: 25: 40 2001 ******** *** 1, 6 **** /* lookup. c: * ! * Example of gethostbyname(3) : */ #include <stdio. h> #include <unistd. h> --- 1, 7 ---/* lookup. c: * ! * Example of gethostbyname(3), ! * using sethostent(3) : */ #include <stdio. h> #include <unistd. h> ******** *** 14, 23 **** --- 15, 29 ---http: //syssw. hannam. ac. kr extern int h_errno; + #define TRUE 1 + #define FALSE 0 + int main(int argc, char **argv) { int x, x 2; struct hostent *hp; + + sethostent(FALSE); for ( x=1; x<argc; ++x ) { /* HANNAM UNIVERSITY 40

원격지 주소 분석(계속) <endhostent(3) 함수 Üsethostent(3) 함수 호출에 의한 네임서버의 연결 해제 <함수 원형

원격지 주소 분석(계속) <endhostent(3) 함수 Üsethostent(3) 함수 호출에 의한 네임서버의 연결 해제 <함수 원형 #include <netdb. h> void endhostent(void); http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 41

요약 http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 42

요약 http: //syssw. hannam. ac. kr HANNAM UNIVERSITY 42