네트워크 프로그래밍 Unix Network Programming, 2nd Ed., W. Richard Stevens, Prentice Hall PTR, 1999. 한국어 판 Unix Network Programming, Stevens 저, 김치하, 이재용 역, 대영사,

Slides:



Advertisements
Similar presentations
Network Programming:
Advertisements

YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
Python Socket/HTTP overmania. 목표  소켓을 이용하여 기본적인 서버 - 클라이언트 모델을 구현할 수 있다.  간단한 웹서버를 소켓을 이용하여 작성할 수 있다.
TCP 서버/클라이언트 동작 원리 - (1) TCP 서버/클라이언트 예 웹 서버 웹 클라이언트 웹 클라이언트
Chapter 13 전송층 개요.
Understanding of Socket and File I/O
TCP/IP Network Experimental Programming [IPv6에 의한 통신 실험]
13장 소켓.
22 장 프로세스간 전달 : UDP와 TCP 22.1 프로세스간 전달 22.2 사용자 데이터그램 프로토콜
C 프로그래밍 소개 숙명여대 창병모 2011 가을.
TCP/IP Socket Cover Slide 조태문.
TCP/IP 소켓 프로그래밍 - C 버전 중에서
Linux System Programming
Department of Computer Engineering
소켓 모델 주소 지정 in_addr_t inet_addr(const char *ip_address) 연결 지향 모델 (TCP)
4장. 소켓 유형과 프로토콜 Network Lab. 이 원 구 1.
PHP 웹 프로그래밍 (PHP Web Programming) 네트워크 프로그래밍 문양세 강원대학교 IT대학 컴퓨터과학전공.
TCP/IP Socket Cover Slide 조태문.
Network 네트워크 이론 및 실습 TCP / IP 4장.
인공지능실험실 석사 2학기 김승겸 TCP/IP Socket Programming… 제 10장 멀티태스킹 기반의 서버구현 인공지능실험실 석사 2학기 김승겸
Chapter 03. 소켓 주소 구조체 다루기.
Department of Computer Engineering
얇지만 얇지 않은 TCP/IP 소켓 프로그래밍 C 2판
TCP Client/Server Program
Network Lab. Seoung Hyeon, Lee
얇지만 얇지 않은 TCP/IP 소켓 프로그래밍 C 2판
컴퓨터 네트워크 PART 03 프로그래밍 (chapter 01 Socket 프로그래밍) 임효택
호스트이름과 네트워크이름 찾기 (Hostname and Network Name Lookups)
Linux System Programming
Internet Address Conversion Functions
3장. 소켓 주소 구조체 다루기 소켓 주소 구조체의 정의와 초기화 방법을 익힌다.
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
11 소켓 프로그래밍 기초.
인터넷 주소 변환 School of Electronics and Information. Kyung Hee University.
14장 소켓.
제 12장 I/O멀티플렉싱(Multiplexing)
Using Standard I/O on Sockets
Department of Computer Engineering
Department of Computer Engineering
인터넷에서의 데이터 흐름 Application Transport Transport Network Link Unix
(Web Programming & Practice)
Socket Address Structure and Byte Ordering Functions
Department of Computer Engineering
Term Project Team Member
Socket Address Structure and Byte Ordering Functions
Homework 6… 12월 2일(금) 11:59pm까지 자신의 이름과 학번을 출력해 주는 유닉스/리눅스 네트워크 소켓 서버 프로그램 과 클라이언트 프로그램 을 작성해 보세요 참고 (실습1) Hello 프로그램 helloserver.c helloclient.c 컴파일.
Chapter 8 연결형 프로토콜 서버 발표자 : SE Lab 황 성 하
Department of Computer Engineering
Advanced Socket Programming
Department of Computer Engineering
Chapter 03. 소켓 주소 구조체 다루기.
Socket Address Structure and Byte Ordering Functions
Network Programming(1)
Socket Address Structure and Byte Ordering Functions
(분산 통신 실습 1) : 소켓(Sockets)
adopted from KNK C Programming : A Modern Approach
(분산 통신 실습) : 소켓(Sockets)
School of Electronics and Information. Kyung Hee University.
네트워크 프로그래밍의 이해 School of Electronics and Information.
Transmission Control Protocol (TCP)
User Datagram Protocol (UDP)
윤성우의 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판
Chapter 16 Socket Interface.
Department of Computer Engineering
윤성우의 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판
인터넷 주소변환 School of Electronics and Information. Kyung Hee University.
Department of Computer Engineering
Chapter 03. 소켓 주소 구조체 다루기.
소켓의 생성과 프로토콜의 설정 School of Electronics and Information.
Department of Computer Engineering
Presentation transcript:

네트워크 프로그래밍 Unix Network Programming, 2nd Ed., W. Richard Stevens, Prentice Hall PTR, 1999. 한국어 판 Unix Network Programming, Stevens 저, 김치하, 이재용 역, 대영사, 1991. 컴퓨터네트워크 프로그래밍, 개정판, 김화종, 홍릉과학출판사, 2000.

