한남대학교 컴퓨터공학과 소프트웨어공학실험실 최 용 준

Slides:



Advertisements
Similar presentations
Python Socket/HTTP overmania. 목표  소켓을 이용하여 기본적인 서버 - 클라이언트 모델을 구현할 수 있다.  간단한 웹서버를 소켓을 이용하여 작성할 수 있다.
Advertisements

1 안드로이드 네트워킹 안드로이드 앱 프로그래밍 여 규리.
Java Socket 통신 이개혁 정대준.
Network Lab. Byoung-Son, Choi
WSAAsync Select 김대열 Bit - Academy Sunmoon University, Korea.
10장. 소켓 입출력 모델(I) 블로킹과 넌블로킹 소켓의 특징을 이해한다. Select 소켓 입출력 모델을 이해하고 활용한다.
Understanding of Socket and File I/O
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
Chapter 06. UDP 서버/클라이언트.
TCP/IP Socket Cover Slide 조태문.
Network Lab. Young-Chul Hwang
TCP Client/Server Program
Department of Computer Science and Engineering
TCP/IP 소켓 프로그래밍 - C 버전 중에서
소켓 모델 주소 지정 in_addr_t inet_addr(const char *ip_address) 연결 지향 모델 (TCP)
4장. 소켓 유형과 프로토콜 Network Lab. 이 원 구 1.
PHP 웹 프로그래밍 (PHP Web Programming) 네트워크 프로그래밍 문양세 강원대학교 IT대학 컴퓨터과학전공.
TCP/IP Socket Cover Slide 조태문.
Linux Socket Programming - Introducing Sockets –
TCP Client/Server Program
Network Lab. Seoung Hyeon, Lee
Multimedia & Mobile Communications Lab.
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
제 14장 Multicast & Broadcast
Department of Computer Engineering
한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실
Department of Computer Engineering
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 7장 소켓 연결의 우아한 종료 인공지능실험실 석사 2학기 이희재
Linux서버를 이용한 채팅프로그램 지도 교수님 : 이형원 교수님 이 름 : 이 은 영 학 번 :
(Web Programming & Practice)
네트워크 프로그래밍 Yang-Sae Moon Department of Computer Science
Department of Computer Engineering
Homework 6… 12월 2일(금) 11:59pm까지 자신의 이름과 학번을 출력해 주는 유닉스/리눅스 네트워크 소켓 서버 프로그램 과 클라이언트 프로그램 을 작성해 보세요 참고 (실습1) Hello 프로그램 helloserver.c helloclient.c 컴파일.
Chapter 8 연결형 프로토콜 서버 발표자 : SE Lab 황 성 하
Department of Computer Engineering
Department of Computer Engineering
Chapter 06. UDP 서버/클라이언트.
인공지능실험실 박사 1학기 장성만 TCP/IP Socket Programming… 9장 소켓의 다양한 옵션 인공지능실험실 박사 1학기 장성만
TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.
ARP Project 조 충 호 교수님 김 세 진 조교님 조 진 형 변 익 수
School of Electronics and Information. Kyung Hee University.
프로젝트 발표 순서 12/7(수), 팀 별 15분 발표순서 PPT (팀 별 이름, 구현 내용, 결과-그래프 포함) 각 기법당
Department of Computer Science and Engineering
13장 고급 입출력 함수 박사 4학기 최 성자.
Socket Address Structure and Byte Ordering Functions
Socket Address Structure and Byte Ordering Functions
소켓의 옵션 School of Electronics and Information. Kyung Hee University.
Chapter 07. 소켓 옵션.
TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.
Department of Computer Engineering
School of Electronics and Information. Kyung Hee University.
8장 쿠키와 세션 한빛미디어(주).
Department of Computer Engineering
Department of Computer Engineering
인터넷 주소변환 School of Electronics and Information. Kyung Hee University.
CHAP 21. 전화, SMS, 주소록.
Chapter 04. TCP 서버/클라이언트.
Chapter 02. 윈도우 소켓 시작하기.
JSP Programming with a Workbook
세션에 대해 알아보고 HttpSession 에 대해 이해한다 세션 관리에 사용되는 요소들을 살펴본다
MIDP 네트워크 프로그래밍 ps lab 김윤경.
Department of Computer Engineering
AdcRead API 함수 분석 마이크로프로세서.
인공지능실험실 박사 1학기 장성만 TCP/IP Socket Programming… 제 8장 도메인 이름과 인터네 주소 인공지능실험실 박사 1학기 장성만
채팅 및 파일전송 프로그램 권 경 곤 김 창 년.
소켓의 생성과 프로토콜의 설정 School of Electronics and Information.
Network Lab. Young-Chul Hwang
Department of Computer Science and Engineering
Department of Computer Engineering
중간 결과 보고 ( Server & Client )
Presentation transcript:

한남대학교 컴퓨터공학과 소프트웨어공학실험실 최 용 준 Socket Option 한남대학교 컴퓨터공학과 소프트웨어공학실험실 최 용 준 한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실

이 장의 목적 getsockopt(2)을 이용하여 소켓 옵션값을 가져오기 setsockopt(2)을 이용하여 소켓 옵션값을 지정하기 필요한 소켓 옵션을 찾아내어 적용하는 방법

내용 소켓 옵션 가져오기 – getsockopt() 소켓 옵션 지정하기 – setsockopt() 소켓형태 ( SO_TYPE ) 가져오기 – stream, dgram 소켓 옵션의 역할 SO_REUSEADDR SO_LINGER SO_KEEPALIVE SO_BROADCAST -> 13장 SO_OOBINLINE -> 14장 SO_PASSCRED & SO_PRERCRED -> 17장

Getsockopt() Synopsis & Protocol level, Option Name Option Name SO_NODELAY SOL_TCP SO_ERROR SOL_SOCKET SO_TYPE SO_RCVBUF SO_SNDBUF SO_OOBINLINE SO_BROADCAST SO_LINGER SO_KEEPALIVE SO_REUSEADDR Option Name Protocol level #include <sys/type.h> #include <sys/socket.h> int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen);

Getsockopt() 예제 12.1 초기화 소켓생성 send 버퍼크기 확인 receive 버퍼크기 확인 소켓 종료 Variable initialize socket() getsockopt() – SO_SNDBUF getsockopt() – SO_RCVBUF close()

Getsockopt() 적용 초기화 (line 31~35) 소켓 생성 (line 40) int z; int s = -1; /* 소켓 초기화 */ int sndbuf=0; /* 보낼 버퍼의 크기 */ int rcvbuf=0; /* 받을 버퍼의 크기 */ socklen_t optlen; /* 옵션의 길이 */ s = socket(PF_INET, SOCK_STREAM, 0);

assert(optlen == sizeof sndbuf); Getsockopt() send 버퍼의 크기 알아내기 (line 44~52) 버퍼 검증 (line 54) optlen = sizeof sndbuf; z = getsockopt(s, SOL_SOCKET, SO_SNDBUF, &sndbuf, &optlen); if ( z ) bail("getsockopt(s, SOL_SOCKET, SO_SNDBUF)"); assert(optlen == sizeof sndbuf);

assert(optlen == sizeof rcvbuf); Getsockopt() receive 버퍼의 크기 알아내기 (line 56~64) 버퍼 검증 (line 66) optlen = sizeof rcvbuf; z = getsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &optlen); if ( z ) bail("getsockopt(s, SOL_SOCKET, SO_RCVBUF)"); assert(optlen == sizeof rcvbuf);

Getsockopt() 출력하기 (line 71~75) printf("Socket s : %d\n", s); printf(“ Send buf: %d bytes\n", sndbuf); printf(“ Recv buf: %d bytes\n", rcvbuf);

