<4D F736F F D204B FC7C1B7CEB1D7B7A55FC0AFB4D0BDBA20B1E2B9DD20BCD2C4CF20C7C1B7CEB1D7B7A1B9D65FC0CCC8A3BCBA2E646F63>

Size: px
Start display at page:

Download "<4D F736F F D204B FC7C1B7CEB1D7B7A55FC0AFB4D0BDBA20B1E2B9DD20BCD2C4CF20C7C1B7CEB1D7B7A1B9D65FC0CCC8A3BCBA2E646F63>"

Transcription

1 유닉스기반소켓프로그래밍 exp team 이호성

2 1. Network 의기본 네트워크의기본적인사항에대해먼저알아보도록하겠습니다. 거의인터넷표준으로자리잡은 TCP/IP에대해서만알아보도록하겠습니다. 그러나 TCP/IP 주제만가지고도몇개의강좌를해야되므로, 자세한내용은다른서적이나강좌를참고하세요. 제가추천하는책은 TCP/IP Illustrated, Volume 1 (W.Richard Stevens 저 ) TCP/IP Protocol Suite (Behrouz A, Forouzan 저 ) 를추천합니다. 둘다원서입니다. 영어가부담스러우신분은각서적에대한번역서도있으니번역의질등을잘알아보고선택하시기바랍니다. 다른책을참고하셔도크게상관은없으나간략한소개만되어있는것이아닌자세한내용이있는것을보세요. 왜냐하면정확한 TCP/IP의동작을알아야지네트워크에오류가있을때보다쉽게오류를수정할수있기때문입니다. 클라이언트와서버구조 대부분네트워크프로그램은서버와클라이언트로구분할수있습니다. 두개를구분하는기준은그역할이무엇이냐입니다. 그기준을간단히설명하면 서버 : 클라이언트가어떤작업의요청이들어오면요청을처리하고그결과를클라이언트에게알려주는역할 클라이언트 : 서버에게작업을요청하고그작업의결과를받아서보여주는역할 이렇게설명할수있습니다. 클라이언트 / 서버구조는 ( 이하 C/S) 우리일상에도많은예가있습니다. 가장흔한예가웹브라우저와웹서버입니다. 인터넷익스플로러나네스케이프가클라이언트역할을하고접속한그리고우리에게서비스를제공하는컴퓨터가서버라고생각하시면됩니다. 정확히는아파치나 IIS 같은 http 서버를말합니다. 여기서클라이언트와서버의차이는클라이언트는서버하나와통신을하지만, 서버는여러개의클라이언트를상대합니다. 그래야만더많은사용자들에게서비스를제공할수있습니다.

3 그러나모든것이 C/S 구조로된것은아닙니다. 클라이언트와서버역할을모두하는것도있습니다. P2P(Peer To Peer) 가그것입니다. 대표적인소프트웨어로소리바다나구루구루같은것들이여기에속합니다. P2P는클라이언트와서버의역할을동시에하고있습니다.( 여기에대한내용은 에서논의되고있으니참고하세요.) TCP/IP TCP/IP 를알아보기전에간단히프로토콜 (Protocol) 의정의에대해서알아보도록하겠습니다. 둘이상의통신개체사이에교환되는메시지의형태, 의미, 전송순서, 그리고메시지송수신및기타사전에수행할동작을정의한규약 두개이상의호스트 ( 컴퓨터 ) 사이에서데이터를약속에의한방법으로주고받자는것입니다. TCP/IP 도이런프로토콜의한종류입니다. 보통 TCP/IP 라부르지만정확히는 TCP/IP 프로토콜그룹 ( 패밀리 ) 라고부릅니다. 그룹이므로 TCP와 IP 프로토콜만있는것은아닙니다. TCP, UDP, ARP, RARP, ICMP 등여러가지가같이있는프로토콜입니다. 여기에서대표적인프로토콜이 TCP와 IP 이기때문에 TCP/IP 라고부릅니다. 네트워크프로토콜들은대부분계층 (Layer) 이라는개념을가지고있습니다. 여기서 OSI 7 Layer 를설명드리고싶지만, 이번글은소켓과관련된글이므로다른서적이나강좌를참고하세요. 이것은꼭알아야할기본적인네트워크개념이니꼭익히셔야합니다. 계층의개념을간단히말씀드리면, 어떤계층의통신상대의같은계층과의미있는통신을합니다. 그리고각계층들은그밑계층이제공하는서비스를이용하여그상위계층에서비스를제공합니다. 만약한계층의인터페이스가변한다면, 그바로상위계층에만영향을줍니다. 그리고어느한계층에서생성된메시지들은상대방의같은계층에서분석되고작동합니다. 무슨말인지조금어렵게느껴질수있습니다. 저도계층개념을이해하는데어려움을느꼈습니다. 일단 OSI 7 Layer 를보시면서네트워크의개념을잡으시기바랍니다. 간단히그림을보도록하겠습니다.

4 상호통신계층 N+1 계층 N+1 상위계층에서비스제공 계층 N 상호통신 계층 N 상위계층에서비스제공 상호통신계층 N-1 계층 N-1 네트워크흐름 < 그림 > 네트워크계층과흐름 그럼 TCP/IP 의계층은어떻게되어있는지알아보도록하겠습니다. 응용계층트랜스포트계층네트워크계층링크계층 Telnet, FTP 등 TCP, UDP IP, ICMP, IGMP 장치드라이버와인터페이스카드 < 그림 > TCP/IP 의계층 TCP/IP는위그림과같이 4계층으로이루어져있습니다. 혹은링크계층을물리계층과데이터링크계층으로나누기도하는데크게다르지않습니다. OSI 7 Layer 를보시면큰무리

5 없이이해됩니다. 그럼각계층을하나씩살펴보도록하겠습니다. 1) 링크계층 물리적인인터페이스와관련된하드웨어적인부분을제어합니다. 운영체제와디바이스드라이버나그와관련된랜카드, 그와연결된케이블같은것을제어하는계층을말합니다. 2) 네트워크계층 네트워크상의패킷의이동을제어하는계층입니다. 패킷이라는말이처음나왔는데, 패킷은네트워크를통해데이터를전달할때헤더와데이터의묶음을말합니다. 정확히이계층에서는 IP 데이터그램이라고합니다.( IP를이용하여신뢰성없이전달됩니다.) 이패킷에는송 / 수신지의정보가포함되어있습니다. 이계층의역할은한마디로우편물의주소와같습니다. 어느곳에편지를보낸다고할때, 여러우체국을거쳐목적지의우편함까지옵니다. 우편물을패킷이라면우체국들은라우터나, 게이트웨이라고할수있습니다. 패킷이가려고하는호스트 ( 컴퓨터 ) 까지의이동을담당하는곳이네트워크계층입니다. 주로 IP가이역할을하는데 IP는신뢰성이보장되지않습니다. 확실히갔는지아닌지알수없습니다. 또다른기능들이많이숨어있는계층이지만여기까지하도록하겠습니다. 3) 트랜스포트계층 상위응용층에대해두호스트간의데이터흐름을제공합니다. TCP/IP 에는 TCP 와 UDP라는트랜스포트프로토콜이있습니다. TCP는위의상위계층이준데이터를목적지로전달과흐름제어의기능을제공합니다. 흐름의제어란데이터를언제보내야하는지얼마큼의크기로보내야하는지어떤것을보내야하는지를제어한다고간단히생각해도될것같습니다. 위의네트워크계층에서우편물과같아잘보내어졌는지잘받았는지확인할길이없다고했습니다. 그러나 TCP는이러한것까지알아서해줍니다. 즉전화라고보시면됩니다. 우리가타인에게전화를걸면, 신호음이가고상대편이받을때까지기다립니다. 만약상대방이받지않는다면, 우리는다시전화를걸수있습니다. TCP도마찬가지입니다. 보내고잘받지못했다면다시보내는것이죠. TCP 는네트워크계층의상위계층입니다. 이전 Layer 를설명할때, 하위계층의인터페이스를이용한다고했습니다. 즉. TCP도 IP 데이터그램을이용하여정보가전달되는것입니다. 그래서패킷만두고본다면, TCP도신뢰성이없습니다. 그러나. IP의상위계층인 TCP는이러한점을보안하여서비스를해줍니다. 즉, 시간이얼마나지났는데와야할패킷이안온다무언가문제가있다. 이런식으로보안합니다.

6 TCP는연결지향서비스이고두호스트간의신뢰성높은데이터흐름을제공합니다. 연결지향이라는말은 TCP는데이터를주고받기전에클라이언트와서버가이제연결해서데이터를주고받겠다는약속을하는것입니다. 그리고데이터를보내면그데이터가반드시목적지에도착하고, ( 일정시간내에받지못하면패킷이손실되었다고보고, 다시보내달라고요청을합니다.) 보낸순서또한똑같다는것입니다. TCP로보내는패킷을 TCP 세그먼트 (segment) 라고보통부릅니다. UDP는비연결형서비스입니다. 즉, 클라이언트와서버가연결약속은하지않고바로데이터를주고받는다는것을말합니다. 그리고신뢰성이없습니다. 즉, 데이터가목적지에반드시도착하리라는보장이없습니다. 물론보낸순서도마찬가지입니다. UDP로보내는패킷을 UDP 데이터그램 (datagram) 이라고부릅니다. 주로 TCP를사용하기는합니다만 UDP도쓰이는곳도많습니다. UDP가속도가비교적빠르기때문에패킷하나없어져도크게관계없는실시간방송이라던지그런곳에쓰입니다. 요즘게임에도 TCP 와 UDP를같이섞어서많이사용한다고합니다. 예를들어 TCP와 UDP를조금더알아봅시다. 만약서버에서 3개의패킷을보낸다고가정을한다면여러가지라우터나게이트웨이들은패킷의 IP를보고이패킷의경로를정해목적지까지보내줍니다. 3개의패킷은가는도중의네트워크의상태에따라서다른경로를통해전달될수도있습니다. 1번패킷이도중에손실되고 3번이 2번보다먼저목적지에도착할수도있습니다. 만약 TCP 연결이라면 1번이도착하지않았으므로다시 1번을보내달라고하고서버는다시 1번부터 3번까지보내줍니다. 여기서 1번만보낼수도있지만알고리즘이복잡하고네트워크가충분히빠르므로 1, 2, 3을모두보냅니다. 그런데 UDP는 3, 2번패킷을그대로받습니다. 1번이있는지도모릅니다. 그냥받은대로쓰는것입니다. 그런특성들은프로그래머들이짜는응용계층에서별도로처리를해주어야합니다. 4) 응용계층 간단히우리가쓰는네트워크응용프로그램을말합니다. IP IP는인터넷상의고유의주소입니다. 전세계에서유일합니다. 4바이트 (32비트) 의숫자로구성된주소입니다. 랜카드와 1:1로대응됩니다. 예를들면 과같은식으로되어있습니다. 이런표시방식을 dotted-decimal 방식이라고합니다. 사람이알기쉽게이런식으로쓰는거죠. 실제로는 이런식으로되어야컴퓨터가알아볼수있습니다. IP는클래스 A 클래스 B 클래스 C 클래스

7 D 클래스 E 가있습니다. 클래스 범위 A 클래스 B 클래스 C 클래스 D 클래스 E 클래스 < 표 > IP 클래스와범위 각클래스들은이런범위를가지고있습니다. 클래스 E는나중을위해예약되어있는클래스입니다. 클래스 D는멀티캐스트를위한 IP입니다. 한마디로우편물이가기위한자신의집의주소라고보시면됩니다. 도메인주소 컴퓨터는 IP를인식하지만사람이외우기는조금불편합니다. 그래서도메인주소라는것을사용합니다. bgda.org 이런식으로쓰면사람이보다알기겠지요. 컴퓨터는도메인이입력되어들어오면, 그도메인에대항하는 IP로변환해서사용합니다. 이런서비스를 DNS (Domain Name Service) 라고합니다. Port 포트 (Port) 는하나의컴퓨터에실행중인여러네트워크프로그램을구분하기위해부여된번호입니다. 16비트로구성된번호입니다. 즉, 우편물이집에도착했는데그우편물이누구의것이냐는것입니다. 여기서집을하나의컴퓨터 ( 호스트 ) 라하고, 주소를컴퓨터의 IP, 우편물에적힌이름은포트번호라고이해하시면쉬울것입니다. 즉, 컴퓨터까지는왔는데그컴퓨터의어느프로그램이패킷을받을지를알아야하니이런번호가부여됩니다. 우리가자주쓰는웹서버나 ftp 서버같은것들도전부포트번호가있습니다. 그런데이런것들은자주많이쓰이기때문에포트번호를지정해놓았습니다. 그래서우리들은인터넷주소만입력하면바로웹페이지를열수있는것입니다. 포트번호를따로적지는않습니다. 왜냐하면, 미리이포트번호는 http의번호이다라고정해놓았기때문입니다. 그렇게많이쓰는서버들의포트들을 well-known 포트라고합니다 까지는 well-known 포트로되어있습니다. 그래서보통새로운서버를만든다면이포트 (well-know port) 는되도록피하는것이좋습니다. 포트번호가 16비트니포트번호는충분할것입니다.

8 루프백 (loopback) 클라이언트와서버가같은호스트에서 TCP/IP를이용하여서로통신할수있도록하는것입니다 까지가루프백주소로써 localhost라는이름으로도할당하고있습니다. 루프백으로보내어진데이터는밖으로는보내어지지않습니다. 그러나브로드캐스트나멀티캐스트주소로보내어진것은루프백에복사된다음밖으로나가게됩니다. 그리고자신의 IP로보내어진것도루프백으로보내어집니다. MTU MTU(Maximum Transmission Unit) 최대전송단위라는것인데대부분의네트워크는패킷의상한선이정해져있습니다. 그것보다많은양은그보다작게쪼개어서보냅니다. 이런것을단편화 (Fragmentation) 라고합니다. 단편화된패킷은받을때합쳐지게됩니다. Path MTU 두호스트의네트워크는다를수있습니다. 즉, 누구는 LAN이고누구는전화선일수도있는겁니다. 그때두네트워크의 MTU는다릅니다. 그리고두호스트사이에어떠한네트워크도있을수있습니다. 이두호스트사이에패킷을전송하는링크상의최소 MTU 크기가 Path MTU라합니다. 만약에 A 와 D가통신을한다고하면 A와 D사이에는 B, C 라는네트워크가있다고해봅시다. A - B - C - D A의 MTU가 100 B 200 C 70 D 80이라는 MTU를가지고있다면 A와 D의 Path MTU는 70이되는것입니다. TTL Time-to-live 라는것으로패킷이통과할수있는라우터의수를제한하기위해사용됩니다. 하나의라우터를거칠때마다 TTL 값이 1씩줄어들어 0이되면패킷은버려지게 ( 삭제 ) 됩니다. 라우터를많이안거치는로컬에서는작아도상관없지만, 외국이나그런먼곳 ( 거쳐야할라우터가많은 ) 곳에보내려면 TTL값은충분히커야합니다. 그렇지않으면, 가는도중에 TTL값이 0이되어패킷이삭제될수있습니다. 라우터는두개의같은네트워크를연결하는중간다리역할을하는것이라고보시면됩니다. 게이트웨이란것도있는데, 이것은서로다은네트워크를연결하는역할을한다고보시면됩니다.