10.7 소켓 프로세스간 상호 양방향 통신 방식 네트워크를 통한 통신 가능 소켓을 통한 프로세스 통신은 클라이언트-서버 모델(client-server model)에 기초 활용 한 기계에 존재하는 파일을 다른 기계에서 프린트 한 기계에서 다른 기계로 파일을 전송 10. 시스템 프로그래밍

인터넷에서의 데이터 흐름 Application Transport Transport Network Link 도착주소(IP) 전달 세그먼트 분할+포장+도착주소 중간주소 붙여 포장(도착주소 or라우터주소) 중간주소를 local network 주소로 변환 포장 벗겨 도착주소 확인 후 아니면 다시 포장+새중간주소(옆의 다른 라우터 주소) 메시지 재구성 포장 벗겨 도착주소 확인 맞으면 위로 전달 포장 벗겨 위로 전달 Transport 포장 벗겨 위로 전달 10. 시스템 프로그래밍

연결형 시스템 호출 연결형 소켓(connection oriented protocol : TCP(Transmission Control Protocol) 서버(server) 클라이언트(client) 클라이언트로부터 연결이 올 때까지 대기 프로세스에 요청 read( ) bind( ) listen( ) accept( ) socket( ) write( ) connect( ) Data 응답 Data 요청 연결설정 [참고 P535] 10. 시스템 프로그래밍

비연결형 소켓 시스템 호출 Server(connectionless protocol : UDP(User Datagram Protocol)) Client blocks until data received from a client data(request) process request data(reply) socket() bind() recvfrom() socket() bind() sendto() write() read() 10. 시스템 프로그래밍

10.7 소켓  서버가 명명된 소켓  클라이언트가 명명되지  클라이언트가 연결됨. 소켓 연결과정 서버 클라이 언트 이름 완결된 연결  서버가 명명된 소켓 을 생성  클라이언트가 명명되지 않은 소켓을 생성하고, 연결을 요청  클라이언트가 연결됨. 서버는 원래 명명된 소켓을 유지 10. 시스템 프로그래밍

10.7 소켓 여러 종류의 소켓 다음의 속성에 따라 분류 도메인 : 서버와 클라이언트 소켓이 존재하는 장소를 지칭 도메인(domain) 서버와 클라이언트 소켓이 존재하는 장소를 지칭 유형(type) 클라이언트와 서버 사이에 존재할 수 있는 통신의 유형을 결정 프로토콜(protocol) 소켓 유형을 구현하는 저급의 수단을 명시 도메인 : 서버와 클라이언트 소켓이 존재하는 장소를 지칭 AF : “ Address Family ” AF_UNIX 클라이언트와 서버는 동일한 기계에 존재해야 함 AF_INET 클라이언트와 서버는 인터네트 어느 곳에서든지 존재할 수 있음 AF_NS 클라이언트와 서버는 XEROX 네트워크 시스템에 존재할 수 있음 10. 시스템 프로그래밍

10.7 소켓 유형 : 클라이언트와 서버와의 통신의 유형 결정 SOCK_STREAM SOCK_DGRAM 일련 번호가 붙은, 신뢰적, 양방향 연결에 기초한 바이트의 가변 길이의 스트림 SOCK_DGRAM 전보와 비슷한, 무연결, 비신뢰적 고정 길이의 메시지 SOCK_SEQPACKET 일련번호가 붙은, 신뢰적, 양방향 연결에 기초한 바이트의 고정 길이 패킷 SOCK_RAW 내부 네트워크 프로토콜과 인터페이스에 대한 접근 제공 10. 시스템 프로그래밍

10.7 소켓 Yes TCP UDP IP SPP IDP 도메인과 소켓 유형간의 모든 조합이 허용되지는 않음 AF_UNIX 빈 부분은 구현되지 않은 부분이다. [참고] AF_UNIX AF_INET AF_NS SOCK_STREAM SOCK_DGRAM SOCK_RAW SOCK_SEQPACKET Yes TCP UDP IP SPP IDP 10. 시스템 프로그래밍

10.7 소켓 AF_UNIX AF_INET 소켓 프로그램 작성 도메인 추가할 헤더 파일 /usr/include/sys/un.h 소켓 사용시 아래의 파일 포함 /usr/include/sys/types.h /usr/include/sys/socket.h 포함 소켓 도메인에 따라 헤더파일 포함 소스 프로그램 : P525 도메인 추가할 헤더 파일 AF_UNIX AF_INET /usr/include/sys/un.h /usr/include/netinet/in.h /usr/include/arpa/inet.h /usr/include/netdb.h 10. 시스템 프로그래밍

10.7 소켓 서버 socket bind listen accept 명 칭 의 미 명명되지 않은 소켓을 생성 소켓에 이름을 부여 명명된 소켓을 생성하고, 생성한 소켓으로의 연결을 수용하는 것을 책임지는 프로세스 다음의 순서대로 시스템호출을 사용 의 미 명 칭 socket bind listen accept 명명되지 않은 소켓을 생성 소켓에 이름을 부여 대기중인 연결의 최대 수를 명시 클라이언트로부터의 소켓 연결을 수용 10. 시스템 프로그래밍

10.7 소켓 소켓의 생성 : socket( ) socket( )을 사용하여 소켓 생성 동작 명시된 domain, type, protocol의 명명되지 않은 소켓을 생성 소켓 생성 성공시 : 새로 생성된 소켓에 연관된 파일 기술자 (serverFd)를 반환 소켓 생성 실패시 : 파일 기술자 (serverFd)에 -1 반환 System call: int socket ( int domain, int type, int protocol ) serverFd = socket(AF_UNIX, SOCK_STREAM, DEFAULT_PROTOCOL); 10. 시스템 프로그래밍

10.7 소켓 소켓에 이름 부여 : bind( ) 서버가 명명되지 않은 소켓 생성시, bind( )를 사용하여 이름 부여 성공시 0을 반환, 실패시 -1을 반환 동작 address에 저장된 소켓 주소를 가지는 파일 기술자 fd를 명명되지 않은 소켓에 연관시킴 addressLen는 주소 구조체의 길이를 포함 입력될 주소의 유형과 값은 소켓 도메인에 의함 System call: int bind ( int fd, struct sockaddr* address, int addressLen ) 10. 시스템 프로그래밍

10.7 소켓 항목 값부여 항목 값부여 도메인에 따른 구조체 항목 AF_UNIX 도메인 sun_family AF_UNIX sockaddr_un 구조체의 항목 AF_INET 도메인 sockaddr_in 구조체의 항목 항목 값부여 sun_family AF_UNIX sun_path 소켓의 완전한 경로 이름으로, 최대 길이는 180문자 항목 값부여 sin_family AF_INET sin_port 인터네트 소켓의 포트 번호 sin_addr in_addr 유형의 구조체 sin_zero 공백상태로 남겨둔다 10. 시스템 프로그래밍

10.7 소켓 소켓 큐 생성 : listen( ) 대기 중인 소켓 연결의 최대 수를 명시 만일, 클라이언트가 가득 차 있는 큐를 소켓에 연결하려고 한다면, 그 연결은 거부됨 동작 예) listen (serverFd, 5); /*대기 중인 연결의 최대 길이 */ System call: int listen ( int fd, int queueLength ) 10. 시스템 프로그래밍