Getsockopt() 결과 [yong8e@selinux chap12]$ make getsndrcv gcc -c -D_GNU_SOURCE -Wall -Wreturn-type getsndrcv.c gcc getsndrcv.o -o getsndrcv [yong8e@selinux chap12]$ ./getsndrcv Socket s : 3 - Send buf: 65535 bytes - Recv buf: 65535 bytes

Setsockopt() 예제 12.2 초기화 소켓생성 send 버퍼크기 지정 receive 버퍼크기 지정 소켓 종료 Variable initialize socket() setsockopt() – SO_SNDBUF setsockopt() – SO_RCVBUF getsockopt() – SO_SNDBUF getsockopt() – SO_RCVBUF close()

Setsockopt() 적용 초기화 (line 29~35) 소켓 생성 (line 40) int z; int s = -1; /* 소켓 초기화 */ int sndbuf=0; /* 보낼 버퍼의 크기 */ int rcvbuf=0; /* 받을 버퍼의 크기 */ socklen_t optlen; /* 옵션의 길이 */ s = socket(PF_INET, SOCK_STREAM, 0);

Setsockopt() 버퍼 크기 설정 sndbuf = 5000; /* send 버퍼의 크기 설정 */ z = setsockopt(s, SOL_SOCKET, SO_SNDBUF, &sndbuf, sizeof sndbuf); if ( z ) bail("setsockopt(s, SOL_SOCKET, SO_SNDBUF)"); rcvbuf = 8192; /* receive 버퍼의 크기 설정 */ z = setsockopt(s, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof rcvbuf); bail("setsockopt(s, SOL_SOCKET, SO_RCVBUF)");

Setsockopt() 출력하기 (line 71~75) printf("Socket s : %d\n", s); printf(“ - Send buf: %d bytes\n", sndbuf); printf(“ - Recv buf: %d bytes\n", rcvbuf);

Setsockopt() 결과 [yong8e@selinux chap12]$ make setsndrcv gcc -c -D_GNU_SOURCE -Wall -Wreturn-type setsndrcv.c gcc setsndrcv.o -o setsndrcv [yong8e@selinux chap12]$ ./setsndrcv Socket s : 3 Send buf: 10000 bytes Recv buf: 16384 bytes 5000 byte -> 10,000 byte 참고) /usr/src/linux-2.2.16/net/core/socket.c

참고 SO_RCVBUF & SO_SNDBUF /usr/src/linux-2.2.10/net/core/socket.c case SO_SNDBUF: if (val > sysctl_wmem_max) val = sysctl_wmem_max; sk->sndbuf = max(val*2, 2048); sk->write_space(sk); break; case SO_RCVBUF: if (val > sysctl_rmem_max) val = sysctl_rmem_max; sk->rcvbuf = max(val*2, 256);

getsockopt() – SO_TYPE 예제 12.3 초기화 소켓생성 버퍼타입 확인 소켓 종료 Variable initialize socket() getsockopt() – SO_TYPE close()

So_type 옵션 적용 소켓타입 가져오기 결과 출력하기 z = getsockopt(s, SOL_SOCKET, SO_TYPE, &so_type, &optlen); printf(" SO_TYPE : %d\n", so_type);

So_type 옵션 결과 [yong8e@selinux chap12]$ make gettype gcc -c -D_GNU_SOURCE -Wall -Wreturn-type gettype.c gcc gettype.o -o gettype [yong8e@selinux chap12]$ ./gettype Socket s : 3 SO_TYPE : 1 SOCK_STREAM = 1 SOCK_DGRAM = 2 SO_TYPE = 1; /* SOCK_STREAM */ SO_TYPE = 2; /* SOCK_DGRAM */

Forked Server connected SO_REUSEADDR 옵션 Connect 존재하는 프로세스 Server listening on 192.168.0.1 port 9099 (PID 926) Forked Server connected To client (PID 927) telnet 192.168.0.2 port 1035 Connect Connect Socket Fork()