9 TCP 연결 (Three-way Handshake) 위에서 TCP는연결지향서비스라고했습니다. TCP 연결설정은다음의시나리오로이루어집니다. 1. 서버는들어오는연결을받을준비가되어있도록준비되어야합니다. 2. 클라이언트가접속을요청합니다. ( 클라이언트가서버에게 SYN 세그먼트를보냄 ) 3. 서버는클라이언트의 SYN 도착을클라이언트에게알립니다. ( 서버가클라이언트에게 SYN을보냄 ) 4. 클라이언트는서버에게 SYN도착을알림 ( 클라이언트가서버에게 ack를보냄 ) 이때교환하는패킷이 3개인데그래서 Three-way Handshake 라합니다. 쉽게말해서클라이언트가서버에게 접속한다. 그러면서버는 그래접속해라. 합니다. 그리고클라이언트는 알았다. 라고하고접속이완료되는겁니다. TCP 연결종료 다음과같은시나리오입니다. 1. 클라이언트에서 close를호출하면데이터를그만보내겠다는 FIN 세그먼트를서버에보냅니다. 2. 서버가 FIN을받으면 FIN을받았다는 ack를클라이언트에게보내고 close가호출됩니다. 3. 그러면서버도 FIN을클라이언트에게보내게됩니다. 4. 그러면마지막으로클라이언트는 FIN을받고 ack를서버에게보냅니다. 여기서는클라이언트가 close 를먼저했는데. 서버가먼저할수도있습니다. 2. 소켓 API 이글에있는소스는 TCP/IP 소켓프로그래밍 C버전 < 사이텍미디어 > 를참고하였음을알려드립니다. 소켓 API 란?

10 네트워크상에서호스트간에통신을가능하게해주는일반적인인터페이스입니다. 응용계층과트랜스포트계층사이의중간에위치해있습니다. 소켓의주소구조 소켓 API는소켓과관련된주소를지정하기위해일반적인소켓구조체를정의해놓았습니다.( 소켓주소에는 TCP/IP를위한주소만있는것이아니라다양하게많이존재합니다.) 그형태는 struct sockaddr unsigned short sa_family; /* Address family */ char sa_data[14]; /* Family-specific address */ ; 이렇게생겼습니다. 실제 TCP/IP 소켓주소를지정할때는이구조체를사용하지않습니다. TCP/IP에맞추어사용합니다. TCP/IP 소켓주소를위해사용하는구조체를보면, struct in_addr unsigned long s_addr; ; struct sockaddr_in unsigned short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; ; sockaddr_in의 sin_family 인자는인터넷주소패밀리입니다. 이번강좌에서는 AF_INET를사용합니다. ( 일단이렇게만알아두세요.) 이건 IPv4 프로토콜이라는것을말합니다. sin_port 는포트번호를지정하는것입니다. short니 2바이트, 16비트정수입니다. sin_addr은 IP주소가들어가는부분입니다. 위에 struct in_addr의정의가나와있습니다. 정의에서나오는것과같이여기에는 IP의 32비트주소가들어갑니다. 그러니

11 "128,23,23,14" 이런문자열이들어가진않습니다. 이걸 이런식으로변환하여넣어주어야합니다. 두개를변환하는함수물론있습니다. 그리고그다음이 sin_zero[8] 이부분인데여기에는 0값이들어갑니다. 즉, 사용하지않습니다. 사용하지않는데왜여기에있는가하면, 앞에일반적인구조체를보여드렸습니다. 그것의크기에맞추어서 8바이트더미값이들어가있습니다. 바이트순서 (Byte Ordering) 컴퓨터메모리에데이터가저장되는순서를말합니다. 이것은수행되는기계에 (CPU) 의존됩니다. 여기에는 Little-Endian 과 Big-Endian이있습니다. Little-Endian 은가장낮은바이트부터저장되고 Big-Endian은가장높은바이트부터저장됩니다. 그림을보면쉽게이해가가실겁니다. 4바이트정수를저장한다고하면, 1byte byte addr A addr A+1 addr A+2 addr A+3 < 그림 > Byte Ordering 위에것이 Little-Endian 밑에그림이 Big-Endian 입니다. Little-Endian 방식에대표적인것이 Intel계열의 CPU이고 Big-Endian은 Sparc 계열의 CPU입니다. 같은기종의통신이면바이트순서는중요하지않지만, 서로다른기종의통신이라면중요해집니다. 통신을할때는 Big-Endian을따릅니다. 그래서네트워크로보내기전에이바이트순서를조정해주어서보내어야만합니다. 그럼네트워크순서와호스트순서를바꾸는함수에대해서알아보도록하겠습니다. 함수이름에는규칙이있는데, h - host n - network l - long

12 s - short 이렇습니다. 예를하나들면, long int htonl (long int hostlong); 무슨말일까요? 함수이름이 htonl 입니다. 호스트에서네트워크로바꾸라는얘기입니다. type은 long 형이고요. 이렇게각각 long와 short에대해함수가있습니다. long int htonl (long int hostlong); long int ntohl (long int netlong); short int htons (short int hostshort); short int ntohs (short int netshort); 사용의예를들어보죠. 포트번호가 2바이트입니다. 이것을네트워크로보내기위해서는바이트순서를조정해야합니다. 소켓주소구조체에대입은 SocketAddress.sin_port = htons(appport); 이렇게합니다. 소켓기술자란? 소켓기술자는유닉스의파일기술자와동일합니다. 다만그 I/O가네트워크일뿐입니다. 쉽게말해컴퓨터에서네트워크로나가는문의고유번호라고생각하시면됩니다. 네트워크로데이터를보내거나받으려면커널에게소켓을만들어달라고요청을합니다. 그럼커널은소켓하나를열고우리에게그소켓의고유번호를줍니다. 그것이소켓기술자입니다. 유닉스의파일기술자에대해잘아신다면, 똑같다고보면이해가빠르실겁니다. 이제부터소켓번호라고하면이소켓기술자를얘기하는것으로하겠습니다. TCP 소켓 이제 TCP 서버와클라이언트의기본적인함수호출구조를살펴보도록하겠습니다. 서버 : socket() -> bind() -> listen() -> accept() -> send()/recv()

13 서버가여기까지호출을하게되면클라이언트의접속이들어오는지기다립니다. 클라이언트 : socket() -> connect() -> send()/recv() 여기서클라이언트와서버는 three-way handshake를하여연결을합니다. 그후에서버와클라이언트는 send() 와 recv() 를이용해데이터를주고받습니다. 그리고 close() 함수를호출하여접속을끊게되는것입니다. 그럼서버와클라이언트에서공통으로사용하는소켓생성과소멸에관련된함수에대해서알아보도록하겠습니다. 그전에여기서설명하는함수는다른말이없으면리턴값이에러면 -1을리턴하고 errno 이라는전역변수에에러값을넣어줍니다. 이 errno의값을보고무슨에러가났는지알수있습니다. int socket( int protocolfamily, int type, int protocol ); socket 함수의역할은커널에소켓을열어달라고요청을하여그소켓번호를우리에게넘겨줍니다. protocolfamily는 AF_INET를씁니다. IPv4 protocol 을사용한다는것을알리는것입니다. 물론다른것도있지만이글에는이것만씁니다. type은 TCP를사용할땐 SOCK_STREAM, UDP를사용할땐 SOCK_DGRAM 을넣어서어떤서비스를사용하는지커널에알려줍니다. protocol은 raw소켓을쓸때말고는 0을설정합니다. 그러니여기서는항상 0을사용할것입니다.(IPPROTO_TCP, IPPROTO_UDP를이용하셔도됩니다.) raw소켓은 IP계층의서비스를직접이용할때쓰는것입니다. int close( int sockfd ); 소켓을닫고통신을종료합니다. sockfd는닫을소켓번호입니다. 성공하면 0을실패하면 - 1을반환합니다. 닫힌소켓은더이상사용할수없습니다. 여기선 TCP를설명하니 TCP에대해조금더설명하겠습니다. 내부적으로 TCP는 send buffer 와 recv buffer가있습니다. 만약에 close를호출하였는데 send buffer에보낼데이터가남아있으면그것을모두보낸후에앞서설명드린 TCP 연결종료절차를따릅니다. 위두함수에는좀더볼것이있는데. 그것은참조카운터입니다. socket로소켓을열면참조카운터가 1 증가합니다. 그리고다른자식프로세스로복사될때도참조카운터가 1증가합니다. close는참조카운터를 1감소시킵니다. 그러다가참조카운터가 0이되면소켓

14 을닫습니다. 소켓참조카운터가 0 이아니라면그것은열린상태가되는것입니다. int shutdown( int sockfd, int howto ); 이함수도네트워크연결을종료시키는데사용합니다. close() 와다른점은 close는참조카운터를 1감소시키고참조카운터가 0이되면종료하는데 shutdown() 은참조카운터와상관없이 TCP의연결종료절차를시작합니다. 그런데 close() 함수는양방향 (send recv) 둘다종료시키는데반해 shutdown함수는 howto인자에따라동작이달라집니다. 위에서 close 함수를설명할때약점이하나있었습니다. close() 호출후에받을데이터가있다면어떻게할까요? 그건받을수없습니다. 그러나 shutdown의 howto 인자를설정하면그것이가능합니다. 그값에는다음과같은것이있습니다. SHUT_RD : 연결의 recv 한쪽만닫습니다. 이제이소켓으로는데이터를받을수없습니다. 그리고 recv buffer도폐기됩니다. SHUT_WR : 연결의 send 한쪽만닫습니다. 이제이소켓으로는어떤데이터도보낼수없게됩니다.send buffer에남아있는데이터는모두보낸뒤에 TCP 연결종료절차가뒤따릅니다. SHUT_RDWR : 연결의양쪽다받습니다. 만약에자신은데이터를다보냈다하면, SHUT_WR인자를설정하여 shutdown() 을호출하면다른쪽이보내는데이터를받을수있게되는것입니다. 이제는 TCP 서버의기본적인함수에대해서알아보도록하겠습니다. TCP 서버는통신의종단에서클라이언트의연결요구를수동적으로기다리는역할을합니다. 그럼그과정을요약하면, 1. socket() 함수로소켓을생성 2. bind() 함수로생성된소켓에포트번호를연결 3. listen() 함수를이용해클라이언트의연결요구를받도록함 4. 클라이언트의연결요청이들어오면 accept() 함수로새로운소켓을얻음 5. send()/recv() 를사용하여클라이언트와통신 6. 서비스가끝나면 close() 함수를이용하여클라이언트의연결을닫음 이제여기에관련된함수에대해알아보겠습니다.

15 int bind( int sockfd, struct sockaddr * localaddress, unsigned int addresslen ); bind() 함수의원형입니다. bind함수는 localaddress 변수에있는 IP 주소와 Port 번호를연결시켜주는역할을합니다. 만약, 클라이언트 (ip 포트 6000) 가 ip port 5000 번으로접속을요청해왔다고합시다. 그럼서버는그 ip와포트변호를보고어느프로그램의패킷인지를알수있어야합니다. 바로그것을알려주는그리고명시하는함수가바로 bind입니다. 그런데서버는여러개의클라이언트를처리한다고했습니다. 클라이언트는똑같은 IP와포트번호를이용해서 ( 사실 IP는다를수있습니다.) 접속을해올것입니다. 그예를설명해보죠. A 라는서버에 x y라는두개의클라이언트가접속을해왔다고합시다. 서버의 IP 는 port 5000 x클라이언트 IP port 6000 y클라이언트 IP port 7000 이라고가정하면, x가먼저클라이언트에게접속을하고 y가접속을합니다. 그러면 TCP는연결을위해소켓이새로이생성되는데그곳에 socket pair이라는구조체에서버의 IP와 Port 클라이언트의 IP와 Port를같이저장합니다. 그러면두개의 x, y클라이언트가구분이되겠죠? 이렇게클라이언트와서버 IP, Port를모두사용하여구분한다고생각하시면됩니다. 그리고아까서버의 IP가다를수있다고했는데그것은하나의컴퓨터에하나의 IP. 즉, 하나의네트워크인터페이스 ( 랜카드 ) 만이있는것은아닙니다. IP는인터페이스당유일하게하나입니다. 그럼만약에서버가 2개의인터페이스를가지고있다면서버프로그래밍의설정에따라서동시에두 IP에서오는패킷을받을수있습니다. 나중에서버프로그래밍예제를보시면나옵니다. INADDR_ANY 를서버설정에서 IP부분에설정을하면모든인터페이스로부터패킷을받는다는의미입니다. 물론특정인터페이스에서오는것만받을수도있습니다. 그때서버를 bind할때그받을 IP만지정하면되는것입니다. int listen ( int socket, int backlog ); 첫번째인자는소켓번호입니다. 두번째인자가설명이조금필요한데, 간단히설명하면

16 연결요구개수의최대값을나타냅니다. 무슨말이신지이해가잘안되실수도있는데조금더설명을드리면, TCP가접속을할때 three-way handshake를한다고했습니다. 이도중에또다른클라이언트가접속을요구할수도있습니다. 그럼어떻게해야할까요? 일단어디에다저장해두어서지금하고있는연결설정을끝내고차례대로들어온순서대로연결설정을해주면되겠지요? 그저장해둘클라이언트연결요구의수를말하는것입니다. 내부적으로는연결이완료된것대기중인것이렇게두개의큐가있습니다. 이큐는 FIFO(First In First Out) 로동작합니다. 연결완료된것과대기중인것모두합친것의수입니다. 만약에그대기수도다차있는상태에서다시연결요구가들어오면어떻게할까요? TCP는거기에대해서아무것도안합니다. 그럼클라이언트는아무응답이없으므로일정시간뒤에다시연결요구를합니다. 예전에는이수는 5 를사용했던것같습니다. 많은예제들이아직도 5를사용하고있는데, 5 라고해서꼭 5개만되는것은아닙니다. 운영체제나네트워크인터페이스드라이브에따라서다를수있습니다. 어떤것은입력된값그대로쓰고어떤건여기에다가 1.5를곱한수를사용하는등다양합니다. 그리고이제 5 라는제한도없어졌습니다. 더큰수도지원합니다. 만약에운영체제에서지원하는수보다더큰수를넣는다면어떻게될까요? 그렇게해도운영체제가알아서최대값을안넘게해준다고합니다. int accept( int socket, struct socket * clientaddress, u nsigned int * addresslen ); 이함수의기능은 listen 함수가연결요구의개수를지정하고내부큐에는연결설정이 (three-way handshake) 완료된큐와대기중인큐두개가있다고했습니다. 그완료된큐에서순서대로 (FIFO) 하나가져와서상대방과연결된하나의소켓을만드는역할을합니다. 만약에완료된큐에아무것도없다면생길때까지블록됩니다. 함수가성공하면새롭게생성된소켓번호를리턴합니다. 이소켓을통해클라이언트와통신을합니다. int send( int socket, const void * msg, unsigned int msglength, int flag ); int recv ( int socket, void * recvbuffer, unsigned int bufferlength, int flag ); 이함수들은이름그대로데이터를주고받는함수입니다. send 함수의 socket 인자는보낼곳의소켓번호이고, msg는보낼메시지의시작포인터입니다. msglength 는보낼메시지의길이입니다. recv 함수의 socket 인자는 send 함수와동일합니다. recvbuffer은받을버퍼

