Upload
lara-kemp
View
71
Download
2
Embed Size (px)
DESCRIPTION
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) 함수의 목적. - PowerPoint PPT Presentation
Citation preview
한남대학교 컴퓨터공학과 컴퓨터 네 트워크 실험실 1
Chapter 5. Chapter 5. 소켓 주소 결합소켓 주소 결합
Network Lab.김 윤 수
2HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
목 차목 차
bind(2) 함수의 목적 bind(2) 함수의 사용 소켓주소 알아내기 동료소켓주소 알아내기 인터페이스 주소지정
3HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
Bind(2)Bind(2) 함수의 목적함수의 목적
Telephone
Network(02)252-3404
143.248.1.4:80
전화번호의 배정
Ipaddress + port number 의 배정
Socket 에 이름 ( 소켓주소 ) 을 배정한다 .
4HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
Bind(2)Bind(2) 함수의 목적함수의 목적 응용프로그램과 소켓 그리고 TCP/IP
Link Layer
Network Layer
Application Layer
Transport Layer
IPTCP
Network
UDP
143.248.1.80
3000 3001 3002 3003
Socket Layer
AP1 AP2 AP3 AP4
Port Number
Socket descriptor
5HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
Bind(2)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);
6HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
Bind(2)Bind(2) 함수의 사용함수의 사용 --bind.c (The bind(2) function)bind.c (The bind(2) function)
예제 5.1 - bind.c
초기화소켓생성 / 주소설정
주소 결합소켓 주소 출력
7HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
Bind(2)Bind(2) 함수의 사용함수의 사용 --bind.c (The bind(2) function)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);
8HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
Bind(2)Bind(2) 함수의 사용함수의 사용 --bind.c (The bind(2) function)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);
9HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
Bind(2)Bind(2) 함수의 사용함수의 사용 --bind.c (The bind(2) function)bind.c (The bind(2) function)
결합된 소켓 주소출력 system("netstat -pa --tcp 2>/dev/null | " "sed -n '1,/^Proto/p;/bind/p'");
에러 검출 함수static voidbail(const char *on_what) { perror(on_what); exit(1); }
10HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
Bind(2)Bind(2) 함수의 사용함수의 사용 --bind.c (The bind(2) function)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
11HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
소켓주소 알아내기 – 소켓주소 알아내기 – getsockname(2)getsockname(2) getsockname(2) 함수의 개요
이함수는 아래와 같은 세 개의 입력인자를 취한다 .
소켓주소에 대한 질의를 위한 Socket S receiving 버퍼에 대한 포인터 ( 인자 이름 )최대 길이 변수에 대한 포인터 . 이 변수는 버퍼 ( 인자 namelen)
에서 받을 수 있는 바이트단위의 최대 길이를 제공한다 . 이 변수는 receiving 버퍼에 쓰여진 실제 바이트수를 가지고 업데이트 된다 .
#include <sys/socket.h>
int getsockname(int s, struct sockaddr *name, socklen_t *namelen)
12HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
소켓주소 알아내기소켓주소 알아내기 --sckname.c(getsockname(2)sckname.c(getsockname(2) 함수호출함수호출 ))
예제 5.2 sckname.c
초기화소켓생성 / 주소설정
주소 결합소켓주소 알아내기
소켓 주소 출력 Sock_addr() 함수호출
• Getsockname(2) 함수호출
bind()
socket()
13HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
소켓주소 알아내기소켓주소 알아내기 --sckname.c(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);
14HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
소켓주소 알아내기소켓주소 알아내기 --sckname.c(getsockname(2)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);
15HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
소켓주소 알아내기소켓주소 알아내기 --sckname.c(getsockname(2)sckname.c(getsockname(2) 함수호출함수호출 ))
sock_addr 함수 호출 if ( !sock_addr(sck_inet,buf,sizeof buf) ) bail("sock_addr()");
소켓 주소 출력 printf("Address is '%s'\n",buf);
실행결과shell> ./scknameAddress is '127.0.0.24:9000'
16HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
소켓주소 알아내기소켓주소 알아내기 --sckname.c(getsockname(2)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 */ . . }
17HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
소켓주소 알아내기소켓주소 알아내기 --sckname.c(getsockname(2)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));
18HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
동료 소켓주소 알아내기동료 소켓주소 알아내기 getsockname(2) 함수의 개요
이함수는 아래와 같은 세 개의 입력인자를 취한다 . Getsockname(2) 와 동일하다 .
소켓주소에 대한 질의를 위한 Socket S receiving 버퍼에 대한 포인터 ( 인자 name) 최대 길이 변수에 대한 포인터 . 이 변수는 버퍼 ( 인자 namelen)
에서 받을 수 있는 바이트단위의 최대 길이를 제공한다 . 이 값은 receiving 버퍼에 쓰여진 바이트수를 가지고 업데이트 된다 .
#include <sys/sock.h>
int getpeername(int s, struct sockaddr *name, socklen_t *namelen);
19HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
동료 소켓주소 알아내기 동료 소켓주소 알아내기 getpeer.cgetpeer.c
예제 5.3 getpeer.c – The getpeername(2) Function
초기화소켓주소 알아내기
주소변환
20HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
동료 소켓주소 알아내기 동료 소켓주소 알아내기 getpeer.cgetpeer.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);
21HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
동료 소켓주소 알아내기 동료 소켓주소 알아내기 getpeer.cgetpeer.c
주소변환 z = snprintf(buf,bufsiz, "%s:%u", inet_ntoa(adr_inet.sin_addr), (unsigned)ntohs(adr_inet.sin_port));
22HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
인터페이스 주소지정인터페이스 주소지정 특정 인터페이스를 이용하는 firewall 의 예
Inernal OrganizationExternal Organization
Firewall
user1user2
External Network
External NetworkInerface A
Inerface B
ServerServer user3
user4
workstation Firewall specific control program
23HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
인터페이스 주소지정인터페이스 주소지정 특정 인터페이스 주소 결합
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);
24HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
인터페이스 주소지정인터페이스 주소지정 무작위 인터페이스 주소 결합
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);
25HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr
인터페이스 주소지정인터페이스 주소지정 주소 지정
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 */