SO_REUSEADDR 옵션 역할 조건 소켓의 재사용 같은 IP 주소와 port를 가진 소켓이 없어야한다. 같은 IP 주소와 port를 가진 소켓이 있는 경우 SO_REUSEADDR 옵션이 TRUE로 셋팅되야 한다.

SO_REUSEADDR 옵션 Synopsis #define TRUE 1 #define FALSE 0 int z; /* 상태 코드 */ int s; /* 소켓 번호 */ int so_reuseaddr = TRUE; z = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &so_reuseaddr, sizeof so_reuseaddr);

SO_LINGER 옵션 역할 운영모드 소켓이 close() 함수를 호출하였을 때 소켓을 어떻게 종료할 것인지를 제어한다. Struct linger { int l_onoff; int l_linger; }

SO_LINGER 옵션 운영모드 l_onoff : FALSE l_onoff : TRUE , l_linger : nonzero L_linger 무시, close() 함수 호출하여 소켓 종료 l_onoff : TRUE , l_linger : nonzero 타임아웃(지정된 시간)이 적용, 시간안에 데이터 전송이 완료되면 성공된 값이 리턴, 전송이 완료되지 않으면 에러 발생하여 errno는 EWOULDBLOCK 반환 l_onoff : TRUE , l_linger : zero 연결 취소, 데이터 받던 것도 폐기

SO_LINGER 옵션 Synopsis #define TRUE 1 #define FALSE 0 int z; /* 상태 코드 */ int s; /* 소켓 번호 */ Struct linger so_linger; So_linger.l_onoff=TRUE; So_linger.l_linger=30; z = setsockopt(s, SOL_SOCKET, SO_LINGER, &so_keepalive, sizeof so_keepalive); If (z) perror(“setsockopt(2)”);

SO_KEEPALIVE 옵션 역할 세션이 idle인 상태일때 클라이언트의 상태를 확인하여 서버에 의해 소켓을 종료시킨다. Probe message 를 원격 단말기에 보낸다. 활동이 있은 후 두시간 뒤에… 원격 단말기의 반응 응답을 한다. 세션에 대한 아무런 일도 하지 않음을 응답한다. ECONNRESET 에러 반환 반응이 없다. ETIMEOUT 에러 반환 EHOSTUNREACH 에러 반환

SO_KEEPALIVE 옵션 Synopsis #define TRUE 1 #define FALSE 0 int z; /* 상태 코드 */ int s; /* 소켓 번호 */ int so_keepalive = TRUE; z = setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &so_keepalive, sizeof so_keepalive); If (z) perror(“setsockopt(2)”);

SO_BROADCAST 옵션 Synopsis #define TRUE 1 #define FALSE 0 int z; /* 상태 코드 */ int s; /* 소켓 번호 */ int so_broadcast; So_broadcast = TRUE; z = setsockopt(s, SOL_SOCKET, SO_BROADCAST, &so_broadcast, sizeof so_broadcast); If (z) perror(“setsockopt(2)”);

SO_OOBINLINE 옵션 Synopsis #define TRUE 1 #define FALSE 0 int z; /* 상태 코드 */ int s; /* 소켓 번호 */ int so_oobinline; So_oobinline = TRUE; z = setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &so_oobinline, sizeof so_oobinline); If (z) perror(“setsockopt(2)”);

SO_PASSCRED, SO_PRERCRED 옵션 역할 PF_UNIX(PF_LOCAL) 소켓에서만 사용 17장에서 논의

요약 Getsockopt() 함수를 이용하여 소켓의 옵션값을 가져오는 방법에 대해… Setsockopt() 함수를 이용하여 소켓이 필요로 하는 옵션을 지정하는 방법에 대해… 소켓의 옵션에는 어떠한 것들이 있는지…