17 의시작포인터이고, bufferlength는해당버퍼의크기입니다. Send 함수의리턴값은보낸데이터의 byte수입니다. 그리고 recv 함수의리턴값은 recvbuffer에넣은데이터의수를리턴합니다. 만약상대방이접속을끊으면 recv 함수의리턴값은 0이됩니다. TCP에서데이터를주고받을때잊지말아야할중요한것이있습니다. 예를들어설명을하면, 데이터 100바이트를보내겠다고가정합시다. send( socket, buffer, 100, 0 ); 이런식으로보내게됩니다. 그런데 send함수는 100바이트전부를보낼때까지블록됩니다.(blocking mode 일때 ) 그리고 send로보낸데이터를받을때는 recv함수를사용합니다. 받을버퍼로 char buffer[512] 를선언했다고하지요. recv( socket, buffer, 512, 0 ); 그런데이 recv함수는우리가원하는데이터의양만큼데이터를받지못합니다. 내부적으로 TCP는보내는버퍼와받는버퍼두개가있다고했습니다. send 함수는보내는버퍼에보낼데이터를옮기고리턴됩니다. recv 함수는받는버퍼에 1바이트라도있으면그것을가져옵니다. 우리가 512 바이트를선언하고 512를인자로넘겨 512바이트이상은가져오지않습니다. blocking mode일때 recv 함수는받는버퍼가비어있으면데이터가들어올때까지기다렸다가들어오면그것을받아서리턴합니다. 즉, 우리가받기를원하는만큼받을수없다는것입니다. recv 해서받을데이터의양은아무도알수없습니다. 그래서항상리턴값을체크해서얼마나받았는지확인을해야하는것입니다. 그리고 TCP는 stream 방식입니다. 클라이언트에서 100바이트와 50바이트 250바이트를이렇게 3번을보냈다고합시다. 그런데이데이터들을구분할수가없다는것입니다. 그것을구분하는것은응용프로그램의몫입니다. 데이터는받는버퍼에구분없이연결되어들어가있는것입니다. 이점을항상염두하고프로그래밍을해야합니다. 즉, 서버에서 recv 를했을때받은크기는 100 이아닐수있습니다. 100보다클수있고작을수도있습니다. TCP 클라이언트함수에대해서알아보도록하겠습니다. 먼저 TCP 클라이언트작성순서를알아보면, socket() 함수로소켓을생성 connect() 서버와의연결 send()/recv() 사용하여통신 close() 로연결닫음

18 이런식으로작성합니다. connect() 란함수말고는나머지는서버와비슷합니다. 클라이언트는 bind() 함수를사용하지않는데그것은포트번호를꼭일정하게묶을필요가없기때문입니다. 커널이알아서적당하고사용하지않는포트번호를할당해줍니다. int connect( int socket, struct sockaddr * foreignaddress, unsigned int addresslength ); 첫번째 socket는생성한소켓의번호입니다. 그리고두번째는쉽게말해서버의주소를넣어서보내는것입니다. 그렇게하면그쪽으로연결을요청해서 there-why handshake 를하는것입니다. addresslength 는 sockaddr 의크기입니다. 소켓옵션 소켓옵션은일반적으로디폴트로사용해도문안하게사용할수가있습니다. 그러나보다세밀한설정을하길바란다면이러한옵션들을설정하여그어플리케이션에맞게사용할수있습니다. 소켓옵션에는많은것들이있으니 Unix Network Programming vol 1 의 7장에소켓옵션에대해서잘설명해놓았습니다. 그것을참고하시길바랍니다. 여기서는자주쓰이는옵션에대해서알아보도록하겠습니다. 그전에소켓을옵션을설정하고설정된것을얻어오는함수를알아보도록하겠습니다. int getsockopt(int socket, int level, int optname, void * optval, unsigned int * optlen); int setsockopt(int socket, int level, int optname, const void * optval, unsigned int * optlen); 위의두개의함수입니다. 하나는얻어오는함수고하나는설정하는함수입니다. 첫번째인자는소켓옵션을얻어오거나설정할소켓의번호입니다. 두번째인자는소켓의레벨인데, 어떤것을설정혹은얻을것이냐하는겁니다. 일반적인소켓의옵션인가 IP에관한내용인가? TCP에관한내용인가? 아니면 IPv6의내용인가? 하는것을나타냅니다. 여기에는다음과같은것들이있습니다. SOL_SOCKET : 일반적인소켓의옵션들이있습니다. IPPROTO_IP : IP 설정과관련있는곳으로주로멀티캐스트와관련된것들이있습니다. IPPROTO_TCP : TCP와관련있는옵션들이있습니다.

19 세번째인자는그레벨에서어떤것을말하느냐입니다. 일반적인소켓의옵션에서도그중에무엇을변경혹은얻어올것인가하는것입니다. 버퍼의크기를변경할건지아니면브로드캐스드인지등그런세부적인옵션을말합니다. 네번째인자는 setsockopt 함수에서는설정될값이무엇이냐하는것이고, getsocketopt 함수에서는얻은값을저장할변수의포인터입니다. 다섯번째는네번째변수의길이입니다. 변수라말했지만이것은구조체로된것도있습니다. 네번째인자를보면 void * 형입니다. 이것은무엇을말할까요. 즉, 변수의형이정해지지않았다는것입니다. 각옵션에따라 int도있고, unsigned char도있고, 구조체도있습니다. 이제자주사용하는옵션들에대해서알아보도록하겠습니다. 1) SOL_SOCKET Level SO_RCVBUF, SO_SNDBUF 버퍼의크기를바꾸는옵션입니다. 커널의 recv Buffer, send Buffer의크기를조절하는데사용합니다. 이것을어떻게잘설정하느냐에따라성능이향상된다고합니다. 버터의크기는테스트와네트워크의상태에따라서달라진다고합니다. 그런데보통은 ( 대역폭 * 지연율 ) * 2 의공식에따라버퍼의크기를설정한다고합니다. recv Buffer 의크기를변경하는코드를보도록하겠습니다. int rcvbuffersize; int sockoptsize;... // 소켓리시브버퍼크기얻기 sockoptsize = sizeof(rcvbuffersize); if(getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &rcvbuffersize, &sockoptsize) < 0) printf("getsockopt() failed n");

20 // 리시브버퍼의크기를 2배로만든다. rcvbuffersize *= 2; if(setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &rcvbuffersize, sizeof(rcvbuffersize) < 0) printf("setsockopt() failed n"); 여기에서보면 SOL_SOCKET, SO_RCVBUF 가나옵니다. 즉, 일반적인소켓의옵션중에 recv Buffer 의크기를말합니다. recv Buffer 와마찬가지로 send Buffer 변경옵션은 SOL_SOCKET level에있습니다. 그리고 SO_RCVBUF 대신에 SO_SNDBUF라는것을넣어주면변경이가능합니다. 그런데하나주의하실점이있습니다. 바로호출순서입니다. 소켓의옵션들의대부분이호출순서가중요합니다. 클라이언트의경우 connect() 하기전에 recv Buffer 를변경해야하는데, 왜냐하면 three-way handshake 할때 MSS를알려주기때문입니다. 그리고서버의경우에 listensocket (listen() 함수호출시전달되는소켓번호 ) 의설정은 listen() 호출전에먼저설정을해주어야합니다. 쉽게설명해서연결이성립될때그러니까 three-way handshake할때한번에보낼수있는 TCP 세그먼트 ( 패킷 ) 의크기의최대값을알려줍니다. 연결이성립되면최대세그먼트의크기 (MSS) 를변경할수없어연결하기전에미리바꾸어두는것입니다. SO_LINGER SO_LINGER 옵션이있습니다. 이것은 TCP 에서적용되는것인데 close함수의행동을지정하는옵션입니다. close() 하면 recv Buffer 나 send Buffer 에보내거나받을데이터가있다면전부처리후 close() 를합니다. 그방법을바꾸는것입니다. 먼저전달되는구조체에대해서알아보도록합시다. struct linger int l_onoff; int l_linger; ; setsockopt(sock, SOL_SOCKET, SO_LINGER, &linger 구조체주소, sizeof(linger));

21 이런식으로호출하면되겠죠. 그리고세부적인동작설정은 linger구조체의변수설정에있습니다. l_onoff 가 0이면기본적인 TCP동작이적용됩니다. l_onoff가 0이아니거 ( 주로 1을넣죠.) l_linger가 0이면연결이닫힐때버퍼의내용을버려버리고그냥연결을끊어버립니다. l_onoff가 0이아니고 l_linger도 0이아니면소켓이닫힐때블럭당한다고합니다. 이소켓옵션을쓸땐 2번을주로씁니다. 쓰는이유는만약서버가종료되고다시시작할때입니다. 연결이끊어지고남은데이터를전송합니다. 그때남은데이터를보낸다면클라이언트에게 ack 메시지 ( 받았다는확인메시지 ) 를받아야완전한종료가이루어집니다. 그메시지를기다리는시간이있습니다. 만약그것을다받지못했다면다시보내야하지요. 그런상황에서다시서버를시작하려고하면이미사용중인포트라는에러를내게됩니다. 그래서이런옵션을사용하는것입니다. 그런데그것은바람직한해결방법이아니라고합니다. 그래서이런옵션은추천되고있지않습니다. 이에대한해결책은따로있습니다. 그것이다음에설명할포트재사용옵션입니다. SO_REUSEADDR 이옵션을선택하여주면위의예에서말한서버재시작시다시시작할수있습니다. 간단히사용법을알아보도록하지요. int nresue = 1; setsockopt(listensocket, SOL_SOCKET, SO_REUSEADDR, &nreuse, sizeof(nreuse))) 이것도호출순서가있는데 bind() 하기전에이옵션을설정해놓아야합니다. 이렇게하면소켓의포트를재사용할수있습니다. 2) IPPROTO_IP Level 여기에는주로멀티캐스트와관련된옵션들이있습니다. 다음에멀티캐스트를하실때그때사용법을참고하기면됩니다. 3) IPPROTO_TCP Level

22 TCP_NODELAY TCP에보면잔잔한패킷들을하나씩다보내는것이아니라네트워크상에작은패킷들을줄이기위해 Nagle 알고리즘을사용하여어느정도묶어서한꺼번에보내는것이있습니다. 이것을사용할지안할지를설정하는옵션입니다. 이것은주로서버에서는이알고리즘을사용안한다고합니다. 왜냐하면다른일을해야하기때문에그냥바로보내버리는것이더욱효과적이라는것입니다. 패킷의개수가많아지기는하지만그런알고리즘의딜레이를버림으로보다빠른처리를할수있다는것입니다. 그러나클라이언트의경우는 Nagle알고리즘을사용합니다. 작은패킷을묶어보내네트워크의부하를줄이자는것입니다. 소켓옵션은다양하고많은것들이있고주의사항들이있습니다. 항상자신의프로그램에맞게올바른설정을하시고사용하시기전에여러가지로알아보시고하시기를바랍니다. 그리고옵션에서인자값을넘길때인자의형이다릅니다. 위의예제에서도 Linger옵션은구조체를사용하고다른것은 int 형이었습니다. 그리고윈속 (Winsock) 도다릅니다. 구조체로된부분은거의같지만 int로된부분은 BOOL로사용하는부분이많이있습니다. 잘알아보시고사용하시기바랍니다. 에코프로그램 그럼이제소스를보면서이제까지의내용들을정리하도록하겠습니다. 여기의모든소스는유닉스나리눅스용입니다. 윈도우에서는실행이되지않습니다. 구현할것은에코서버와클라이언트입니다. 에코서버는에코클라이언트가보낸데이터를받아서그대로다시에코클라이언트에게보내는것입니다. 그럼에코서버부터보도록하겠습니다. 1) 에코서버 서버의실행은 < 실행파일명포트번호 > 입니다. #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> // socket() bind() connect() #include <arpa/inet.h> // socketaddr_in, inet_ntoa() #include <netinet/in.h> // 만약 FreeBSD 라면이해더를추가해야한다.

23 #include <string.h> #include <unistd.h> #include <stdlib.h> #define RCV_BUF_SIZE 512 #define MAX_BACKLOG 5 int main(int argc, char * argv[]) struct sockaddr_in echoservaddr, echoclntaddr; int servsock, clntsock; unsigned short echoservport; unsigned int clntlen; char echobuffer[recv_buf_size]; int recvmsgsize; if(argc!= 2) printf("usage : %s port n", argv[0]); echoservport = atoi(argv[1]); if((servsock = socket(pf_inet, SOCK_STREAM, IPPROTO_TCP)) < 0) printf("socket() failed n"); memset(&echoservaddr, 0, sizeof(echoservaddr)); echoservaddr.sin_family = AF_INET; echoservaddr.sin_addr.s_addr = htonl(inaddr_any); echoservaddr.sin_port = htons(echoservport); if(bind(servsock, (struct sockaddr *)&echoservaddr, sizeof(echoservaddr))< 0)

24 printf("bind() failed n"); if(listen(servsock, MAX_BACKLOG) < 0) printf("listen() failed n"); for(;;) clntlen = sizeof(echoclntaddr); if((clntsock = accept(servsock, (struct sockaddr *) &echoclntaddr, &clntlen)) < 0) printf("accept() failed n"); if((recvmsgsize = recv(clntsocket, echobuffer, RCV_BUF_SIZE, 0)) < 0) printf("recv() failed n"); while(recvmsgsize > 0) if(send(clntsocket, echobuffer, recvmsgsize, 0)!= recvmsgsize) printf("send() failed n");

25 if((recvmsgsize = recv(clntsocket, echobuffer, RECVBUFSIZE, 0)) < 0) printf("recv() failed n"); close(clntsocket); 자, 이게에코서버의모습입니다. 우선소스부터분석하도록합시다. 우선서버의소켓을열고서버의주소정보를채우고 bind 시키고클라이언트의요구를듣는상태로들어갔습니다. 그리고클라이언트의연결요청이들어오면 accept함수를호출하여클라이언트와연결을하고그리고에코서비스를해주는과정으로되어있습니다. 지금제가설명한과정이분석이되실겁니다. 그래도좀더자세히설명에들어가도록합시다. 이서버는 TCP 서버입니다. 그것을알수있는부분은어디입니까? 소켓을처음생성하는부분입니다. servsock = socket(pf_inet, SOCK_STREAM, IPPROTO_TCP) 여기서 SOCK_STREAM 으로되어있습니다. 이것은연결형서버를말하는겁니다. 즉, TCP의서비스를이용하겠다는것입니다. 여기서마지막인자를 IPPROTO_TCP 라고되어있는데꼭이렇게써주는것은아닙니다. 보통은 0 값을전달합니다. 어느것을사용하나상관은없습니다. 명시적인것이좋으신분은 IPPROTO_TCP라고써주시면되겠습니다. 여기서 PF_INET 를사용했는데 AF_INET 와무엇이다를까요? PF 는 Protocol Family 의약자이고 AF는 Address Family의약자입니다. 글자는달라고내부적으로는구분하지않는다고합니다. 그래서여러곳에서는각각다릅니다. PF_INET를사용하는것이있고 AF_INET를사용하는곳도있습니다. 여기에접두어가자신이알기쉽다고생각하시는것을사용하시면될듯합니다. 중요한것은 IPv4라는겁니다. IPv6은 AF_INET6이라는것을사용합니다. 만약에 IP프로토콜독립적으로구성하고자하시려면이것을고려해주셔야합니다. 다음으로서버의주소를지정하고 bind 시켰습니다. memset(&echoservaddr, 0, sizeof(echoservaddr)); echoservaddr.sin_family = AF_INET; echoservaddr.sin_addr.s_addr = htonl(inaddr_any); echoservaddr.sin_port = htons(echoservport);

26 if(bind(servsock, (struct sockaddr *) &echoservaddr, sizeof(echoservaddr)) < 0) printf("bind() failed n"); 이부분입니다. 여기서 3번째줄에 INADDR_ANY 라는단어가들어갑니다. 서버의 IP 주소를넣어주는부분입니다. 직접 IP 주소를넣어주어도상관은없습니다. 그런데이렇게하면만약에서버의 IP가바뀌거나, 다른곳에서서버를가동시켜야한다면, 이부분도바꾸어야합니다. 그러면위소스에서쓰는것처럼쓰는것이더욱좋을것입니다. 그런데중요한것은그것이아닙니다. 서버는 ( 꼭서버만아니고 ) IP가여러개인서버도있습니다. 그럴경우예를들면, 여기서 bind 한포트를 5000번이라고합시다. 그리고서버의 IP가 과 두개의 IP를가지고있다고하면, 클라이언트가서버의아무 IP를가지고포트 5000으로들어오면우리의서버어플리케이션에서받겠다는것입니다. 즉, IP : , Port IP : , Port 5000 으로접속하는모든클라이언트의요청을받겠다는것입니다. 내부적으로는 INADDR_ANY는 0의값이들어가있다고합니다. 위서버코드에서서버의 IP를출력해보세요. 그럼 이출력될겁니다. 간단히실험하나해보도록하겠습니다. 도스명령프롬프트창을열어서 >nslookup daum.net 라고쳐봅니다. 물론네트워크가되는컴퓨터에서요. daum의 IP주소가나오는데여러개가나옵니다. 위명령은네임서버에 daum의정보를얻어오는것입니다. 서버에서에코서비스를처리하는부분을보도록하겠습니다. for(;;) clntlen = sizeof(echoclntaddr); if((clntsock = accept(servsock, (struct sockaddr *) &echoclntaddr, &clntlen)) < 0)