10.7 소켓 클라이언트 수용 : accept( ) 클라이언트의 연결 요구 수용 기술자를 반환하며, 실패시에는 -1 반환 accept( )가 성공 시 통신에 사용될 수 있는 새로운 파일 동작 address 구조체 :클라이언트의 주소, 보통 인터넷 연결과 관련되어서만 사용 addressLen : address에 의해서 지정되는 구조체의 크기를 포함하는 정수 System call: int bind ( int fd, struct sockaddr* address, int addressLen ) 10. 시스템 프로그래밍

10.7 소켓 클라이언트 명명되지 않은 소켓을 생성하고, 생성한 소켓을 명명된 서버소켓으로의 접속을 책임지는 프로세스 다음의 순서대로 시스템호출을 사용 명칭 의미 socket( ) connect( ) 명명되지 않은 소켓을 생성 명명되지 않은 클라이언트 소켓을 명명된 서버 소켓에 접속 10. 시스템 프로그래밍

10.7 소켓 연결하기 : connect( ) 서버의 소켓에 연결 connect( ) 성공시 0반환하고, 서버 소켓이 존재 하지 않거나, 대기 큐가 가득차 있으면 -1반환 동작 address 구조체내에 주소가 저장되어 있는 서버소켓에 연결을 시도 연결 성공시, fd는 서버의 소켓과 통신하기 위해 사용 addressLen은 주소 구조체의 크기와 동일 System call:int connect( int fd, struct sockaddr* address, int addressLen ) 10. 시스템 프로그래밍

10.7 소켓 인터네트 소켓 : IP 주소와 PORT 주소에 의해 명시 32bit IP 주소와 16bit port 번호 필요 인터네트 주소 종류 “s”는 지역 호스트를 의미 숫자로 시작 : A.B.C.D 형식의 IP 주소로 가정  소프트웨어에 의해서 32bit의 IP 주소로 변환 문자열 입력 : 기호적 호스트 이름으로 가정  소프트웨어에 의해 32bit IP 주소로 변환 Inettime 소스 프로그램 : p536 ~ p538 (debugging) 10. 시스템 프로그래밍

