1 / 25

Chapter 5. 소켓 주소 결합

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) 함수의 목적.

lara-kemp
Download Presentation

Chapter 5. 소켓 주소 결합

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Chapter 5. 소켓 주소 결합 Network Lab. 김 윤 수 한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실

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

  3. Telephone Network Bind(2)함수의 목적 • Socket에 이름(소켓주소)을 배정한다. (02)252-3404 전화번호의 배정 Ipaddress + port number의 배정 143.248.1.4:80

  4. 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

  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) • 예제 5.1 - bind.c 초기화 소켓생성/주소설정 주소 결합 소켓 주소 출력

  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("127.0.0.24",&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 0 0 127.0.0.24:9000 *:* CLOSE 17365/bind

  11. 소켓주소 알아내기 – getsockname(2) • 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)함수호출) • 예제 5.2 sckname.c 초기화 소켓생성/주소설정 • 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("127.0.0.24",&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 '127.0.0.24: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) 함수의 개요 • 이함수는 아래와 같은 세 개의 입력인자를 취한다. 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. 인터페이스 주소지정 • 특정 인터페이스를 이용하는 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. 인터페이스 주소지정 • 특정 인터페이스 주소 결합 • 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);

  24. 인터페이스 주소지정 • 무작위 인터페이스 주소 결합 • 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("192.168.0.1"); */ • if (adr_inet.sin_port == INADDR_NONE) • abort(); /* Failed */

More Related