27 printf("accept() failed"); if((recvmsgsize = recv(clntsocket, echobuffer, RCVBUFSIZE, 0)) < 0) printf("recv() failed"); while(recvmsgsize > 0) if(send(clntsocket, echobuffer, recvmsgsize, 0)!= recvmsgsize) printf("send() failed"); if((recvmsgsize = recv(clntsocket, echobuffer, RECVBUFSIZE, 0)) < 0) printf("recv() failed"); close(clntsocket); 이부분입니다. 클라이언트가보낸문자를되돌려보내는부분입니다. 일단무한루프로서버는끝나지않습니다. 여기에서보면, 처음에 recv를받고 send를하고다시 recv를받습니다. 클라이언트는처음에코요구를하면문자열을한번만보내는데여기서는한번받고루프를돌면서보내고받고그럽니다. 왜냐면네트워크의상태에따라서 TCP는얼마나받을지모른다는것입니다. 그래서루프를돌면서못받은데이터가있으면받아서보내줍니다. 여기서에코서버와에코클라이언트의시나리오를생각해보도록합시다. 서버가일단가

28 동되고있고, 그리고클라이언트가 Hello라는문자를보내서버에게에코요구를보냅니다. 그런데네트워크상황이안좋아서서버는 Hell 까지만받고말았습니다. 이것은첫번째의 recv 에서받은데이터입니다. 그러고 while로들어가 send에서서버는 Hell을클라이언트에게보냅니다. 그리고다시 recv 로들어갑니다. 그리고 o 라는문자가옵니다. 그리고서버는 recv 로받아서다시클라이언트에게 o를보내어줍니다. 그리고다시 recv로들어갑니다. 그러면여기서서버는 recv 에서블럭됩니다. 네트워크에어떤데이터가들어올때까지블록되는것입니다. 그럼언제 recv가리턴되는가하면 TCP는연결을끝내고 close 를할때 recv에 0을리턴합니다. 설정될때 three-way handshake하는것처럼연결을끊을때도이와비슷한행동을합니다. 그러니까명시적으로끊겠다고하는것이죠. 서버가먼저끊을수있고클라이언트가먼저끊을수도있습니다. 어느한쪽에서 close를하면 끊겠다 는패킷을다른쪽에보내면다른한쪽에서는 알았다는그리고끊겠다 는그런종류의단계를취하는것입니다. 그러면여기서는클라이언트가먼저끊었다고합시다. 그럼서버의블록된 recv는 0을리턴합니다. 그리고 while 루프를끝냅니다. 그리고마지막에서버가 close를해서클라이언트와연결을닫습니다. 이제서버의구조에대해알아봅시다. 위서버는클라이언트당하나의소켓이열립니다. 처음서버에서소켓을열어 listen() 함수에전달하는소켓을보통듣는소켓 (listen socket) 이라고합니다. 연결요청은이소켓으로들어옵니다. 연결요청이들어오면 accept() 로다시소켓하나를열어서새로이열린소켓으로클라이언트와통신을하는것입니다. 그럼이제이서버의문제점을알아봅시다. recv에서데이터를받으면블록된다고했습니다. 그런클라이언트가접속을끝내지않는다면, 다른클라이언트의서비스는어려움이많이있습니다. 그리고서버가여러가지복잡한일을하는것이라면, recv가블록되프로세스가놀고있게되어효율적이지못합니다. 그래서이문제를해결하기위해넌블로킹모드, 비동기모드등이나옵니다. 기본적인서버의구조와네트워크는데이터를주고받을때무엇이든확신할수없다는것. 지금받은것이다받은것인지보낸것이전부보내어졌는지를어떻게확인하고처리하는지이해하시기를바랍니다. 그럼이번에는클라이언트를보기로하지요. 클라이언트는서버보다간단하니한번보시면서분석해보시기바랍니다. 보낸데이터를에코해서받을때어떻게받았는지어떻게다받았는지클라이언트는자신이서버에보낸문자의길이를알고있기때문에이것을활용했습니다. 한번보시면이해하시리라생각합니다. 2) 에코클라이언트 클라이언트의실행은 < 실행파일명서버 IP 에코문자포트 > 입니다.

29 #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> // socket() bind() connect() #include <arpa/inet.h> // socketaddr_in, inet_ntoa() #include <netinet/in.h> // 만약 FreeBSD 라면이해더를추가해야한다. #include <string.h> #include <unistd.h> #include <stdlib.h> #define RCV_BUF_SIZE 512 int main(int argc, char * argv[]) int sock; struct sockaddr_in echoservaddr; unsigned short echoservport; char * servip; char * echostring; char echobuffer[rcv_buf_size]; unsigned int echostringlen; int bytesrcvd, totalbytesrcvd; if((argc < 3) (argc > 4)) printf("usage: %s <Server IP> <Echo Word> [<Echo Port>] n", argv[0]); servip = argv[1]; echostring = argv[2]; if(argc == 4) echoservport = atoi(argv[3]); else echoservport = 7; // 에코서버의 well-know port입니다.

30 if((sock = socket(pf_inet, SOCK_STREAM, IPPROTO_TCP)) < 0) printf("socket() failed n"); memset(&echoservaddr, 0, sizeof(echoservaddr)); echoservaddr.sin_family = AF_INET; echoservaddr.sin_addr.s_addr = inet_addr(servip); echoservaddr.sin_port = htons(echoservport); if(connect(sock, (struct sockaddr *)&echoservaddr, sizeof(echoservaddr)) < 0) printf("connect() failed n"); echostringlen = strlen(echostring); if(send(sock, echostring, echostringlen, 0)!= echostringlen) printf("send() failed n"); totalbytesrcvd = 0; while(totalbytesrcvd < echostringlen) // 문자끝 NULL을넣기위해 RCVBUFSIZE-1 if((bytesrcvd = recv(sock, echobuffer, RCVBUFSIZE-1, 0)) <= 0) // 리턴값이 0이면서버와연결이끊어짐.. printf("recv() 실패혹은서버와연결이끊어졌다. n");

31 totalbytesrcvd += bytesrcvd; echobuffer[bytesrcvd] = ' 0'; printf(echobuffer); printf(" n"); close(sock); exit(0); 3. I/O 모델 Blocking I/O 위의에코서버가 Blocking mode 입니다. 소켓을열면기본적으로 Blocking mode가되는것이지요. 말그대로 Blocking 당한다고생각하시면되겠습니다. 위의에코서버를생각해봅시다. 에코서버는클라이언트로부터데이터를받기위해 recv() 함수를호출합니다. 그리고프로세스는클라이언트로데이터가올때까지멈춰있습니다. 그것이 Blocking 입니다. 그함수가일을마칠때까지기다리고있는것입니다. 에코서버처럼간단하고해야할일이별로없는서버는 Blocking으로만드는것이가능합니다. 그러나게임같이서버에서많은일을하는그리고많은사용자들을처리하는서버에는알맞지않습니다. 왜냐하면한클라이언트에게데이터를받기위해 recv() 에서서버가멈춰있다면다른클라이언트에게피해가있고, 다른필요한처리를하는데서버가놀고있게되기때문입니다. 그럼그런부분에서함수를바로리턴하게한다면즉, 만약리시브를호출해서받을데이터가있으면받고없다면넘어가서다른일을하면될것입니다. Non-blocking I/O 이렇게나온것이 Non-blocking 입니다. Non-blocking 은요청한 I/O를그상황에서할수있으면하고할수없다면거기서멈추지말고함수를리턴하여다른작업을할수있게해주는것입니다. 여기서리턴될때 (I/O를할수없어리턴될때 ) 다른오류코드를리턴한다면 I/O가이루어졌는지안이루어졌는지를알수있을것입니다. 그렇게동작하는모드가 Non-Blocking 입니다.

32 그런데여기서는몇가지문제가있는데만약에요청한 I/O를할수없다면클라이언트로부터데이터는받아야하니데이터를받을때까지확인하는작업이필요해지는것입니다. 계속반복문을돌려데이터를다받았는지를확인해야하는것입니다. 그것을 Polling 이라고부릅니다. 이것은 CPU의시간낭비인데그것을줄이는방법은어떤것이있을까요. 서버가여러가지일을하고있는상황에서클라이언트가어떤데이터를보내왔다고하면, 그럼여기서누군가가클라이언트가데이터를보내왔다는것을서버에게알려준다면, 그러면폴링 (polling) 을하는것보다는조금더좋은성능을보여줄수있을것입니다. I/O Multiplexing 번역하자면입출력다중화라고합니다. selcet() 함수나 poll() 함수를이용하여실제적으로구현합니다. 이런함수들을이용하여 I/O를호출하면실제적으로는시스템에서 blocking 됩니다. 어플리케이션에서는 blocking 당해있지는않습니다. 여기에여러개의소켓들을설정하여그소켓에 send, recv, error 등을설정할수있습니다. 그러면시스템에서그런설정된사항에맞는상황이일어나면어플리케이션에게그사항을알려줍니다. 그러면어플리케이션에서그것을보고알맞은처리를해주는것이죠. 그러나여기에도단점이있는데한번에 select로설정해줄수있는소켓의개수가제한이있다는것입니다 Signal Driven I/O 이방법은인터럽트와비슷하다고생각하시면됩니다. 이것은만약에어떤 I/O를요청하고그것이준비가되면어플리케이션에게신호를보내어준비되었다는것을알려주는것이지요. 만약에이러한방법을쓴다고한다면클라이언트에게서데이터가들어왔다면어플리케이션에서지정한신호가어플리케이션으로온다는겁니다. 어플리케이션에서는그러한신호를받으면그에따른적당한처리를해주면됩니다. 그런데여기에도약간의문제가있습니다. 그신호라는것이중복되어들어온다면뒤에온신호는무시됩니다. 그리고이방법은 TCP 에는적당하지않다고하는데왜냐하면 TCP 에서는신호를설정해두면수많은신호들이어플리케이션에게온다고합니다. 그리고신호가발생되어도어떤일이있었는지알수없다고합니다. 그래서주로 UDP에서사용한다고합니다. Asynchronaus I/O Signal Driven I/O 에서는 I/O작업이시작되는순간에신호를보내어알려주는것입니다. 비동기에서는 I/O작업이완료되었을때이사실을알려주는방식입니다. 대략적으로개념은이해하시리라생각이듭니다. 많은방법들이있습니다. Blocking 에서는

33 block 당하는것을해결하려고 non-blocking 이나오고 non-blocking 의폴링 (polling) 을해결하려는여러가지방법들이나온것같습니다. 유닉스에서는주로 I/O Multiplexing 을많이사용한다고합니다. 그러나실제성능을테스트해보면 non-blocking 이가장좋은성능을낸다고합니다. 그런데 non-blocking 은적성이힘들고, 유지보수가힘들다고합니다. 그래서 I/O Multiplexing 을사용하라고권장하는것같습니다. 요즘에는 kqueue 가 BSD 계열유닉스에서는그것이가장좋은성능을낸다고하고윈도우에는 IOCP(I/O complete port) 가좋은성능을낸다고합니다. 그러면이런좋은성능을내는것만사용하면되지않을까요? 그런건아닌것같습니다. 그서버의역할에맞는 I/O 모델을사용하는것이가장효율적일것입니다. Blocking 으로충분히감당할수있는서버인데무리해서다른모델을도입하는것은개발속도와유지보수면에서불리한면이있을수있습니다. 그리고서버의여러가지설계, 그런부분에서해당서버에잘맞는 I/O 모델을선택해서쓰면되겠지요. 이제위의에코서버를다시작성해봅시다. 위의에코서버는한번에한사용자만을처리할수있는그런서버였습니다. 그런데서버에서한클라이언트가아닌여러클라이언트를처리해주는경우가대부분입니다. 그럼어떤방법으로여러클라이언트를처리할까요? 일단 blocking으로생각을해보면앞강좌와같은코드가나올겁니다. ( 따로스레드나프로세스를생성하지않는다면말이지요.) 이방법은한클라이언트가접속을끝내지않는다면다른사용자들은끝날때까지가만히기다리고있는그런상황에이르게됩니다. 그럼위에서나온다른방법을한번살펴보죠. 우리는 TCP이기때문에시그널방식은접어두고, non-blocking 은폴링 (polling) 을사용해야하고성능은좋지만간단한에코서버이기때문에굳이복잡하게프로그래밍을할필요가없을것같습니다. 비동기모드는조금더많은공부를해야하니 I/O Multiplexing 으로하겠습니다. I/O Multiplexing 방법중하나가 select() 를이용하는방법입니다. 먼저 select() 함수에대해알아보도록하겠습니다. int select (int maxdescplus1, fd_set * readdescs, fd_set * writedescs, fd_set * exceptiondescs, struct timeval * timeout);

34 이것이 select함수의원형입니다. 인자를반대로가며설명을하겠습니다. 먼저 timeval 입니다. 이구조체는몇초인지, 그리고몇마이크로초인지를설정할수있습니다. 구조체를살펴보면, struct timeval long tv_sec; // 초 long tv_usec; // 마이크로초 ; 이구조체의필드를채워서보내면어떤입출력이준비가되거나시간이지나면 select() 함수가리턴됩니다. 그러니까지정된시간이상은입출력의준비를받지않겠다는것입니다. 만약이필드에전부 0으로설정을하면지정된입출력들을점검한뒤바로리턴됩니다. 그리고여기에 null값을주면무한히기다리게되는것입니다. 그다음인자를보면새로운 fd_set라는것이보입니다. 여기에 fd_set이라는것으로설정하여시스템에게어플리케이션에서무엇을해주길바라는지알려주는것입니다. 변수명을보면 read, write, exception이라는접두어가있습니다. 말그대로 recv에필요한것이면설정하여두번째인자에넣어주고 send가필요하면그다음, exception 에대한처리가필요하다면그다음의인자에설정하여넣어주면되는것입니다. 그러면 fd_set는어떻게생겨먹었을까요. 여러개의나열된비트필드로이루어져있습니다. 소켓번호 < 그림 > fd_set의구조 만약이렇게하면소켓번호 0번과 3번에어떤 I/O가일어나면알려달라는것입니다. 이것을 readdescs 인자에넣으면 0번과 3번에어떤데이터가들어오면 select문이리턴되는것입니다. 똑같이 write와 exception인자도동작이똑같습니다. 그런데 0번은표준입력을말합니다. 즉, 키보드를말하지요. 1번은표준출력을 2번은표준에러를말합니다. 표준에러와출력은주로모니터를가리킵니다. 소켓번호는유닉스의파일디스크립터와같다고하였습니다. 유닉스는전부파일로관리되니 0, 1, 2 는표준입력출력에러로지정되어있는것입니다. 다시위의그림을이야기하면키보드 ( 표준입력 ) 이나소켓번호 3번에어떤데이터가들어오면 select가리턴되는것입니다. 그런데비트필드로되어있으니까사용하기불