Chef.c 10. 시스템 프로그래밍 #include <stdio.h> #include <signal.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> /* AF_UNIX 소켓용 */ #define DEFAULT_PROTOCOL 0 main() { int serverFd, clientFd, serverLen, clientLen; struct sockaddr_un serverUNIXAddress; /* 서버 주소 */ struct sockaddr_un clientUNIXAddress; /* 클라이언트 주소 */ struct sockaddr* serverSockAddrPtr; /* 서버 주소에 대한 포인터 */ struct sockaddr* clientSockAddrPtr; /* 클라이언트 주소에 대한 포인터 */ /* 좀비를 방지하기 위해 자식-죽음 시그널은 무시 */ signal(SIGCHLD, SIG_IGN); serverSockAddrPtr = (struct sockaddr*) &serverUNIXAddress; serverLen = sizeof(serverUNIXAddress); clientSockAddrPtr = (struct sockaddr*) &clientUNIXAddress; clientLen = sizeof(clientUNIXAddress); 10. 시스템 프로그래밍

Chef.c (cont) 10. 시스템 프로그래밍 /* 양방향, 디폴트 프로토콜의 유닉스 소켓 생성 */ serverFd = socket(AF_UNIX, SOCK_STREAM, DEFAULT_PROTOCOL); serverUNIXAddress.sun_family = AF_UNIX; /* 도메인 유형 설정 */ strcpy (serverUNIXAddress.sun_path, "recipe"); /* 이름 설정*/ unlink( "recipe"); /* 이미 존재 한다면, 파일 제거 */ bind(serverFd, serverSockAddrPtr, serverLen); /* 파일 생성 */ listen(serverFd, 5); /* 대기중인 연결의 최대 길이 */ while(1) /* 무한루프 */ { /* 클라이언트 연결 받기 */ clientFd = accept(serverFd, clientSockAddrPtr, &clientLen); printf(" Server called! "); if (fork() == 0) /* 조리법을 전송할 자식 생성 */ writeRecipe(clientFd); /* 조리법 전송 */ close(clientFd); /* 소켓 닫기 */ exit(/* EXIT_SUCCESS */ 0); /* 종료 */ } else close(clientFd); /* 클라이언트 기술자 닫기 */ writeRecipe (int fd) static char* line1 = "spam, spam, spam, spam, spam,"; static char* line2 = "spam, and spam."; write (fd, line1, strlen(line1) + 1); /* 첫째줄 쓰기 */ write (fd, line2, strlen(line2) + 1); /* 두번째 줄 쓰기 */ 10. 시스템 프로그래밍

Cook.c 10. 시스템 프로그래밍 #include <stdio.h> #include <signal.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #define DEFAULT_PROTOCOL 0 main() { int clientFd, serverLen, result; struct sockaddr_un serverUNIXAddress; struct sockaddr* serverSockAddrPtr; serverSockAddrPtr = (struct sockaddr*) &serverUNIXAddress; serverLen = sizeof(serverUNIXAddress); /* 양방향, 디폴트 프로토콜의유닉스 소켓생성 */ clientFd = socket(AF_UNIX, SOCK_STREAM, DEFAULT_PROTOCOL); serverUNIXAddress.sun_family = AF_UNIX; /* 서버 도메인 */ strcpy( serverUNIXAddress.sun_path, "recipe"); /* 서버 이름 */ do { /* 서버와 연결되기까지 루프 */ result = connect (clientFd, serverSockAddrPtr, serverLen); if(result == -1) sleep(1); /* 대기후 다시 시도 */ } while(result == -1); 10. 시스템 프로그래밍

