250 likes | 428 Views
Chapter 5. 소켓 주소 결합. Network Lab. 김 윤 수. 목 차. bind(2) 함수의 목적 bind(2) 함수의 사용 소켓주소 알아내기 동료소켓주소 알아내기 인터페이스 주소지정. Telephone Network. Bind(2) 함수의 목적. Socket 에 이름 ( 소켓주소 ) 을 배정한다. (02)252-3404. 전화번호의 배정. Ipaddress + port number 의 배정. 143.248.1.4:80. Bind(2) 함수의 목적.
E N D
Chapter 5. 소켓 주소 결합 Network Lab. 김 윤 수 한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실
목 차 • bind(2) 함수의 목적 • bind(2)함수의 사용 • 소켓주소 알아내기 • 동료소켓주소 알아내기 • 인터페이스 주소지정
Telephone Network Bind(2)함수의 목적 • Socket에 이름(소켓주소)을 배정한다. (02)252-3404 전화번호의 배정 Ipaddress + port number의 배정 143.248.1.4:80
Bind(2)함수의 목적 • 응용프로그램과 소켓 그리고 TCP/IP AP1 AP2 AP3 AP4 Application Layer Socket descriptor Socket Layer TCP UDP Transport Layer Port Number 3000 3001 3002 3003 IP Network Layer 143.248.1.80 Link Layer Network
Bind(2)함수의 사용 • bind(2)함수의 개요 • 1. 앞의 socket(2) 호출에 의해 리턴된 소켓 파일 기술자 sockfd. • 2. 소켓에 할당하기 위한 주소 구조체를 가르키는 my_addr. • 3. bytes 단위의 주소(my_addr)구조체의 크기를 지정하는 addrlen #include <sys/types.h> #include <sys/socket.h> int bind(int sockfd, struct sockaddr *my_addr, int addrlne);
Bind(2)함수의 사용-bind.c (The bind(2) function) • 예제 5.1 - bind.c 초기화 소켓생성/주소설정 주소 결합 소켓 주소 출력
Bind(2)함수의 사용-bind.c (The bind(2) function) • 초기화 • int z; /* Status return code */ • int sck_inet; /* Socket */ • struct sockaddr_in adr_inet;/* AF_INET */ • int len_inet; /* length */ • 소켓생성 • sck_inet = socket(AF_INET,SOCK_STREAM,0);
Bind(2)함수의 사용-bind.c (The bind(2) function) • AF_INET 주소 생성 • memset(&adr_inet,0,sizeof adr_inet); • adr_inet.sin_family = AF_INET; • adr_inet.sin_port = htons(9000); • inet_aton("127.0.0.24",&adr_inet.sin_addr); • len_inet = sizeof adr_inet; • 주소 결합 • z = bind(sck_inet, (struct sockaddr *)&adr_inet, len_inet);
Bind(2)함수의 사용-bind.c (The bind(2) function) • 결합된 소켓 주소출력 • system("netstat -pa --tcp 2>/dev/null | " • "sed -n '1,/^Proto/p;/bind/p'"); • 에러 검출 함수 • static void • bail(const char *on_what) { • perror(on_what); • exit(1); • }
Bind(2)함수의 사용-bind.c (The bind(2) function) • 실행결과 • shell> ./bind Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 127.0.0.24:9000 *:* CLOSE 17365/bind
소켓주소 알아내기 – getsockname(2) • getsockname(2) 함수의 개요 • 이함수는 아래와 같은 세 개의 입력인자를 취한다. • 소켓주소에 대한 질의를 위한 Socket S • receiving 버퍼에 대한 포인터 (인자 이름) • 최대 길이 변수에 대한 포인터. 이 변수는 버퍼(인자 namelen)에서 받을 수 있는 바이트단위의 최대 길이를 제공한다. 이 변수는 receiving 버퍼에 쓰여진 실제 바이트수를 가지고 업데이트 된다. #include <sys/socket.h> int getsockname(int s, struct sockaddr *name, socklen_t *namelen)
소켓주소 알아내기-sckname.c(getsockname(2)함수호출) • 예제 5.2 sckname.c 초기화 소켓생성/주소설정 • socket() 주소 결합 • bind() • Sock_addr()함수호출 • Getsockname(2)함수호출 소켓주소 알아내기 소켓 주소 출력
소켓주소 알아내기-sckname.c(getsockname(2)함수호출) • 초기화 • int z; /* Status return code */ • int sck_inet; /* Socket */ • struct sockaddr_in adr_inet;/* AF_INET */ • int len_inet; /* length */ • char buf[64]; /* Work buffer */ • 소켓생성 • sck_inet = socket(AF_INET,SOCK_STREAM,0);
소켓주소 알아내기-sckname.c(getsockname(2)함수호출) • AF_INET 주소 생성 • memset(&adr_inet,0,sizeof adr_inet); • adr_inet.sin_family = AF_INET; • adr_inet.sin_port = htons(9000); • inet_aton("127.0.0.24",&adr_inet.sin_addr); • len_inet = sizeof adr_inet; • 주소 결합 • z = bind(sck_inet, (struct sockaddr *)&adr_inet, len_inet);
소켓주소 알아내기-sckname.c(getsockname(2)함수호출) • sock_addr 함수 호출 • if ( !sock_addr(sck_inet,buf,sizeof buf) ) • bail("sock_addr()"); • 소켓 주소 출력 • printf("Address is '%s'\n",buf); • 실행결과 • shell> ./sckname • Address is '127.0.0.24:9000'
소켓주소 알아내기-sckname.c(getsockname(2)함수호출) • sock_addr 초기화 • char * • sock_addr(int s,char *buf,size_t bufsiz) { • int z; /* Status return code */ • struct sockaddr_in adr_inet;/* AF_INET */ • int len_inet; /* length */ • . • . • }
소켓주소 알아내기-sckname.c(getsockname(2)함수호출) • 소켓 주소 알아내기 • len_inet = sizeof adr_inet; • z = getsockname(s, • (struct sockaddr *)&adr_inet, • &len_inet); • 주소변환 • snprintf(buf,bufsiz, • "%s:%u", • inet_ntoa(adr_inet.sin_addr), • (unsigned)ntohs(adr_inet.sin_port));
동료 소켓주소 알아내기 • getsockname(2) 함수의 개요 • 이함수는 아래와 같은 세 개의 입력인자를 취한다. Getsockname(2)와 동일하다. • 소켓주소에 대한 질의를 위한 Socket S • receiving 버퍼에 대한 포인터 (인자 name) • 최대 길이 변수에 대한 포인터. 이 변수는 버퍼(인자 namelen)에서 받을 수 있는 바이트단위의 최대 길이를 제공한다. 이 값은 receiving 버퍼에 쓰여진 바이트수를 가지고 업데이트 된다. #include <sys/sock.h> int getpeername(int s, struct sockaddr *name, socklen_t *namelen);
동료 소켓주소 알아내기 getpeer.c • 예제5.3 getpeer.c –The getpeername(2) Function 초기화 소켓주소 알아내기 주소변환
동료 소켓주소 알아내기 getpeer.c • getpeer.c 초기화 • char * • peer_addr(int s,char *buf,size_t bufsiz) { • int z; /* Status return code */ • struct sockaddr_in adr_inet;/* AF_INET */ • int len_inet; /* length */ • 소켓 주소 알아내기 • len_inet = sizeof adr_inet; • z = getpeername(s, • (struct sockaddr *)&adr_inet, • &len_inet);
동료 소켓주소 알아내기 getpeer.c • 주소변환 • z = snprintf(buf,bufsiz, • "%s:%u", • inet_ntoa(adr_inet.sin_addr), • (unsigned)ntohs(adr_inet.sin_port));
인터페이스 주소지정 • 특정 인터페이스를 이용하는 firewall의 예 External Organization Inernal Organization Firewall Firewall specific control program workstation Inerface B External Network user4 Inerface A External Network user2 Server user1 Server user3
인터페이스 주소지정 • 특정 인터페이스 주소 결합 • 1. socket(2) 함수를 사용하여 소켓을 만든다. • 2. 함수 bind(2)를 사용하여 지역 소켓에 대한 연결을 받아 들이려는 인터페이스의 IP주소를 결합한다. • Listing 5.4 binding a specific IP Interface • 소켓 만들기 • sck_inet = socket(AF_INET,SOCK_STREAM,0); • 소켓 주소 생성 • adr_inet.sin_addr.s_addr = inet_addr("192.168.0.1"); • 주소결합 • z = bind(sck_inet, (struct sockaddr *)&adr_inet,len_inet);
인터페이스 주소지정 • 무작위 인터페이스 주소 결합 • 1. socket(2)함수를 사용해서소켓을 만든다. • 2.bind(2)함수를 사용해서 소켓에 IP 주소 INADDR_ANY를 결합한다. • Listing 5.5 binding a specific IP Interface • 소켓 만들기 • sck_inet = socket(AF_INET,SOCK_STREAM,0); • 소켓 주소 생성 • adr_inet.sin_addr.s_addr = htonl(INADDR_ANY); • 주소결합 • z = bind(sck_inet, (struct sockaddr *)&adr_inet,len_inet);
인터페이스 주소지정 • 주소 지정 • memset(&adr_inet,0,sizeof adr_inet); • adr_inet.sin_family = AF_INET; • adr_inet.sin_port = htons(9000); • adr_inet.sin_addr.s_addr = htonl(INADDR_ANY); • /* inet_addr("192.168.0.1"); */ • if (adr_inet.sin_port == INADDR_NONE) • abort(); /* Failed */