35 편합니다. 여기에는매크로가있습니다. 그매크로를이용해서설정하고, 지우고, 확인합니다. 그매크로를알아보면, 매크로명 설명 FD_ZERO(fd_set *fdset) *fdset의모든비트를 0으로설정 FD_SET(int fd, fd_set *fdset) *fdset 중소켓 fd에해당하는비트를 1로설정 FD_CLR(int fd, fd_set *fdset) *fdset 중소켓 fd에해당하는비트를 0으로설정 FD_ISSET(int fd, fd_set *fdset) *fdset 중소켓 fd에해당하는비트가 1이고, 소켓에 I/O 변화가생겼으면 1을리턴 < 표 > fdset 관련매크로들 이렇게있습니다. 처음에 FD_ZERO를이용하여초기화하고확인할소켓번호에 FD_SET로설정한뒤, select() 를호출합니다. 그리고 select가리턴되면, FD_ISSET로어느것이입력혹은출력, 에러가되었는지확인하여알아내는것입니다. 초기화는중요합니다. 잘못된값이들어가는것을방지하니깐요. 꼭초기화를해주시기바랍니다. 첫번째인자는설정될소켓번호의최대값에 +1을한것입니다. +1을한이유는배열과비슷합니다. 위의그림을보면 0부터시작합니다. 즉, 지정한소켓의최대값이아니라지정한소켓의개수를나타내는것이기때문입니다. select() 함수의리턴값은 -1이면에러를나타내고 0이면타임아웃을나타냅니다. 그리고양수이면준비된소켓번호의카운터를말합니다. 그럼소스를보도록하겠습니다. #include <stdio.h> #include <sys/socket.h> #include <unistd.h> #include <stdlib.h> #include <arpa/inet.h> #include <sys/time.h> #define MAX_BACKLOG 5 #define RCV_BUF_SIZE 512 int CreateTCPServerSocket(unsigned short port); int AcceptTCPConnection(int servsock); void HandleTCPClient (int clntsocket);

36 int main(int argc, char * argv[]) int * servsock; int maxdescriptor; fd_set sockset; long timeout; struct timeval seltimeout; int running = 1; int nports; int port; unsigned short portno; if(argc < 3) printf("usage : %s <Timeout (secs.)> <Port 1>... n", argv[0]); timeout = atol(argv[1]); noports = argc - 2; servsock = (int *) malloc(noports * sizeof(int)); maxdescriptor = -1; for(port = 0; port < noports; port++) portno = atoi(argv[port + 2]); servsock[port] = CreateTCPServerSocket(portNo); if(servsock[port] > maxdescriptor) maxdescriptor = servsock[port]; printf("starting server : Hit return to shutdown n"); while(running)

37 FD_ZERO(&sockSet); FD_SET(STDIN_FILENO, &sockset); for(port = 0; port < npports; port++) FD_SET(servSock[port], &sockset); seltimeout.tv_sec = timeout; seltimeout.tv_usec = 0; if(select(maxdescriptor+1, &sockset, NULL, NULL, &seltimeout) == 0) printf( "No echo requests for %ld secs... Server still alive n", timeout); else if(fd_isset(stdin_fileno, &sockset)) printf("shutting down server n"); getchar(); running = 0; for(port = 0; port < noports; port++) if(fd_isset(servsock[port], &sockset)) printf("request on port %d : ", port); HandleTCPClient( AcceptTCPConnection(servSock[port])); for(port = 0; port < noports; port++) free(servsock); close(servsock[port]);

38 exit(0); int CreateTCPServerSocket(unsigned short port) int sock; struct sockaddr_in echoservaddr; if((sock = socket(pf_inet, SOCK_STREAM, IPPROTO_TCP)) < 0) printf("socket() failed n"); memset(&echoservaddr, 0, sizeof(echoservaddr)); echoservaddr.sin_family = AF_INET; echoservaddr.sin_addr.s_addr = htonl(inaddr_any); echoservaddr.sin_port = htons(port); if(bind(sock, (struct sockaddr *) &echoservaddr, sizeof(echoservaddr)) < 0) printf("bind() failed n"); if(listen(sock, MAX_BACKLOG) < 0) printf("listen() failed n"); return sock; void HandleTCPClient (int clntsocket)

39 char echobuffer[rcv_buf_size]; int recvmsgsize; if((recvmsgsize = recv(clntsocket, echobuffer, RCV_BUF_SIZE, 0)) < 0) printf("recv() failed n"); while(recvmsgsize > 0) if(send(clntsocket, echobuffer, recvmsgsize, 0)!= recvmsgsize) printf("send() failed n"); if((recvmsgsize = recv(clntsocket, echobuffer, RCVBUFSIZE, 0)) < 0) printf("recv() failed n"); close(clntsocket); int AcceptTCPConnection(int servsock) int clntsock; struct sockaddr_in echoclntaddr; unsigned int clntlen; clntlen = sizeof(echoclntaddr); if((clntsock = accept(servsock, (struct sockaddr *) &echoclntaddr, &clntlen)) < 0)

40 printf("accept() failed n"); printf("handling client %s n", inet_ntoa(echoclntaddr.sin_addr)); return clntsock; 전체적인프로그램의흐름을보면, 사용자가사용하겠다는포트를여러개열어서각각클라이언트의요청이들어오기를기다리고있습니다. 사용자가정한시간에맞추어서말이죠. 그리고요청이들어오면에코서비스를하고만약사용자가리턴키를누르면서버가종료되는것입니다. (STDIN_FILENO가리턴키를누르면준비됨 ) 그러나이예제도부족합니다. 여기에서는한클라이언트를받던걸여러사용자에게받게하였을뿐입니다. 한사용자를전부처리할때까지다시다른클라이언트는기다려야하는것은아직해결되지못했습니다. 그럼어떻게하면공평하게여러사용자를처리할수있을까요? 만약각클라이언트마다그클라이언트를전담하는무언가를만든다면, 어느정도공평하게클라이언트를처리할수있을겁니다. 그방법에는클라이언트당하나씩프로세스를따로만들수도있습니다. 그러나프로세스를하나만든다는것은많은비용이들어갑니다. 한마디로메모리도많이먹고새로운프로세스를만드는데도시간이많이걸린다는것입니다. 또한컨텍스트스위칭 ( 다른프로세스로 CPU 타임을넘기는행동 ) 하는그비용도많이듭니다. 그리고사용자가아주많다면분명서버에무리가갈것입니다. 프로세스보다비용이조금드는스레드를한번생각해봅시다. 분명프로세스보다비용이덜드니프로세스보다는성능이좋을것입니다. 그러나사용자가많아진다면, 이것또한해결책은아닌것같습니다. 그러나서버의어떤작업을스레드로분리하면무언가좋은방법이나올것입니다. 그런방법에대해서는다른책이나강좌를참고하세요. 이번엔프로세스가아닌스레드를이용하여에코서버를한번만들어보도록합시다. 모든문제를해결할수있지는않지만공부하는차원에서는유용할것입니다. 유닉스에서는 POSIX라는표준이있습니다. 여기에는스레드에대한내용이있는데그것이 pthread입니다. 4. POSIX Thread

41 Thread vs Process 각클라이언트를다루기위해새로운프로세스를하나만드는것은비용이많이듭니다. 그내용을살펴보면, 프로세스가하나생성될때마다운영체제는메모리, 스택, 파일 / 소켓식별자들및기타를포함한부모프로세스의전체상태를복사 Thread들은같은프로세스내의멀티태스킹을허용함으로써이러한비용을감소. 새로생성된 Thread는부모와같은주소공간 ( 코드및데이터 ) 을공유하고, 부모의상태를복제할필요성배제 프로세스복제이후부모와자식간에정보를주고받기위해프로세스간통신 (IPC) 필요 ( 자식으로부터부모로정보를되돌리는것은더욱많은작업을요구 ) 프로세스중의모든 Thread가공유하는것 프로세스지시사항 대부분의데이터 공개된파일들 (Ex 지정번호들 ) 신호처리기와신호배치들 사용자와그룹 ID 각 Thread 자신만이갖는것 Thread ID 프로그램계수기와스택지시자를포함한레지스터의조합 ( 지역변수와반환주소를위한 ) stack errno 신호선별 우선순위이와같이비교될수있습니다. Basic Thread Functions : Creation and Termination 거의모든 pthread 함수는성공하면 0을리턴하고실패하면 0이아닌값을리턴합니다. 그러나 errno 변수는설정하지않는것이특징입니다. 밑의 pthread 함수들은모두여기에따른다고생각하시면됩니다. pthread 를사용하기위해서는밑의해더를추가해야합니다.

42 #include <pthread.h> int pthread_create ( pthread_t * threadid, // Thread ID, (unsigned int) const pthread_attr_t * attr, // Thread 속성, NULL Default void * (* func) (void *), void * arg ); // 여러인자를전달할때, structure 이용 스레드를생성합니다. 첫번째인자는스레드가생성되면그스레드의 ID가저장되는변수이고, 두번째인자는여러가지속성 ( 우선순위나스텍사이즈등을말합니다.) 을나타냅니다. default로하려면 NULL을전달하면됩니다. 세번째인자는스레드의입구함수 ( 스레드가시작되는함수, 스레드가할역할을기술해놓은함수 ) 입니다. 스레드가실행되면그함수를실행합니다. 입구함수의형태는반드시 void * ThreadMain(void * arg); 위와같은형태여야합니다. 그리고마지막은스레드입구함수의인자로전달될변수입니다. void pthread_exit ( void * status ); // 리턴할값 Thread 중단합니다. 만일 Thread가분리되지않으면 Thread ID와리턴값은종결프로세스의다른 Thread에의하여나중까지 pthread_join에남겨집니다. Thread가종결될때에는객체가사라지므로 status 는호출 Thread에지역적인변수를지정하면안됩니다. int pthread_join ( pthread_t tid, void ** status ); tid가가리키는 Thread가종료할때까지위의함수를호출한 Thread의수행을멈춥니다. 만약 status가 NULL이아니면 tid의리턴값은 status가가리키는영역에저장됩니다. pthread_t pthread_self ( void ); Thread 자신의 Thread ID 리턴합니다. 이값은 pthread_create() 로얻은스레드 ID와동일합니다. int pthread_detach ( pthread_t tid ); Thread 상태가부모의개입없이도종료시즉시해제합니다. 주로 pthread_detach

43 ( pthread_self() ); 로사용합니다. 보다더자세한사항은 Joinc의 Pthread API Reference ( 를참고하세요. TCP Echo Server 를위한클라이언트당 Thread 멀티태스킹 Source /****** TCPEchoServer_Thread.c *******/ #include <pthread.h> // for POSIX threads void * ThreadMain(void * arg); // Main program of a thread // Structure of arguments to pass to client thread struct ThreadArgs int clntsock; ; int main(int argc, char * argv[]) int servsock; int clntsock; unsigned short echoservport; pthread_t threadid; struct ThreadArgs * threadargs; if(argc!= 2) fprintf(stderr, "Usage: %s <Server Port> n", argv[0]); echoservport = atoi(argv[1]);

44 servsock = CreateTCPServerSocket(echoServPort); for(;;) clntsock = AcceptTCPConnection(servSock); // Create memory for client argument if((threadargs = (struct ThreadArgs *) malloc(sizeof(struct ThreadArgs))) == NULL) DieWithError("malloc() failed"); threadargs->clntsock = clntsock; // Create thread if(pthread_create(&threadid, NULL, ThreadMain, (void *) threadargs)!= 0) DieWithError("pthread_create() failed"); printf("with thread %ld n", (long int) threadid); void * ThreadMain(void * threadargs) int clntsock; // Guarantees that thread resource are deallocated upon return pthread_detach(pthread_self()); clntsock = ((struct ThreadArgs *) threadargs)->clntsock; free(threadargs); // Deallocate memory for argument HandleTCPClient(clntSock); return NULL; TCP 관련소스는앞의 select() 예제소스와같으니위의소스를보시면되겠습니다.

45 소스코드의컴파일은 $ gcc -o TCPEchoServer-Thread TCPEchoServer_Thread.c -Wall -lpthread (FreeBSD 라면 - pthread) 로하시면됩니다. 소켓부분은에코서버와거의같으니스레드부분만보도록하겠습니다. pthread_create(&threadid, NULL, ThreadMain, (void *) threadargs) 이부분이스레드를생성하는함수입니다. 입구함수인자로여기에서는소켓번호하나만전달합니다. 그런데전달되는구조체를 struct ThreadArgs int clntsock; ; 이렇게선언해놓았습니다. 물론소켓번호만전달해도상관없습니다. 그런데만약여러가지정보를전달하려고하면인자가하나뿐이니하나만전달할수있습니다. 아니면전역등의방법을사용해야합니다. 그런데스레드입구함수의인자가 void * 형이기때문에이런구조체를만들어서구조체의포인터를전달하면여러인자를전달할수있게됩니다. 그리고소스를보면전달될인자를동적메모리할당을하였는데반드시이렇게해야합니다. 만약지역변수로전달하게되면어떻게될까요? 스레드는서로경쟁하며실행됩니다. 그러니까정확히어느것이먼저실행될지는아무도모르는것입니다. 그래서지역변수로선언해놓았다면스레드가실행되어인자가참조되기전에스레드함수를호출한곳이먼저종료되었다면인자의변수는잘못된메모리를가리키고있는것이되어버립니다. 그래서잘못된결과를이르게하는것이죠. 그리고스레드입구함수에서인자의메모리를해제했습니다. 이것도위와비슷합니다. 만약에스레드함수를호출한곳에서메모리를해제한다면지역변수와똑같은결과를낳게됩니다. 위소스는부족한소스입니다. 만약서버가종료된다면생성했던스레드가확실히종료되었는지그런것을알수없기때문이죠. 물론소멸되겠지만요. 안전하게스레드가종료되었는지알고나서서버를닫는것이더욱좋을것입니다.

46 위의스레드의소스는하나의처리를스레드에게맡김으로써여러사용자를받을수있게하였습니다. 프로세스를생성하는것도이와비슷합니다. Pthread_create() 대신 fork() 함수를이용해서프로세스를만들면됩니다. 앞에서 select() 와스레드에대해서알아봤습니다. 그럼이두개를결합하여만드는것은어떨까요? 그런것은채팅서버를한번만들어보시면서하면좋은예가될것같습니다. 5. 마치며 초보적인내용인만큼이글이네트워크를공부를시작하시는분에게조금이나마도움이되었으면합니다. 그리고함수설명보다는원리에중점을두어설명을하려고했는데잘안된것같습니다. 아직 UDP, 멀티캐스트같은주제가남아있습니다. 꼭보시고가시길바랍니다. 보통멀티캐스트는지원하는라우터가많이없어서하기힘들다고합니다. 소프트웨어로처리하는방법이있기는하지만아직부족한점이많이있나봅니다. 그러나 UPD는반드시공부해보셔야할듯합니다. TCP와 UDP의각자의장 / 단점이서로절충될수있는소지가많이있기때문입니다. 많은운영체제가운영체제마다다른 poller 를제공하고있는데보통성능상의문제로이런것들을이용해서서버를작성해나간다고합니다. 각각마다장단점이있어제가무어라고할수없지만, 그런것들은하나의방법인것같습니다. 여러가지방법을생각해보고자신의어플리케이션에가장효율적이고가장알맞은그런방법을찾으면되는것같습니다. 조금이라도좋은성능을얻기위해서버를어떻게구성해야하는지패킷은어떻게구성하는지등여러가지방법들을연구해보고테스트해보세요.

본 강의에 들어가기 전

본 강의에 들어가기 전 네트워크프로그래밍 02 장 TCP 소켓 (1) 1 목차 제 2장 TCP 소켓 1. IPv4 TCP 클라이언트 2. IPv4 TCP 서버 3. 소켓의생성과해지 4. 주소지정 5. 소켓에연결 6. 소켓을주소에바인딩하기 7. 클라이언트의연결요청처리 8. 데이터주고받기 9. IPv6의사용 2 소켓통신과정 간략화한소켓통신과정 소켓생성 TCP or UDP 소켓에주소정보할당

More information

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode] TCP Server/Client Department of Computer Engineering Kyung Hee University. Choong Seon Hong 1 TCP Server Program Procedure TCP Server socket() bind() 소켓생성 소켓번호와소켓주소의결합 listen() accept() read() 서비스처리, write()

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Network Programming Jo, Heeseung Network 실습 네트워크프로그래밍 멀리떨어져있는호스트들이서로데이터를주고받을수있도록프로그램을구현하는것 파일과는달리데이터를주고받을대상이멀리떨어져있기때문에소프트웨어차원에서호스트들간에연결을해주는장치가필요 이러한기능을해주는장치로소켓이라는인터페이스를많이사용 소켓프로그래밍이란용어와네트워크프로그래밍이랑용어가같은의미로사용