Cook.c (cont) readRecipe(int fd) { char str[200]; readRecipe(clientFd); /* 조리법 읽기 */ close(clientFd); /* 소켓 닫기 */ exit(/* EXIT_SUCCESS */ 0); /* 수행 끝*/ } readRecipe(int fd) { char str[200]; while(readLine(fd, str)) /* 입력 끝까지 줄 읽기 */ printf("%s\n", str); /* 소켓으로부터 줄 출력 */ /*********************************************/ readLine(int fd, char* str) int n; do { n = read(fd,str,1); while(n > 0 && *str++ != NULL); return (n > 0); 10. 시스템 프로그래밍

inettime.c: 인터네트 시간청취 #include <stdio.h> #include <signal.h> #include <ctype.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> /* For AFINET sockets */ #include <arpa/inet.h> #include <netdb.h> #define DAYTIME_PORT 13 /* Standard port o */ #define DEFAULT_PROTOCOL 0 unsigned long promptForINETAddress (); unsigned long nameToAddr (); main () { int clientFd; /* Client socket file descriptor */ int serverLen; /* Length of server address structure */ int result; /* From connect () call */ struct sockaddr_in serverINETAddress; /* Server address */ struct sockaddr* serverSockAddrPtr; /* Pointer to address */ unsigned long inetAddress; /* 32-bit IP address */ /* Set the two server variables */ serverSockAddrPtr = (struct sockaddr*) &serverINETAddress; 10. 시스템 프로그래밍

inettime.c: 인터네트 시간청취(cont.) serverLen = sizeof (serverINETAddress); /* Length of address */ while (1) /* Loop until break */ { inetAddress = promptForINETAddress (); /* Get 32-bit IP */ if (inetAddress == 0) break; /* Done */ /* Start by zeroing out the entire address structure */ bzero ((char*)&serverINETAddress,sizeof(serverINETAddress)); serverINETAddress.sin_family = AF_INET; /* Use Internet */ serverINETAddress.sin_addr.s_addr = inetAddress; /* IP */ serverINETAddress.sin_port = htons (DAYTIME_PORT); /* Now create the client socket */ clientFd = socket (AF_INET, SOCK_STREAM, DEFAULT_PROTOCOL); do /* Loop until a connection is made with the server */ result = connect (clientFd,serverSockAddrPtr,serverLen); if (result == -1) sleep (1); /* Try again in 1 second */ } while (result == -1); readTime (clientFd); /* Read the time from the server */ close (clientFd); /* Close the socket */ exit (/* EXIT_SUCCESS */ 0); 10. 시스템 프로그래밍

inettime.c: 인터네트 시간청취(cont.) unsigned long promptForINETAddress () { char hostName [100]; /* Name from user: numeric or symbolic */ unsigned long inetAddress; /* 32-bit IP format */ /* Loop until quit or a legal name is entered */ /* If quit, return 0 else return host's IP address */ do printf ("Host name (q = quit, s = self): "); scanf ("%s", hostName); /* Get name from keyboard */ if (strcmp (hostName, "q") == 0) return (0); /* Quit */ inetAddress = nameToAddr (hostName); /* Convert to IP */ if (inetAddress == 0) printf ("Host name not found\n"); } while (inetAddress == 0); unsigned long nameToAddr (name) char* name; char hostName [100]; struct hostent* hostStruct; struct in_addr* hostNode; /* Convert name into a 32-bit IP address */ /* If name begins with a digit, assume it's a valid numeric */ /* Internet address of the form A.B.C.D and convert directly */ if (isdigit (name[0])) return (inet_addr (name)); 10. 시스템 프로그래밍

inettime.c: 인터네트 시간청취(cont.) if (strcmp (name, "s") == 0) /* Get host name from database */ { gethostname (hostName,100); printf ("Self host name is %s\n", hostName); } else /* Assume name is a valid symbolic host name */ strcpy (hostName, name); /* Now obtain address information from database */ hostStruct = gethostbyname (hostName); if (hostStruct == NULL) return (0); /* Not Found */ /* Extract the IP Address from the hostent structure */ hostNode = (struct in_addr*) hostStruct->h_addr; /* Display a readable version for fun */ printf ("Internet Address = %s\n", inet_ntoa (*hostNode)); return (hostNode->s_addr); /* Return IP address */ readTime (fd) int fd; char str [200]; /* Line buffer */ printf ("The time on the target port is "); while (readLine (fd, str)) /* Read lines until end-of-input */ printf ("%s\n", str); /* Echo line from server to user */ 10. 시스템 프로그래밍

inettime.c: 인터네트 시간청취(cont.) readLine (fd, str) int fd; char* str; /* Read a single NEWLINE-terminated line */ { int n; do /* Read characters until NULL or end-of-input */ n = read (fd, str, 1); /* Read one character */ } while (n > 0 && *str++ != '\n'); return (n > 0); /* Return false if end-of-input */ 10. 시스템 프로그래밍

10.7 소켓 인터네트 클라이언트 인터네트 서버 소켓 주소 구조체의 항목은 클라이언트 항목과 같게 소켓 도메인 : AF_INET 소켓 주소 구조체(sockaddr_in)의 4항목 sin_family : 소켓의 도메인으로, AF_INET로 설정 sin_port : 포트 번호 지정 sin_addr : 클라이언트/서버의 32bit IP 주소 sin_zero : 삽입구로, 공백상태로 남겨둠 인터네트 서버 소켓 주소 구조체의 항목은 클라이언트 항목과 같게 sin_port 항목은 INADDR_ANY로 설정, 이것은 “어떠한 입력 클라이언트 요구들도 받아들인다”는 것을 의미 struct sockaddr_in serverINETAddress; /* 서버 인터네트 주소 */ serverINETAddress.sin_family = AF_INET; /* 인터네트 도메인*/ serverINETAddress.sin_addr.s_addr = htonl(INADDR_ANY); /* 모두 받아들임*/ serverINETAddress.sin_port = htons(port); /*서버 포트 번호*/ 10. 시스템 프로그래밍

10.7 소켓 Library call: unsigned long inet_addr(char* string) A.B.C.D 형식의 string에 해당하는 32bit 주소로 변환 system call: int gethostname(char* name, int nameLen) 길이가 nameLen인 name이 가리키는 문자배열은 지역 호스트 이름과 동일한 NULL로 끝나는 문자열로 설정 Library call: struct hostent* gethostbyname(char* name) “/etc/hosts”파일 탐색하여, 문자열 name과 연관된 파일 엔트리로 묘사하는 구조체 hostent를 가리키는 포인터로 반환 만일, name이 “/etc/hosts” 파일에서 발견되지 않으면 NULL반환 10. 시스템 프로그래밍

10.7 소켓 Library call: char* inet_ntoa(struct in_addr address) 인수로 in_addr형의 구조체를 취하고, A.B.C.D 형식으로 주소를 묘사하는 문자열에 대한 포인터를 반환 Library call: void bzero(char* buffer, int length) 크기가 length인 buffer를 0(ASCII NULL)로 채움 Library call: unsigned long htonl(unsigned long hostLong) 호스트 형식인 unsigned long 유형의 hostLong과 동등한 네트워크 형식을 반환 Library call: unsigned short ntohs(unsigned long hostLong) 네트워크 형식인 unsigned short 유형의 networkshort와 동등한 호스트 형식을 반환 10. 시스템 프로그래밍

10.7 소켓 인터네트 서버 소켓 주소 구조체의 항목은 클라이언트 항목과 같게 sin_port 항목은 INADDR_ANY로 설정, 이것은 “어떠한 입력 클라이언트 요구들도 받아들인다”는 것을 의미 struct sockaddr_in serverINETAddress; /* 서버 인터네트 주소 */ serverINETAddress.sin_family = AF_INET; /* 인터네트 도메인*/ serverINETAddress.sin_addr.s_addr = htonl(INADDR_ANY); /* 모두 받아들임*/ serverINETAddress.sin_port = htons(port); /*서버 포트 번호*/ 10. 시스템 프로그래밍

IP주소변환의 세가지 방법 및 변환 함수 gethostbyname( ) inet_addr( ) Media.inchon.ac.kr: :192.203.144.1 도메인 네임 : IP 주소(binary) :dotted decimal gethostbyname( ) inet_addr( ) gethostbyaddr( ) inet_ntoa( ) 11000011 11001011 10010000 00001011 10. 시스템 프로그래밍

파일기술자와 소켓기술자(소켓번호) 기술자 테이블 파일 또는 정보 구조체 : pointer family:PF_INET 기술자 테이블 파일 또는 정보 구조체 (파일) 파일 기술자 또는 3 소켓기술자 4 (파일) 5 (소켓) : pointer family:PF_INET service :SOCK_STREAM local IP: local port: remote IP: remote port: 10. 시스템 프로그래밍

응용프로그램과 소켓,TCP/IP의 관계 TCP/IP 211.119.245.149 연결형 서비스 비연결형 서비스 응용 프로그램 연결형 서비스 비연결형 서비스 응용 프로그램 (소켓번호) 소켓 (포트번호) 트랜스포트 계층 인터넷 계층 (IP주소) 네트워크 fd :File Descriptor IP:Internet Protocol sd:Socket Descriptor TCP:Transmission Control Protocol UDP:User Datagram Protocol 응용1 응용2 응용3 응용4 fd=3 sd=4 sd=3 sd=3 sd=3 3000 3001 3002 3003 TCP/IP 211.119.245.149 UDP TCP I P 10. 시스템 프로그래밍

소켓 구조 /* Definitions for UNIX IPC domain … /usr/include/sys/un.h */ struct sockaddr_un { sa_family_t sun_family; /* AF_UNIX */ char sun_path[108]; /* path name (gag) */ }; /* Socket address, internet style … /usr/include/netinet/in.h */ struct sockaddr_in { sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; 10. 시스템 프로그래밍

소켓 구조 10. 시스템 프로그래밍 /* Internet address … /usr/include/netinet/in.h * This definition contains obsolete fields for compatibility * with SunOS 3.x and 4.2bsd. The presence of subnets renders * divisions into fixed fields misleading at best. New code * should use only the s_addr field. */ #if !defined(_XPG4_2) || defined(__EXTENSIONS__) #define _S_un_b S_un_b #define _S_un_w S_un_w #define _S_addr S_addr #define _S_un S_un #endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */ struct in_addr { union { struct { uchar_t s_b1, s_b2, s_b3, s_b4; } _S_un_b; struct { ushort_t s_w1, s_w2; } _S_un_w; uint32_t _S_addr; #else in_addr_t _S_addr; } _S_un; #define s_addr _S_un._S_addr /* should be used for all code */ #define s_host _S_un._S_un_b.s_b2 /* OBSOLETE: host on imp */ #define s_net _S_un._S_un_b.s_b1 /* OBSOLETE: network */ #define s_imp _S_un._S_un_w.s_w2 /* OBSOLETE: imp */ #define s_impno _S_un._S_un_b.s_b4 /* OBSOLETE: imp # */ #define s_lh _S_un._S_un_b.s_b3 /* OBSOLETE: logical host */ }; 10. 시스템 프로그래밍

포트 번호(Port Number) 16-비트 포트 번호 하나 이상의 프로세스가 한꺼번에 TCP나 UDP를 사용할 수 있기 위해 각 사용자 프로세스와 관련된 데이터 구분 필요 32-비트 Internet 주소로는 호스트만 접촉 가능, 특정 프로세스 가리키는 방법 필요 1~255 : 미리 할당된 포트 번호 /usr/include/netinet/in.h 에서 표준 포트(well-known ports) 확인 (예) FTP 제공 TCP/IP 포트 번호 : 21 4.3BSD : 1~1023 수퍼유저 프로세스 위해 예약 1023 < TCP의 포트 번호 < 5000 인터넷 한벌(TCP/IP 또는 UDP/IP)에서 연결을 정의하는 5쌍 규약(TCP 또는 UDP) 지역 호스트의 Internet 주소(32-비트) 지역 포트 번호(16-비트) 상대 호스트의 Internet 주소(32-비트) 상대 포트 번호(16-비트) (예) {tcp, 128.10.0.3, 1500, 128.10.0.7, 21} 10. 시스템 프로그래밍

inetserver.c : 인터네트 서버 /* compile : gcc -o client client.c -lsocket -lnsl */ /* execute : server */ #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #define PORTNUM 3000 main(int argc, char *argv[]) { int serverFd, clientFd, clilen, childpid; struct sockaddr_in cli_addr, serv_addr; if((serverFd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ printf("server: can't open stream socket"); return -1; } bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* 어떤 호스트의 클라이언트도 다 받아들임 */ serv_addr.sin_port = htons(PORTNUM); /* 서버 포트 번호 */ if(bind(serverFd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) printf("server: can't bind local address"); printf("Server is binded\n"); listen(serverFd, 5); 10. 시스템 프로그래밍

inetserver.c : 인터네트 서버(cont.) for( ; ; ){ /* Wait for a connection from a client process. * This is an example of a concurrent server. */ clilen = sizeof(cli_addr); clientFd = accept(serverFd, (struct sockaddr *) &cli_addr, &clilen); printf("Server called\n"); if((childpid = fork()) < 0){ printf("server: fork error"); exit(0); } else if(childpid == 0){ /* child process */ printf("serverFd = %d, clientFd = %d\n", serverFd, clientFd); /* process the request */ write(clientFd,"Hello!",7); close(clientFd); /* close original socket */ return -1; close(clientFd); /* parent process */ 10. 시스템 프로그래밍

inetclient.c : 인터네트 클라이언트 /* compile : gcc -o client client.c -lsocket -lnsl */ /* execute : inetclient hostname(or server IP) */ #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #define PORTNUM 3000 main(int argc, char *argv[]) { int clientFd; char str[10]; char* hostaddress; struct sockaddr_in serv_addr; struct hostent* hostStruct; struct in_addr* hostNode; if(argv[1] == NULL){ printf("Usage: inetclient hostname(or server IP)\n"); printf(" (Ex) inetclient isis.inchon.ac.kr(or 210.126.35.99)\n"); exit(0); } 10. 시스템 프로그래밍

inetclient.c : 인터네트 클라이언트(cont.) hostStruct = gethostbyname(argv[1]); if(hostStruct == NULL) return(0); hostNode = (struct in_addr*) hostStruct->h_addr; hostaddress = inet_ntoa(*hostNode); /* Fill in the structure "serv_addr" with the address of the * server that we want to connect with. */ bzero((char *) &serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(hostaddress); serv_addr.sin_port = htons(PORTNUM); /*Open a TCP socket (an Internet stream soskcet). */ if((clientFd = socket(AF_INET, SOCK_STREAM, 0)) < 0) printf("client: can't open stream socket"); /* Connect to the server */ if(connect(clientFd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) printf("client: can't connect to server"); printf("clientFd = %d\n", clientFd); read(clientFd, str, 10); printf("%s\n", str); close(clientFd); exit(0); 10. 시스템 프로그래밍

10.8 인터네트 셸 설계 셸의 기능을 적합한 크기로 구성하기 위해 제한 파이프와 후면 처리 기능 제공 표준 유닉스 셸과 유사하면서, 인터네트-명시적 기능 추가 셸의 기능을 적합한 크기로 구성하기 위해 제한 모든 토큰(token)은 공란(tab 또는 space)에 의해서 분리 파일 이름 대치는 지원되지 않음 10. 시스템 프로그래밍

10.8 인터네트 셸 명령 구문 : 표준 유닉스 셸의 명령어 구문과 유사 <internetshellcommand> = <sequence> [ & ] <sequence> = <pipeline> { ; <pipeline> }* <pipeline> = <simple> { | <simple> } <simple> = { <token> }* { <redirection> }* <redirection> = <fileRedirection> | <socketRedirection> <fileRedirection> = \> <file> | >> <file> | \< <file> <socketRedirection> = <clientRedirection> | <serverRedirection> <clientRedirection> = @\>c <socket> | @\<c <socket> <serverRedirection> = @\>s <socket> | @\<s <socket> <token> = a string of chracters <file> = a valid UNIX pathname <socket> = either a UNIX pathname ( UNIX domain socket ) or an Internet socket name of the form hostname.port# 10. 시스템 프로그래밍

10.8 인터네트 셸 인터네트 셸 시작하기 내장 명령어 소스 프로그램 : P553 내장 명령어 기능 인터네트 셸 실행 파일 이름 : ish 인터네트 셸 프롬프트 : 의문부호(?) ish 시작시 자신을 호출한 셸에서 $PATH 환경변수를 상속받음 $PATH 값은 내장명령어 setenv를 사용해 변경 가능 인터네트 셸 종료시: control-D 내장 명령어 소스 프로그램 : P553 내장 명령어 기능 echo { <token> }* 터미널에 token을 에코(echo) cd path 셸의 작업 디렉토리를 path로 변경 getenv name 환경 변수 name의 값을 표시 setenv name value 환경 변수 name의 값을 value로 설정 10. 시스템 프로그래밍

소켓 응용 프로그램 인터넷 토크 프로그램 인터넷 채팅 프로그램 netprog의 talk_server.c talk_client.c 소스코드 참조 실행 % talk_server 포트번호 % talk_client 서버호스트IP주소 포트번호 인터넷 채팅 프로그램 하나의 프로세스가 채팅 참가 신청 처리와 클라이언트들의 통신 처리를 다 할 수 있도록 accept() 또는 read()에서 계속 기다리는 동기(synchronous, blocking) 모드 대신 select() 시스템 호출을 이용하여 소켓을 비동기(asynchronous, non-blocking) 모드로 이용 netprog의 chat_server.c chat_client.c 소스 코드 참조 % chat_server 포트번호 % chat_client 서버호스트IP주소 포트번호 10. 시스템 프로그래밍

select() select() select() 시스템 호출 형식 소켓에서 발생하는 I/O 변화를 기다리다가 지정된 /O 변화가 발생하면 리턴 됨 초기 소켓 s와 참가한 클라이언트들의 소켓의 I/O 변화 감지 select() 시스템 호출 형식 int select ( int maxfdp1, /* chleo 파일(및 소켓) 번호 크기 +1 */ fd_set *readfds, /* 읽기 상태 변화를 감지할 소켓 지정 */ fd_set *writefds, /* 쓰기 상태 변화를 감지할 소켓 지정 */ fd_set *exceptfds, /* 예외 상태 변화를 감지할 소켓 지정 */ struct timeval *tvptr); /*select() 시스템 호출이 기다리는 시간 */ FD_ZERO(fd_set *fdset) 매크로로 모든 비트 지움 FD_SET(int fd, fd_set *fdset) 매크로로 소켓 fd의 fdset 변화를 감지하기 위해 fdset 중 fd에 해당하는 비트를 1로 지정 FD_ISSET(int fd, fd_set *fdset) 매크로는 fdset의 해당 fd 비트가 1로 지정되어 있으면 양수값 리턴하므로 fd에게 fdset 변화가 발생했는지 판단 10. 시스템 프로그래밍

X 윈도우 프로그램과 시스템 관리 X 윈도우 프로그래밍 시스템 관리 /usr/X/demo 실행해 보기 puzzle spider xeyes xsol 등 X manager : http://www.netsarang.co.kr에서 30일 버전 다운로드 Http://marvel.inchon.ac.kr/~mysung  Lecture Notes  X Window Program 참조 Anonymous ftp multi cd pub/xprog 참조 시스템 관리 Http://marvel.inchon.ac.kr/~mysung  Lecture Notes  System Administration 참조 10. 시스템 프로그래밍

과제 …12/23(월)까지 문제 1 : 가위, 바위, 보 게임의 인터넷 버전 두 명의 경기자들이 서로 다른 인터네트 기계에서 게임을 할 수 있는 가위, 바위 보 게임을 작성하라. … 이 명령을 호스트 xx에서 실행 … 지역포트 5000 사용 $ refree 5000 … 이 명령을 호스트 yy에서 실행 $ player xx 5000 … 이 명령을 호스트 zz에서 실행 문제 2 : 인터넷 채팅 프로그램 채팅 서버가 임의의 클라이언트가 채팅에 참가하는 요청을 하면 이를 채팅 참가자 리스트에 추가하며 채팅에 참가하고 있는 클라이언트들이 보내 오는 메시지를 모든 채팅 참가자에게 다시 방송하는 기능을 수행해 주는 chat_server와 chat_client 인터넷 채팅 프로그램을 실행하고 분석해 보고, 이 채팅 프로그램에 채팅 참가자 목록을 보여주는 ?who 명령을 추가 하라. 실습 주의 사항 포트번호 수정해서 서버 실행 : 1023 < 포트번호 < 5000 실습 끝난 후 반드시 서버 프로세스 종료 : kill -9 프로세스번호(ps 명령으로 알아냄) 10. 시스템 프로그래밍

오! 유닉스 수고 하셨습니다! 유닉스는 재미있다. 유닉스는 사용하기는 쉽지만 배우기는 어렵다. 유닉스의 모든 것을 배우는 것은 불가능하다. 필요한 것과 재미있을 것 같다고 생각되는 부분에 관심을 쏟는 것이 좋다. 유닉스는 세련되고 영리한 사람들을 위한 도구의 집합이다. 수고 하셨습니다!