Download presentation
Presentation is loading. Please wait.
1
한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실
Chapter 5. 소켓 주소 결합 Network Lab. 김 윤 수 한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실
2
목 차 bind(2) 함수의 목적 bind(2)함수의 사용 소켓주소 알아내기 동료소켓주소 알아내기 인터페이스 주소지정
3
Ipaddress + port number의 배정
Bind(2)함수의 목적 Socket에 이름(소켓주소)을 배정한다. Telephone Network (02) 전화번호의 배정 Ipaddress + port number의 배정 :80
4
Bind(2)함수의 목적 IP 응용프로그램과 소켓 그리고 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 Link Layer Network
5
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);
6
Bind(2)함수의 사용-bind.c (The bind(2) function)
초기화 소켓생성/주소설정 주소 결합 소켓 주소 출력
7
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);
8
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(" ",&adr_inet.sin_addr); len_inet = sizeof adr_inet; 주소 결합 z = bind(sck_inet, (struct sockaddr *)&adr_inet, len_inet);
9
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); }
10
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 : *:* CLOSE /bind
11
소켓주소 알아내기 – getsockname(2)
이함수는 아래와 같은 세 개의 입력인자를 취한다. 소켓주소에 대한 질의를 위한 Socket S receiving 버퍼에 대한 포인터 (인자 이름) 최대 길이 변수에 대한 포인터. 이 변수는 버퍼(인자 namelen)에서 받을 수 있는 바이트단위의 최대 길이를 제공한다. 이 변수는 receiving 버퍼에 쓰여진 실제 바이트수를 가지고 업데이트 된다. #include <sys/socket.h> int getsockname(int s, struct sockaddr *name, socklen_t *namelen)
12
소켓주소 알아내기-sckname.c(getsockname(2)함수호출)
초기화 소켓생성/주소설정 socket() 주소 결합 bind() Sock_addr()함수호출 Getsockname(2)함수호출 소켓주소 알아내기 소켓 주소 출력
13
소켓주소 알아내기-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);
14
소켓주소 알아내기-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(" ",&adr_inet.sin_addr); len_inet = sizeof adr_inet; 주소 결합 z = bind(sck_inet, (struct sockaddr *)&adr_inet, len_inet);
15
소켓주소 알아내기-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 ' :9000'
16
소켓주소 알아내기-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 */ . }
17
소켓주소 알아내기-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));
18
동료 소켓주소 알아내기 getsockname(2) 함수의 개요
소켓주소에 대한 질의를 위한 Socket S receiving 버퍼에 대한 포인터 (인자 name) 최대 길이 변수에 대한 포인터. 이 변수는 버퍼(인자 namelen)에서 받을 수 있는 바이트단위의 최대 길이를 제공한다. 이 값은 receiving 버퍼에 쓰여진 바이트수를 가지고 업데이트 된다. #include <sys/sock.h> int getpeername(int s, struct sockaddr *name, socklen_t *namelen);
19
동료 소켓주소 알아내기 getpeer.c 초기화 소켓주소 알아내기 주소변환
예제5.3 getpeer.c – The getpeername(2) Function 초기화 소켓주소 알아내기 주소변환
20
동료 소켓주소 알아내기 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);
21
동료 소켓주소 알아내기 getpeer.c 주소변환 z = snprintf(buf,bufsiz, "%s:%u",
inet_ntoa(adr_inet.sin_addr), (unsigned)ntohs(adr_inet.sin_port));
22
External Organization
인터페이스 주소지정 특정 인터페이스를 이용하는 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
23
인터페이스 주소지정 특정 인터페이스 주소 결합 Listing 5.4 binding a specific IP Interface
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(" "); 주소결합 z = bind(sck_inet, (struct sockaddr *)&adr_inet,len_inet);
24
인터페이스 주소지정 무작위 인터페이스 주소 결합 Listing 5.5 binding a specific IP Interface
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);
25
인터페이스 주소지정 주소 지정 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(" "); */ if (adr_inet.sin_port == INADDR_NONE) abort(); /* Failed */
Similar presentations