More information

본 강의에 들어가기 전

본 강의에 들어가기 전 1 목포해양대해양컴퓨터공학과 2 장. TCP 소켓 네트워크프로그램설계 2 목포해양대해양컴퓨터공학과 목차 제 2장 TCP 소켓 1. IPv4 TCP 클라이언트 2. IPv4 TCP 서버 3. 소켓의생성과해지 4. 주소지정 5. 소켓에연결 6. 소켓을주소에바인딩하기 7. 클라이언트의연결요청처리 8. 데이터주고받기 9. IPv6의사용 3 목포해양대해양컴퓨터공학과

More information

Microsoft PowerPoint - Supplement-02-Socket Overview.ppt [호환 모드]

Microsoft PowerPoint - Supplement-02-Socket Overview.ppt [호환 모드] 소켓개요 참고문헌 : 컴퓨터네트워크프로그래밍, 김화종, 홍릉과학출판사 Socket 정의 Socket 은 Transport 계층 (TCP 나 UDP) 을이용하는 API 1982 년 BSD 유닉스 41 에서처음소개 윈도우즈의경우 Winsock 제공 JAVA 또한 Socket 프로그래밍을위한클래스제공 Socket Interface 의위치 5-7 (Ses, Pre,

More information

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to  TCP/IP Sockets: C Version 얇지만얇지않은 TCP/IP 소켓프로그래밍 C 2 판 4 장 UDP 소켓 제 4 장 UDP 소켓 4.1 UDP 클라이언트 4.2 UDP 서버 4.3 UDP 소켓을이용한데이터송싞및수싞 4.4 UDP 소켓의연결 UDP 소켓의특징 UDP 소켓의특성 싞뢰할수없는데이터젂송방식 목적지에정확하게젂송된다는보장이없음. 별도의처리필요 비연결지향적, 순서바뀌는것이가능 흐름제어 (flow

More information

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to  TCP/IP Sockets: C Version 인터넷프로토콜 03 장 도메인네임시스템과주소 패밀리 (IPv4-IPv6 서비스 ) 1 목차 제 3 장도메인네임시스템과주소패밀리 3.1 도메인네임주소를숫자주소로매핑하기 3.2 IP 버전에무관한주소-범용코드의작성 3.3 숫자주소에서도메인네임주소획득하기 2 getaddrinfo() 를활용한주소 범용 (Generic) 코드 주소범용 (Generic) 코드란? 주소버전

More information

2009년 상반기 사업계획

2009년 상반기 사업계획 소켓프로그래밍활용 IT CookBook, 유닉스시스템프로그래밍 학습목표 소켓인터페이스를활용한다양한프로그램을작성할수있다. 2/23 목차 TCP 기반프로그래밍 반복서버 동시동작서버 동시동작서버-exec함수사용하기 동시동작서버-명령행인자로소켓기술자전달하기 UDP 프로그래밍 3/23 TCP 기반프로그래밍 반복서버 데몬프로세스가직접모든클라이언트의요청을차례로처리 동시동작서버

More information

제1장 Unix란 무엇인가?

제1장  Unix란 무엇인가? 1 소켓 2 1 소켓 클라이언트 - 서버모델 네트워크응용프로그램 클리이언트 - 서버모델을기반으로동작한다. 클라이언트 - 서버모델 하나의서버프로세스와여러개의클라이언트로구성된다. 서버는어떤자원을관리하고클라이언트를위해자원관련서비스를제공한다. 3 소켓의종류 소켓 네트워크에대한사용자수준의인터페이스를제공 소켓은양방향통신방법으로클라이언트 - 서버모델을기반으로프로세스사이의통신에매우적합하다.

More information

vi 사용법

vi 사용법 네트워크프로그래밍 6 장과제샘플코드 - 1:1 채팅 (udp 버전 ) 과제 서버에서먼저 bind 하고그포트를다른사람에게알려줄것 클라이언트에서알려준포트로접속 서로간에키보드입력을받아상대방에게메시지전송 2 Makefile 1 SRC_DIR =../../common 2 COM_OBJS = $(SRC_DIR)/addressUtility.o $(SRC_DIR)/dieWithMessage.o

More information

본 강의에 들어가기 전

본 강의에 들어가기 전 인터넷프로토콜 02 장 TCP 소켓 목차 제 2 장 TCP 소켓 2.1 IPv4 TCP 클라이언트 2.2 IPv4 TCP 서버 2.3 소켓의생성과해지 2.4 주소지정 2.5 소켓에연결 2.6 소켓을주소에바인딩하기 2.7 클라이언트의연결요청처리 2.8 데이터주고받기 2.9 IPv6 의사용 소켓통신과정 간략화한소켓통신과정 소켓생성 TCP or UDP 소켓에주소정보할당

More information

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to  TCP/IP Sockets: C Version 1 목포해양대해양컴퓨터공학과 UDP 소켓 네트워크프로그램설계 4 장 2 목포해양대해양컴퓨터공학과 목차 제 4장 UDP 소켓 4.1 UDP 클라이언트 4.2 UDP 서버 4.3 UDP 소켓을이용한데이터송신및수신 4.4 UDP 소켓의연결 3 목포해양대해양컴퓨터공학과 UDP 소켓의특징 UDP 소켓의특성 신뢰할수없는데이터전송방식 목적지에정확하게전송된다는보장이없음.

More information

슬라이드 1

슬라이드 1 Computer Networks Practice Socket 1 DK Han Junghwan Song dkhan@mmlab.snu.ac.kr jhsong@mmlab.snu.ac.kr 2012-3-26 Multimedia and Mobile communications Laboratory Introduction Client / Server model Server

More information

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to  TCP/IP Sockets: C Version 얇지만얇지않은 TCP/IP 소켓프로그래밍 C 2 판 Chap 2. Basic TCP Sockets Chap. 2 Basic TCP Sockets 2.1 IPv4 TCP 클라이언트 2.2 IPv4 TCP 서버 2.3 소켓의생성과해지 2.4 주소지정 2.5 소켓에연결 2.6 소켓을주소와바인딩하기 2.7 클라이언트의연결요청처리 2.8 데이터주고받기 2.9 IPv6의사용

More information

Microsoft PowerPoint - 12 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 1.ppt

Microsoft PowerPoint - 12 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 1.ppt 12 장 소켓을이용한통신 (1) 함수 - inet_addr - inet_ntoa - socket - bind - listen - accept - connect - recv -send 1 서론 파이프를사용하여통신을하기위한시스템호출 / 표준라이브러리함수 함수 의미 inet_addr 문자열형태의인터넷주소를바이너리형태로변환한다. inet_ntoa 바이너리형태의인터넷주소를문자열형태로변환한다.

More information

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E > 웹프로그래밍및실습 ( g & Practice) 문양세강원대학교 IT 대학컴퓨터과학전공 소켓 (Socket) (1/2) Socket 이란? 서버와클라이언트가서로특정한규약을사용하여데이터를전송하기위한방식 서버와클라이언트는소켓연결을기다렸다가소켓이연결되면서로데이터를전송 현재네트워크상에서의모든통신의근간은 Socket 이라할수있음 Page 2 1 소켓 (Socket) (2/2)

More information

Chapter 4 UDP 소켓 사용법

Chapter 4 UDP 소켓 사용법 Chapter 4 UDP 소켓사용법 개요 소켓이란 (Unix 소켓 ) 소켓의구조 소켓의유형 UDP 에대한이해 교재 Chapter 4.1 UDP 클라이언트 교재 Chapter 4.2 UDP 서버 교재 Chapter 4.3 UDP 소켓을이용한 송신및수신 소켓이란? Socket 은통신을위한끝점 (endpoint) 을생성하여파일에대한 open 과유사한방식으로기술자

More information

The OSI Model

The OSI Model Advanced Socket Programming Department of Computer Engineering Kyung Hee University. Choong Seon Hong 1 다중처리기술 2 다중처리기술 Multitasking Multi-process Multi-thread Multiplexing Polling Selecting Interrupt

More information

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx #include int main(void) { int num; printf( Please enter an integer "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 을 작성하면서 C 프로그램의

More information

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾ P a 02 r t Chapter 4 TCP Chapter 5 Chapter 6 UDP Chapter 7 Chapter 8 GUI C h a p t e r 04 TCP 1 3 1 2 3 TCP TCP TCP [ 4 2] listen connect send accept recv send recv [ 4 1] PC Internet Explorer HTTP HTTP

More information

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to  TCP/IP Sockets: C Version 인터넷프로토콜 5 장 데이터송수신 (3) 1 파일전송메시지구성예제 ( 고정크기메시지 ) 전송방식 : 고정크기 ( 바이너리전송 ) 필요한전송정보 파일이름 ( 최대 255 자 => 255byte 의메모리공간필요 ) 파일크기 (4byte 의경우최대 4GB 크기의파일처리가능 ) 파일내용 ( 가변길이, 0~4GB 크기 ) 메시지구성 FileName (255bytes)

More information

제1장 Unix란 무엇인가?

제1장  Unix란 무엇인가? 1 13 장소켓 2 13.1 소켓 클라이언트 - 서버모델 네트워크응용프로그램 클리이언트 - 서버모델을기반으로동작한다. 클라이언트 - 서버모델 하나의서버프로세스와여러개의클라이언트로구성된다. 서버는어떤자원을관리하고클라이언트를위해자원관련서비스를제공한다. 3 소켓의종류 소켓 네트워크에대한사용자수준의인터페이스를제공 소켓은양방향통신방법으로클라이언트 - 서버모델을기반으로프로세스사이의통신에매우적합하다.

More information

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to  TCP/IP Sockets: C Version 얇지만얇지않은 TCP/IP 소켓프로그래밍 C 2 판 Chap 3. Of Names and Address Families Chap. 3 Of Names and Address Families 3.1 도메인네임주소를숫자주소로매핑하기 3.2 IP 버전에무관한주소 - 범용코드의작성 3.3 숫자주소에서도메인네임주소획득하기 기존 IPv4 전용, IPv6 전용코드의취약성

More information

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to  TCP/IP Sockets: C Version 중급소켓프로그래밍 (3) 네트워크프로그래밍 6 장 1 목차 제 6장중급소켓프로그래밍 6.1 소켓옵션 6.2 시그널 6.3 넌블로킹입 / 출력 6.4 멀티태스킹 6.5 멀티플렉싱 6.6 다수의수싞자처리 2 멀티태스킹 멀티태스킹이란? 사젂적의미 한사람의사용자가한대의컴퓨터로 2 가지이상의작업을동시에처리하거나, 2 가지이상의프로그램들을동시에실행시키는것 소켓에서의멀티태스킹

More information

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to  TCP/IP Sockets: C Version 인터넷프로토콜 03 장 도메인네임시스템과주소 패밀리 (IPv4-IPv6 서비스 ) 1 목포해양대해양컴퓨터공학과 목차 제 3 장도메인네임시스템과주소패밀리 3.1 도메인네임주소를숫자주소로매핑하기 3.2 IP 버전에무관한주소-범용코드의작성 3.3 숫자주소에서도메인네임주소획득하기 2 목포해양대해양컴퓨터공학과 기존 IPv4 전용, IPv6 전용코드의 취약성 전용주소코드

More information

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드] - Socket Programming in Java - 목차 소켓소개 자바에서의 TCP 프로그램작성방법 주요클래스와메소드 HTTP 프로토콜을이용한예제 에코프로그램 Q/A 에코프로그램 - EchoServer 에코프로그램 - EchoClient TCP Programming 1 소켓소개 IP, Port, and Socket 포트 (Port): 전송계층에서통신을수행하는응용프로그램을찾기위한주소

More information

슬라이드 1

슬라이드 1 1 Computer Networks Practice #1-1 - Socket Programming 이지민 (jmlee@mmlab.snu.ac.kr) 장동현 (dhjang@mmlab.snu.ac.kr) 2011. 9. 14 2 Transport layer 가하는일 Reliability 패킷젂송에오류가생기면잧젂송함으로써마치 오류가나지않는것처럼 싞뢰된젂송을 Application

More information

금오공대 컴퓨터공학전공 강의자료

금오공대 컴퓨터공학전공 강의자료 C 프로그래밍프로젝트 Chap 14. 포인터와함수에대한이해 2013.10.09. 오병우 컴퓨터공학과 14-1 함수의인자로배열전달 기본적인인자의전달방식 값의복사에의한전달 val 10 a 10 11 Department of Computer Engineering 2 14-1 함수의인자로배열전달 배열의함수인자전달방식 배열이름 ( 배열주소, 포인터 ) 에의한전달 #include

More information

슬라이드 1

슬라이드 1 TCPdump 사용법 Neworks, Inc. (Tel) 070-7101-9382 (Fax) 02-2109-6675 ech@pumpkinne.com hp://www.pumpkinne.co.kr TCPDUMP Tcpdump 옵션 ARP 정보 ICMP 정보 ARP + ICMP 정보 IP 대역별정보 Source 및 Desinaion 대역별정보 Syn 과 syn-ack

More information

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode] Unix Process Department of Computer Engineering Kyung Hee University. Choong Seon Hong 1 유닉스기반다중서버구현방법 클라이언트들이동시에접속할수있는서버 서비스를동시에처리할수있는서버프로세스생성을통한멀티태스킹 (Multitasking) 서버의구현 select 함수에의한멀티플렉싱 (Multiplexing)

More information

<43B7CE20BECBBEC6BAB8B4C220BCD2C4CFC7C1B7CEB1D7B7A1B9D62E687770>

<43B7CE20BECBBEC6BAB8B4C220BCD2C4CFC7C1B7CEB1D7B7A1B9D62E687770> C 로알아보는 소켓프로그래밍 이현환 (NOON) haonun@gmail.com http://noon.tistory.com Hacking Study Grup E.Y.E -------------------------------------------------------------------- 목차 --------------------------------------------------------------------

More information

Microsoft PowerPoint - 03-TCP Programming.ppt

Microsoft PowerPoint - 03-TCP Programming.ppt Chapter 3. - Socket in Java - 목차 소켓소개 자바에서의 프로그램작성방법 주요클래스와메소드 HTTP 프로토콜을이용한예제 에코프로그램 에코프로그램 - EchoServer 에코프로그램 - EchoClient Q/A 1 1 소켓소개 IP,, and Socket 포트 (): 전송계층에서통신을수행하는응용프로그램을찾기위한주소 소켓 (Socket):

More information

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D> 리눅스 오류처리하기 2007. 11. 28 안효창 라이브러리함수의오류번호얻기 errno 변수기능오류번호를저장한다. 기본형 extern int errno; 헤더파일 라이브러리함수호출에실패했을때함수예 정수값을반환하는함수 -1 반환 open 함수 포인터를반환하는함수 NULL 반환 fopen 함수 2 유닉스 / 리눅스 라이브러리함수의오류번호얻기 19-1

More information

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과 System call table and linkage v Ref. http://www.ibm.com/developerworks/linux/library/l-system-calls/ - 2 - Young-Jin Kim SYSCALL_DEFINE 함수

