25
한한한한한 한한한한한한 한한한 한한한한 한한한 1 Chapter 5. Chapter 5. 한한 한한 한한 한한 한한 한한 Network Lab. 한 한 한

Chapter 5. 소켓 주소 결합

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

Page 1: Chapter 5.  소켓 주소 결합

한남대학교 컴퓨터공학과 컴퓨터 네 트워크 실험실 1

Chapter 5. Chapter 5. 소켓 주소 결합소켓 주소 결합

Network Lab.김 윤 수

Page 2: Chapter 5.  소켓 주소 결합

2HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr

목 차목 차

bind(2) 함수의 목적 bind(2) 함수의 사용 소켓주소 알아내기 동료소켓주소 알아내기 인터페이스 주소지정

Page 3: Chapter 5.  소켓 주소 결합

3HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr

Bind(2)Bind(2) 함수의 목적함수의 목적

Telephone

Network(02)252-3404

143.248.1.4:80

전화번호의 배정

Ipaddress + port number 의 배정

Socket 에 이름 ( 소켓주소 ) 을 배정한다 .

Page 4: Chapter 5.  소켓 주소 결합

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

Page 5: Chapter 5.  소켓 주소 결합

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);

Page 6: Chapter 5.  소켓 주소 결합

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

초기화소켓생성 / 주소설정

주소 결합소켓 주소 출력

Page 7: Chapter 5.  소켓 주소 결합

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);

Page 8: Chapter 5.  소켓 주소 결합

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);

Page 9: Chapter 5.  소켓 주소 결합

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); }

Page 10: Chapter 5.  소켓 주소 결합

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

Page 11: Chapter 5.  소켓 주소 결합

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)

Page 12: Chapter 5.  소켓 주소 결합

12HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr

소켓주소 알아내기소켓주소 알아내기 --sckname.c(getsockname(2)sckname.c(getsockname(2) 함수호출함수호출 ))

예제 5.2 sckname.c

초기화소켓생성 / 주소설정

주소 결합소켓주소 알아내기

소켓 주소 출력 Sock_addr() 함수호출

• Getsockname(2) 함수호출

bind()

socket()

Page 13: Chapter 5.  소켓 주소 결합

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);

Page 14: Chapter 5.  소켓 주소 결합

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);

Page 15: Chapter 5.  소켓 주소 결합

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'

Page 16: Chapter 5.  소켓 주소 결합

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 */ . . }

Page 17: Chapter 5.  소켓 주소 결합

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));

Page 18: Chapter 5.  소켓 주소 결합

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);

Page 19: Chapter 5.  소켓 주소 결합

19HANNAM UNIVERSITYHttp://netwk.hannam.ac.kr

동료 소켓주소 알아내기 동료 소켓주소 알아내기 getpeer.cgetpeer.c

예제 5.3 getpeer.c – The getpeername(2) Function

초기화소켓주소 알아내기

주소변환

Page 20: Chapter 5.  소켓 주소 결합

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);

Page 21: Chapter 5.  소켓 주소 결합

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));

Page 22: Chapter 5.  소켓 주소 결합

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

Page 23: Chapter 5.  소켓 주소 결합

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);

Page 24: Chapter 5.  소켓 주소 결합

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);

Page 25: Chapter 5.  소켓 주소 결합

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 */