한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실 Chapter 5. 소켓 주소 결합 Network Lab. 김 윤 수 한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실
목 차 bind(2) 함수의 목적 bind(2)함수의 사용 소켓주소 알아내기 동료소켓주소 알아내기 인터페이스 주소지정
Ipaddress + port number의 배정 Bind(2)함수의 목적 Socket에 이름(소켓주소)을 배정한다. Telephone Network (02)252-3404 전화번호의 배정 Ipaddress + port number의 배정 143.248.1.4:80
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 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) 초기화 소켓생성/주소설정 주소 결합 소켓 주소 출력
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) 이함수는 아래와 같은 세 개의 입력인자를 취한다. 소켓주소에 대한 질의를 위한 Socket S receiving 버퍼에 대한 포인터 (인자 이름) 최대 길이 변수에 대한 포인터. 이 변수는 버퍼(인자 namelen)에서 받을 수 있는 바이트단위의 최대 길이를 제공한다. 이 변수는 receiving 버퍼에 쓰여진 실제 바이트수를 가지고 업데이트 된다. #include <sys/socket.h> int getsockname(int s, struct sockaddr *name, socklen_t *namelen)
소켓주소 알아내기-sckname.c(getsockname(2)함수호출) 초기화 소켓생성/주소설정 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) 함수의 개요 소켓주소에 대한 질의를 위한 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));
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
인터페이스 주소지정 특정 인터페이스 주소 결합 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("192.168.0.1"); 주소결합 z = bind(sck_inet, (struct sockaddr *)&adr_inet,len_inet);
인터페이스 주소지정 무작위 인터페이스 주소 결합 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);
인터페이스 주소지정 주소 지정 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 */