More information

[ 네트워크 1] 3 주차 1 차시. IPv4 주소클래스 3 주차 1 차시 IPv4 주소클래스 학습목표 1. IP 헤더필드의구성을파악하고요약하여설명할수있다. 2. Subnet ID 및 Subnet Mask 를설명할수있고, 각클래스의사용가능한호스트수와사설 IP 주소및네트

[ 네트워크 1] 3 주차 1 차시. IPv4 주소클래스 3 주차 1 차시 IPv4 주소클래스 학습목표 1. IP 헤더필드의구성을파악하고요약하여설명할수있다. 2. Subnet ID 및 Subnet Mask 를설명할수있고, 각클래스의사용가능한호스트수와사설 IP 주소및네트 3 주차 1 차시 IPv4 주소클래스 학습목표 1. IP 헤더필드의구성을파악하고요약하여설명할수있다. 2. Subnet ID 및 Subnet Mask 를설명할수있고, 각클래스의사용가능한호스트수와사설 IP 주소및네트워크주소와 브로드캐스트주소를설명할수있다. 학습내용 1 : IP 헤더필드구성 1. Network Layer Fields 2. IP 헤더필드의구성 1)

More information

Microsoft Word - KPMC-400,401 SW 사용 설명서

Microsoft Word - KPMC-400,401 SW 사용 설명서 LKP Ethernet Card SW 사용설명서 Version Information Tornado 2.0, 2.2 알 림 여기에실린내용은제품의성능향상과신뢰도의증대를위하여예고없이변경될수도있습니다. 여기에실린내용의일부라도엘케이일레븐의사전허락없이어떠한유형의매체에복사되거나저장될수없으며전기적, 기계적, 광학적, 화학적인어떤방법으로도전송될수없습니다. 엘케이일레븐경기도성남시중원구상대원동

More information

1장. 유닉스 시스템 프로그래밍 개요

1장.  유닉스 시스템 프로그래밍 개요 9 장. 파이프 Unix 프로그래밍및실습 1 강의내용 1 절개요 2 절이름없는파이프 3 절이름있는파이프 http://lily.mmu.ac.kr/lecture/13u2/ch09.pdf 책에나온내용반드시 man 으로확인할것! UNIX, LINUX 등시스템마다차이가있을수있음을반드시인식 2 기본실습 #1 [ 예제 9-1] ~ [ 예제 9-7] ( 각 10점 ) 과제개요

More information

슬라이드 1

슬라이드 1 -Part3- 제 4 장동적메모리할당과가변인 자 학습목차 4.1 동적메모리할당 4.1 동적메모리할당 4.1 동적메모리할당 배울내용 1 프로세스의메모리공간 2 동적메모리할당의필요성 4.1 동적메모리할당 (1/6) 프로세스의메모리구조 코드영역 : 프로그램실행코드, 함수들이저장되는영역 스택영역 : 매개변수, 지역변수, 중괄호 ( 블록 ) 내부에정의된변수들이저장되는영역

More information

Microsoft PowerPoint - 06-CompSys-16-Socket.ppt

Microsoft PowerPoint - 06-CompSys-16-Socket.ppt 소켓시스템콜소개 TCP 클라이언트 / 서버프로그래밍 signal(), fork() 시스템콜 TCP 클라이언트 / 서버프로그래밍예 talk_client.c, talk_server.c UDP 클라이언트 / 서버프로그래밍 순천향대학교컴퓨터학부이상정 1 소켓시스템콜소개 순천향대학교컴퓨터학부이상정 2 소켓 (socket) 소켓은 TCP/IP 프로토콜을이용하기위한시스템콜인터페이스

More information

Microsoft PowerPoint - 09-CE-23-윈도우 소켓

Microsoft PowerPoint - 09-CE-23-윈도우 소켓 순천향대학교컴퓨터학부이상정 1 학습내용 인터넷과 TCP/IP 프로토콜 소켓의생성과해제 소켓주소표현 연결지향소켓프로그래밍 순천향대학교컴퓨터학부이상정 2 인터넷과 TCP/IP 프로토콜 순천향대학교컴퓨터학부이상정 3 인터넷구조의프로토콜계층 인터넷구조의프로토콜계층 응용계층 (application layer) 응용서비스제공 http, ftp, smtp, telnet,

More information

Microsoft PowerPoint - 13 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 2.ppt

Microsoft PowerPoint - 13 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 2.ppt 13 장소켓을이용한통신 (2) 소켓을이용한통신 (2) 함수 - recvfrom - sendto - uname - gethostname - gethostbyname - gethostbyaddr 1 1. 서론 소켓을사용하여비연결형모델로통신을하기위한함수와그외의함수 함수 의미 recvfrom 비연결형모델에서소켓을통해메시지를수신한다. sendto 비연결형모델에서소켓을통해메시지를송신한다.

More information

제1장 Unix란 무엇인가?

제1장  Unix란 무엇인가? 1 12 장파이프 2 12.1 파이프 파이프원리 $ who sort 파이프 3 물을보내는수도파이프와비슷 한프로세스는쓰기용파일디스크립터를이용하여파이프에데이터를보내고 ( 쓰고 ) 다른프로세스는읽기용파일디스크립터를이용하여그파이프에서데이터를받는다 ( 읽는다 ). 한방향 (one way) 통신 파이프생성 파이프는두개의파일디스크립터를갖는다. 하나는쓰기용이고다른하나는읽기용이다.

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Socket Programming 1 Jo, Heeseung 학습목표 TCP/IP 프로토콜의기본개념 IP 주소와포트번호의개념소켓관련구조체와함수소켓을이용한통신프로그램을작성 2 TCP/IP 개요 TCP/IP 인터넷의표준프로토콜 5계층 (4계층) 으로구성 TCP 와 UDP 의차이 3 IP 주소와호스트명 IP 주소와호스트명 IP 주소 : 인터넷을이용할때사용하는주소로점

More information

Microsoft Word - release note-VRRP_Korean.doc

Microsoft Word - release note-VRRP_Korean.doc VRRP (Virtual Router Redundancy Protocol) 기능추가 Category S/W Release Version Date General 7.01 22 Dec. 2003 Function Description VRRP 는여러대의라우터를그룹으로묶어하나의가상 IP 어드레스를부여해마스터로지정된라우터장애시 VRRP 그룹내의백업라우터가마스터로자동전환되는프로토콜입니다.

More information

SYN flooding

SYN flooding Hacking & Security Frontier SecurityFirst SYN flooding - SYN flooding 공격의원리와코드그리고대응 by amur, myusgun, leemeca 2008. 09. myusgun Agenda 개요...3 원리...3 위협...4 잠깐! - 문서에관하여...4 이문서는...4 Code...4 대응방안...4 소스코드...5

More information

1장. 유닉스 시스템 프로그래밍 개요

1장.  유닉스 시스템 프로그래밍 개요 Unix 프로그래밍및실습 7 장. 시그널 - 과제보충 응용과제 1 부모프로세스는반복해서메뉴를출력하고사용자로부터주문을받아자식프로세스에게주문내용을알린다. (SIGUSR1) ( 일단주문을받으면음식이완료되기전까지 SIGUSR1 을제외한다른시그널은모두무시 ) timer 자식프로세스는주문을받으면조리를시작한다. ( 일단조리를시작하면음식이완성되기전까지 SIGALARM 을제외한다른시그널은모두무시

More information

Microsoft PowerPoint - chap06-2pointer.ppt

Microsoft PowerPoint - chap06-2pointer.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-2 참고자료 포인터 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 포인터의정의와사용 변수를선언하는것은메모리에기억공간을할당하는것이며할당된이후에는변수명으로그기억공간을사용한다. 할당된기억공간을사용하는방법에는변수명외에메모리의실제주소값을사용하는것이다.

More information

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D> 뻔뻔한 AVR 프로그래밍 The Last(8 th ) Lecture 유명환 ( yoo@netplug.co.kr) INDEX 1 I 2 C 통신이야기 2 ATmega128 TWI(I 2 C) 구조분석 4 ATmega128 TWI(I 2 C) 실습 : AT24C16 1 I 2 C 통신이야기 I 2 C Inter IC Bus 어떤 IC들간에도공통적으로통할수있는 ex)

More information

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

Microsoft PowerPoint - chap13-입출력라이브러리.pptx #include int main(void) int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; 1 학습목표 스트림의 기본 개념을 알아보고,

More information

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770> 연습문제해답 5 4 3 2 1 0 함수의반환값 =15 5 4 3 2 1 0 함수의반환값 =95 10 7 4 1-2 함수의반환값 =3 1 2 3 4 5 연습문제해답 1. C 언어에서의배열에대하여다음중맞는것은? (1) 3차원이상의배열은불가능하다. (2) 배열의이름은포인터와같은역할을한다. (3) 배열의인덱스는 1에서부터시작한다. (4) 선언한다음, 실행도중에배열의크기를변경하는것이가능하다.

More information

IP 심화 라우팅프로토콜적용시 라우팅테이블에서 이니셜이있는네트워크를설정하는것 : onnected 직접연결된네트워크를의미한다. 그러므로라우팅은 나는이런네트워크와연결되어있다. 를직접연결된라우터들에게알려주는것 1>en 1#conf t 1(config)#router rip 1

IP 심화 라우팅프로토콜적용시 라우팅테이블에서 이니셜이있는네트워크를설정하는것 : onnected 직접연결된네트워크를의미한다. 그러므로라우팅은 나는이런네트워크와연결되어있다. 를직접연결된라우터들에게알려주는것 1>en 1#conf t 1(config)#router rip 1 IP 심화 º 각 P 의게이트웨이는해당네트워크의마지막주소를사용한다. - P1 (210.220.10.1/26) 의게이트웨이 (5의 Fa0/0) : 210.220.10.63 /26 = 255.255.255.192 호스트비트수 : 32-26 = 6 비트 => = 64 그러므로 P1의 IP 210.220.10.1 중서브넷마스크에의거 26비트는변함이없고, 나머지 6비트가호스트비트로변하므로

More information

Microsoft Word - FunctionCall

Microsoft Word - FunctionCall Function all Mechanism /* Simple Program */ #define get_int() IN KEYOARD #define put_int(val) LD A val \ OUT MONITOR int add_two(int a, int b) { int tmp; tmp = a+b; return tmp; } local auto variable stack

More information

버퍼오버플로우-왕기초편 3.c언어에서버퍼사용하기 버퍼는 임시기억공간 이라는포괄적인개념이기때문에여러곳에존재할수있습니다. 즉, CPU 에도버퍼가존재할수있으며, 하드디스크에도존재할수있고, CD- ROM 이나프린터에도존재할수있습니다. 그리고앞의예제에서보신바와같이일반프로그램에도

버퍼오버플로우-왕기초편 3.c언어에서버퍼사용하기 버퍼는 임시기억공간 이라는포괄적인개념이기때문에여러곳에존재할수있습니다. 즉, CPU 에도버퍼가존재할수있으며, 하드디스크에도존재할수있고, CD- ROM 이나프린터에도존재할수있습니다. 그리고앞의예제에서보신바와같이일반프로그램에도 버퍼는 임시기억공간 이라는포괄적인개념이기때문에여러곳에존재할수있습니다. 즉, CPU 에도버퍼가존재할수있으며, 하드디스크에도존재할수있고, CD- ROM 이나프린터에도존재할수있습니다. 그리고앞의예제에서보신바와같이일반프로그램에도존재할수있습니다. 이번시간엔프로그램에서버퍼를사용하는법, 그중에서도 C 언어에서버퍼를사용하는방법에대해배워보겠습니다. C 언어에서버퍼를사용하는가장쉬운방법은바로변수를선언하는것인데,

More information

6주차.key

6주차.key 6, Process concept A program in execution Program code PCB (process control block) Program counter, registers, etc. Stack Heap Data section => global variable Process in memory Process state New Running

More information

Chapter #01 Subject

Chapter #01  Subject Device Driver March 24, 2004 Kim, ki-hyeon 목차 1. 인터럽트처리복습 1. 인터럽트복습 입력검출방법 인터럽트방식, 폴링 (polling) 방식 인터럽트서비스등록함수 ( 커널에등록 ) int request_irq(unsigned int irq, void(*handler)(int,void*,struct pt_regs*), unsigned

More information

C++ Programming

C++ Programming C++ Programming 예외처리 Seo, Doo-okok clickseo@gmail.com http://www.clickseo.com 목 차 예외처리 2 예외처리 예외처리 C++ 의예외처리 예외클래스와객체 3 예외처리 예외를처리하지않는프로그램 int main() int a, b; cout > a >> b; cout

More information

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3 Example 3.1 Files 3.2 Source code 3.3 Exploit flow

More information

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - ch07 - 포인터 pm0415 2015-1 프로그래밍언어 7. 포인터 (Pointer), 동적메모리할당 2015 년 4 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) Outline 포인터 (pointer) 란? 간접참조연산자

More information

Windows 8에서 BioStar 1 설치하기

Windows 8에서 BioStar 1 설치하기 / 콘텐츠 테이블... PC에 BioStar 1 설치 방법... Microsoft SQL Server 2012 Express 설치하기... Running SQL 2012 Express Studio... DBSetup.exe 설정하기... BioStar 서버와 클라이언트 시작하기... 1 1 2 2 6 7 1/11 BioStar 1, Windows 8 BioStar

More information

Microsoft PowerPoint - chap01-C언어개요.pptx

Microsoft PowerPoint - chap01-C언어개요.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 프로그래밍의 기본 개념을

More information

Microsoft Word - PLC제어응용-2차시.doc

Microsoft Word - PLC제어응용-2차시.doc 과정명 PLC 제어응용차시명 2 차시. 접점명령 학습목표 1. 연산개시명령 (LOAD, LOAD NOT) 에대하여설명할수있다. 2. 직렬접속명령 (AND, AND NOT) 에대하여설명할수있다. 3. 병렬접속명령 (OR, OR NOT) 에대하여설명할수있다. 4.PLC의접점명령을가지고간단한프로그램을작성할수있다. 학습내용 1. 연산개시명령 1) 연산개시명령 (LOAD,

More information

ABC 11장

ABC 11장 12 장고급응용 0 수행중인프로그램 프로세스 모든프로세스는유일한프로세스식별번호 (PID) 를가짐 유닉스에서는 ps 명령을사용하여프로세스목록을볼수있음 12-1 프로세스 $ ps -aux USER PID %CPU %MEM SZ RSS TT STAT START TIME COMMAND blufox 17725 34.0 1.6 146 105 i2 R 15:13 0:00

More information

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint - chap06-1Array.ppt 2010-1 학기프로그래밍입문 (1) chapter 06-1 참고자료 배열 박종혁 Tel: 970-6702 Email: jhpark1@snut.ac.kr 한빛미디어 출처 : 뇌를자극하는 C프로그래밍, 한빛미디어 -1- 배열의선언과사용 같은형태의자료형이많이필요할때배열을사용하면효과적이다. 배열의선언 배열의사용 배열과반복문 배열의초기화 유연성있게배열다루기 한빛미디어

More information

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론 이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론 2. 관련연구 2.1 MQTT 프로토콜 Fig. 1. Topic-based Publish/Subscribe Communication Model. Table 1. Delivery and Guarantee by MQTT QoS Level 2.1 MQTT-SN 프로토콜 Fig. 2. MQTT-SN

More information

3. 다음장에나오는 sigprocmask 함수의설명을참고하여다음프로그램의출력물과그출력물이화면이표시되는시점을예측하세요. ( 힌트 : 각줄이표시되는시점은다음 4 가지중하나. (1) 프로그램수행직후, (2) kill 명령실행직후, (3) 15 #include <signal.

3. 다음장에나오는 sigprocmask 함수의설명을참고하여다음프로그램의출력물과그출력물이화면이표시되는시점을예측하세요. ( 힌트 : 각줄이표시되는시점은다음 4 가지중하나. (1) 프로그램수행직후, (2) kill 명령실행직후, (3) 15 #include <signal. 학번 : 이름 : 1. 다음가정하에서아래프로그램의출력물을예측하세요. 가정 : 부모프로세스의 process id=20100, 자식프로세스의 process id=20101. int glob = 31; /* external variable in initialized data */ char buf[] = "a write to stdout\n"; int main(void)

More information

TCP.IP.ppt

TCP.IP.ppt TCP/IP TCP/IP TCP/IP TCP/IP TCP/IP Internet Protocol _ IP Address Internet Protocol _ Subnet Mask Internet Protocol _ ARP(Address Resolution Protocol) Internet Protocol _ RARP(Reverse Address Resolution

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Web server porting 2 Jo, Heeseung Web 을이용한 LED 제어 Web 을이용한 LED 제어프로그램 web 에서데이터를전송받아타겟보드의 LED 를조작하는프로그램을작성하기위해다음과같은소스파일을생성 2 Web 을이용한 LED 제어 LED 제어프로그램작성 8bitled.html 파일을작성 root@ubuntu:/working/web# vi

More information

11장 포인터

11장 포인터 Dynamic Memory and Linked List 1 동적할당메모리의개념 프로그램이메모리를할당받는방법 정적 (static) 동적 (dynamic) 정적메모리할당 프로그램이시작되기전에미리정해진크기의메모리를할당받는것 메모리의크기는프로그램이시작하기전에결정 int i, j; int buffer[80]; char name[] = data structure"; 처음에결정된크기보다더큰입력이들어온다면처리하지못함

More information

Microsoft PowerPoint - 04-UDP Programming.ppt

Microsoft PowerPoint - 04-UDP Programming.ppt Chapter 4. UDP Dongwon Jeong djeong@kunsan.ac.kr http://ist.kunsan.ac.kr/ Dept. of Informatics & Statistics 목차 UDP 1 1 UDP 개념 자바 UDP 프로그램작성 클라이언트와서버모두 DatagramSocket 클래스로생성 상호간통신은 DatagramPacket 클래스를이용하여

More information

<43B7CE20BECBBEC6BAB8B4C C5EBBDC52E687770>

<43B7CE20BECBBEC6BAB8B4C C5EBBDC52E687770> C 로알아보는 UDP 통신 이현환 (NOON) haonun@gmail.com http://noon.tistory.com Hacking Study Grup E.Y.E -------------------------------------------------------------------- 목차 --------------------------------------------------------------------

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 System Software Experiment 1 Lecture 5 - Array Spring 2019 Hwansoo Han (hhan@skku.edu) Advanced Research on Compilers and Systems, ARCS LAB Sungkyunkwan University http://arcs.skku.edu/ 1 배열 (Array) 동일한타입의데이터가여러개저장되어있는저장장소

More information

Microsoft Word - 3부A windows 환경 IVF + visual studio.doc

Microsoft Word - 3부A windows 환경 IVF + visual studio.doc Visual Studio 2005 + Intel Visual Fortran 9.1 install Intel Visual Fortran 9.1 intel Visual Fortran Compiler 9.1 만설치해서 DOS 모드에서실행할수있지만, Visual Studio 2005 의 IDE 를사용하기위해서는 Visual Studio 2005 를먼저설치후 Integration

More information

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Function) 1. 함수의개념 입력에대해적절한출력을발생시켜주는것 내가 ( 프로그래머 ) 작성한명령문을연산, 처리, 실행해주는부분 ( 모듈 ) 자체적으로실행되지않으며,

More information

좀비프로세스 2

좀비프로세스 2 Signal & Inter-Process Communication Department of Computer Engineering Kyung Hee University. Choong Seon Hong 1 좀비프로세스 2 좀비프로세스 (zombie process) 좀비프로세스란프로세스종료후메모리상에서사라지지않는프로세스 좀비프로세스의생성이유. 자식프로세스는부모프로세스에게실행결과에대한값을반환해야한다.

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Socket Programming 1 Jo, Heeseung 학습목표 TCP/IP 프로토콜의기본개념 IP 주소와포트번호의개념소켓관련구조체와함수소켓을이용한통신프로그램을작성 2 TCP/IP 개요 TCP/IP 인터넷의표준프로토콜 5 계층 (4 계층 ) 으로구성 TCP 와 UDP 의차이 3 IP 주소와호스트명 IP 주소와호스트명 IP 주소 : 인터넷을이용할때사용하는주소로점

More information

Microsoft Word - Network Programming_NewVersion_01_.docx

Microsoft Word - Network Programming_NewVersion_01_.docx 10. Unix Domain Socket 105/113 10. Unix Domain Socket 본절에서는 Unix Domain Socket(UDS) 에대한개념과이에대한실습을수행하고, 이와동시에비신뢰적인통신시스템의문제점에대해서분석하도록한다. 이번실습의목표는다음과같다. 1. Unix Domain Socket의사용법을익히고, IPC에대해서실습 2. TCP/IP의응용계층과전달계층의동작을구현및실습

More information

Microsoft PowerPoint - 15-EmbedSW-10-Socket

Microsoft PowerPoint - 15-EmbedSW-10-Socket 10. 소켓개요 TCP 클라이언트 / 서버프로그래밍절차 오드로이드 I/O 소켓프로그램예 순천향대학교컴퓨터공학과이상정 1 소켓 (Socket) 운영체제복습 소켓 (socket) 은통신의극점 (endpoint) 을정의 소켓은 IP 주소와포트번호두가지를접합 (concatenate) 해서구별 두프로세스의네트워크통신에각각하나씩두개의소켓이필요 순천향대학교컴퓨터공학과 2

More information

Microsoft PowerPoint - ch09_파이프 [호환 모드]

Microsoft PowerPoint - ch09_파이프 [호환 모드] 학습목표 파이프를이용한 IPC 기법을이해한다. 이름없는파이프를이용해통신프로그램을작성할수있다. 이름있는파이프를이용해통신프로그램을작성할수있다. 파이프 IT CookBook, 유닉스시스템프로그래밍 2/20 목차 파이프의개념 이름없는파이프만들기 복잡한파이프생성 양방향파이프활용 이름있는파이프만들기 파이프의개념 파이프 두프로세스간에통신할수있도록해주는특수파일 그냥파이프라고하면일반적으로이름없는파이프를의미

More information

2009년 상반기 사업계획

2009년 상반기 사업계획 파이프 IT CookBook, 유닉스시스템프로그래밍 학습목표 파이프를이용한 IPC 기법을이해한다. 이름없는파이프를이용해통신프로그램을작성할수있다. 이름있는파이프를이용해통신프로그램을작성할수있다. 2/20 목차 파이프의개념 이름없는파이프만들기 복잡한파이프생성 양방향파이프활용 이름있는파이프만들기 3/20 파이프의개념 파이프 두프로세스간에통신할수있도록해주는특수파일 그냥파이프라고하면일반적으로이름없는파이프를의미

More information

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - chap10-함수의활용.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num = %d\n", num); return 0; } 1 학습목표 중 값에 의한 전달 방법과

More information

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning C Programming Practice (II) Contents 배열 문자와문자열 구조체 포인터와메모리관리 구조체 2/17 배열 (Array) (1/2) 배열 동일한자료형을가지고있으며같은이름으로참조되는변수들의집합 배열의크기는반드시상수이어야한다. type var_name[size]; 예 ) int myarray[5] 배열의원소는원소의번호를 0 부터시작하는색인을사용

More information

게시판 스팸 실시간 차단 시스템

게시판 스팸 실시간 차단 시스템 오픈 API 2014. 11-1 - 목 차 1. 스팸지수측정요청프로토콜 3 1.1 스팸지수측정요청프로토콜개요 3 1.2 스팸지수측정요청방법 3 2. 게시판스팸차단도구오픈 API 활용 5 2.1 PHP 5 2.1.1 차단도구오픈 API 적용방법 5 2.1.2 차단도구오픈 API 스팸지수측정요청 5 2.1.3 차단도구오픈 API 스팸지수측정결과값 5 2.2 JSP

More information

Windows Server 2012

Windows Server  2012 Windows Server 2012 Shared Nothing Live Migration Shared Nothing Live Migration 은 SMB Live Migration 방식과다른점은 VM 데이터파일의위치입니다. Shared Nothing Live Migration 방식은 Hyper-V 호스트의로컬디스크에 VM 데이터파일이위치합니다. 반면에, SMB

More information

bn2019_2

bn2019_2 arp -a Packet Logging/Editing Decode Buffer Capture Driver Logging: permanent storage of packets for offline analysis Decode: packets must be decoded to human readable form. Buffer: packets must temporarily

More information

제1장 Unix란 무엇인가?

제1장  Unix란 무엇인가? 4 장파일 컴퓨터과학과박환수 1 2 4.1 시스템호출 컴퓨터시스템구조 유닉스커널 (kernel) 하드웨어를운영관리하여다음과같은서비스를제공 파일관리 (File management) 프로세스관리 (Process management) 메모리관리 (Memory management) 통신관리 (Communication management) 주변장치관리 (Device

More information

Microsoft PowerPoint - [2009] 02.pptx

Microsoft PowerPoint - [2009] 02.pptx 원시데이터유형과연산 원시데이터유형과연산 원시데이터유형과연산 숫자데이터유형 - 숫자데이터유형 원시데이터유형과연산 표준입출력함수 - printf 문 가장기본적인출력함수. (stdio.h) 문법 ) printf( Test printf. a = %d \n, a); printf( %d, %f, %c \n, a, b, c); #include #include

More information

네트워크통신연결방법 네트워크제품이통신을할때, 서로연결하는방법에대해설명합니다. FIRST EDITION

네트워크통신연결방법 네트워크제품이통신을할때, 서로연결하는방법에대해설명합니다. FIRST EDITION 네트워크제품이통신을할때, 서로연결하는방법에대해설명합니다. FIRST EDITION 05-2012 개요 개요 네트워크상에연결되어있는기기들이통신을할때, 어떻게목적지를찾아가는지 (IP 주소, 서브넷마스크, 게이트웨이 ) 어떻게데이터를보내는지 (UDP/TCP, ) 에대한내용을설명합니다. 네트워크설정에따른특징을이해하여, 제품이설치된네트워크환경에따라알맞은설정을하도록합니다.

More information

chap 5: Trees

chap 5: Trees 5. Threaded Binary Tree 기본개념 n 개의노드를갖는이진트리에는 2n 개의링크가존재 2n 개의링크중에 n + 1 개의링크값은 null Null 링크를다른노드에대한포인터로대체 Threads Thread 의이용 ptr left_child = NULL 일경우, ptr left_child 를 ptr 의 inorder predecessor 를가리키도록변경

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 KeyPad Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 에는 16 개의 Tack Switch 를사용하여 4 행 4 열의 Keypad 가장착 4x4 Keypad 2 KeyPad 를제어하기위하여 FPGA 내부에 KeyPad controller 가구현 KeyPad controller 16bit 로구성된

More information

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조 - Part2- 제 2 장다차원배열이란무엇인가 학습목차 2.1 다차원배열이란 2. 2 2 차원배열의주소와값의참조 2.1 다차원배열이란 2.1 다차원배열이란 (1/14) 다차원배열 : 2 차원이상의배열을의미 1 차원배열과다차원배열의비교 1 차원배열 int array [12] 행 2 차원배열 int array [4][3] 행 열 3 차원배열 int array [2][2][3]

More information

Microsoft PowerPoint - chap03-변수와데이터형.pptx

Microsoft PowerPoint - chap03-변수와데이터형.pptx #include int main(void) { int num; printf( Please enter an integer: "); scanf("%d", &num); if ( num < 0 ) printf("is negative.\n"); printf("num %d\n", num); return 0; } 1 학습목표 의 개념에 대해 알아본다.

More information

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074> Chap #2 펌웨어작성을위한 C 언어 I http://www.smartdisplay.co.kr 강의계획 Chap1. 강의계획및디지털논리이론 Chap2. 펌웨어작성을위한 C 언어 I Chap3. 펌웨어작성을위한 C 언어 II Chap4. AT89S52 메모리구조 Chap5. SD-52 보드구성과코드메모리프로그래밍방법 Chap6. 어드레스디코딩 ( 매핑 ) 과어셈블리어코딩방법

More information

Microsoft Word - How to make a ZigBee Network_kr

Microsoft Word - How to make a ZigBee Network_kr 1 단계 ZigBee 네트워크설정방법 이보기는 ProBee 기기를이용해 ZigBee 네트워크를설정하는방법을보여줍니다. 2 단계 이보기에서사용된 SENA 제품입니다 : ProBee ZE10 Starter Kit ProBee ZS10 ProBee ZU10 3 단계 ZigBee 네트워크입니다. SE1 SE2 SE3 ZS10 ZS10 ZS10 R4 R5 R3 R1

More information

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures 단일연결리스트 (Singly Linked List) 신찬수 연결리스트 (linked list)? tail 서울부산수원용인 null item next 구조체복습 struct name_card { char name[20]; int date; } struct name_card a; // 구조체변수 a 선언 a.name 또는 a.date // 구조체 a의멤버접근 struct

More information

RHEV 2.2 인증서 만료 확인 및 갱신

RHEV 2.2 인증서 만료 확인 및 갱신 2018/09/28 03:56 1/2 목차... 1 인증서 확인... 1 인증서 종류와 확인... 4 RHEVM CA... 5 FQDN 개인 인증서... 5 레드햇 인증서 - 코드 서명 인증서... 6 호스트 인증... 7 참고사항... 8 관련링크... 8 AllThatLinux! - http://allthatlinux.com/dokuwiki/ rhev_2.2_

More information

슬라이드 제목 없음

슬라이드 제목 없음 2006-11-02 경북대학교컴퓨터공학과 1 제 8 장인터넷프로토콜 : IP 데이터그램 단편화 검사합 옵션 IP 설계 IP 프로토콜 2006-11-02 경북대학교컴퓨터공학과 2 2006-11-02 경북대학교컴퓨터공학과 3 네트워크계층프로토콜 IP (Internet Protocol) TCP/UDP 세그먼트를받아서패킷별로경로선택 ICMP (Internet Control

More information

Lab 3. 실습문제 (Single linked list)_해답.hwp

Lab 3. 실습문제 (Single linked list)_해답.hwp Lab 3. Singly-linked list 의구현 실험실습일시 : 2009. 3. 30. 담당교수 : 정진우 담당조교 : 곽문상 보고서제출기한 : 2009. 4. 5. 학과 : 학번 : 성명 : 실습과제목적 : 이론시간에배운 Singly-linked list를실제로구현할수있다. 실습과제내용 : 주어진소스를이용해 Singly-linked list의각함수를구현한다.

More information

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습니다. 여러분모두 Windows 에서 hex editor(hex dump, hex viewer) 라는것을사용해보셨을겁니다. 바로바이너리파일을 16 진수

More information

5. 소켓 프로그래밍

5. 소켓 프로그래밍 5.4 Multitsaking ( 한번에여러개의클라이언트다루기 ) 5.4.1 Per-Client Process 클라이언트별접속을프로세스로담당하기 5.4.2 Per-Client Thread 클라이언트별접속을쓰레드로담당하기 5.4.3 Constrained Multitasking 프로세스 쓰레드의수를제한하여시스템부하줄이기 5.4.1 Per-Client Processes

More information

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt 변수와상수 1 변수란무엇인가? 변수 : 정보 (data) 를저장하는컴퓨터내의특정위치 ( 임시저장공간 ) 메모리, register 메모리주소 101 번지 102 번지 변수의크기에따라 주로 byte 단위 메모리 2 기본적인변수형및변수의크기 변수의크기 해당컴퓨터에서는항상일정 컴퓨터마다다를수있음 short

More information