<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>생각하는개발자</title>
    <link>https://eltgroup.tistory.com/</link>
    <description>오늘도 열심히 개발하는 개발자입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 23 Jun 2026 19:07:38 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>래머</managingEditor>
    <item>
      <title>타원의 방정식</title>
      <link>https://eltgroup.tistory.com/346</link>
      <description>&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 714px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/9974C4465C93556923&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F9974C4465C93556923&quot; width=&quot;714&quot; height=&quot;298&quot; filename=&quot;타원의 방정식.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;y^2 = b^2 * (1 - (x^2 / a^2))&lt;/p&gt;</description>
      <category>기타</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/346</guid>
      <comments>https://eltgroup.tistory.com/346#entry346comment</comments>
      <pubDate>Thu, 21 Mar 2019 18:12:52 +0900</pubDate>
    </item>
    <item>
      <title>NodeMcu  TFT lcd 연결</title>
      <link>https://eltgroup.tistory.com/345</link>
      <description>&lt;pre style=&quot;padding: 9.5px; font-family: Monaco, Menlo, Consolas, &amp;quot;Courier New&amp;quot;, monospace; color: rgb(51, 51, 51); border-radius: 4px; margin-top: 0px; margin-bottom: 10px; line-height: 20px; word-break: break-all; overflow-wrap: break-word; white-space: pre-wrap; background-color: rgb(255, 255, 255); border: 1px solid rgb(211, 211, 211); max-height: 500px; overflow-y: auto;&quot;&gt;&lt;p&gt;LCD&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NODEMCU&lt;/p&gt;&lt;p&gt;SDD/MISO&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;D6&lt;/p&gt;&lt;p&gt;LED&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3.3V&lt;/p&gt;&lt;p&gt;SCK&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;D5&lt;/p&gt;&lt;p&gt;SDI/MOIS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;D7&lt;/p&gt;&lt;p&gt;DC/RS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;  임의의핀&lt;/p&gt;&lt;p&gt;RESET&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;임의의핀&lt;/p&gt;&lt;p&gt;CS&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;임의의핀&lt;/p&gt;&lt;p&gt;GND&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;VCC&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>lcd</category>
      <category>tft</category>
      <category>아두이노</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/345</guid>
      <comments>https://eltgroup.tistory.com/345#entry345comment</comments>
      <pubDate>Wed, 6 Feb 2019 18:56:25 +0900</pubDate>
    </item>
    <item>
      <title>스파인 캐릭터 유니티용으로 익스포트 하기</title>
      <link>https://eltgroup.tistory.com/344</link>
      <description>&lt;p&gt;스파인 메뉴의 Export(또는 단축키 Ctrl + E) 를 눌러 익스포트 창을 엽니다.&lt;/p&gt;
&lt;p&gt;아래와 같은 창이 열립니다.&lt;/p&gt;
&lt;img src=&quot;http://esotericsoftware.com/img/spine-runtimes-guide/spine-unity/spine-unity-export-settings.png&quot;&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;익스포트창의 왼쪽 상단의 JSON을 선택합니다.&lt;/p&gt;
&lt;img src=&quot;http://esotericsoftware.com/img/spine-runtimes-guide/spine-unity/exportwindow-json-s.png&quot;&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Create atals에 체크합니다.&lt;/p&gt;
&lt;img src=&quot;http://esotericsoftware.com/img/spine-runtimes-guide/spine-unity/exportwindow-createatlas-s.png&quot;&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Create atals 체크박스옆의 셋팅 버튼을 눌러서 텍스쳐팩커 설정창을 엽니다.&lt;/p&gt;
&lt;p&gt;설정창 오른쪽 아래에 Atalas extension이라 이름 붙여진 부분에 &lt;b&gt;.atals.txt&lt;/b&gt; 라고 설정되어 있는지 확인합니다. 다르게 되어 있는경우 &lt;b&gt;.atals.txt&lt;/b&gt;로 바꿔줍니다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Ok&lt;/b&gt;버튼을 눌러서 텍스쳐 팩커 설정창을 닫습니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;다시 익스포트창으로 돌아와 Output folder 폴더를 지정해줍니다.&lt;/p&gt;
&lt;img src=&quot;http://esotericsoftware.com/img/spine-runtimes-guide/spine-unity/exportwindow-json-outputfolder-s.png&quot;&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;익스포트를 눌러 리소스를 익스포트 합니다.&lt;/p&gt;
&lt;img src=&quot;http://esotericsoftware.com/img/spine-runtimes-guide/spine-unity/exportwindow-exportbutton-s.png&quot;&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;익스포트한 폴더로 이동하면 각기 확장자가 allas.txt, json, png&amp;nbsp;3개의 파일이 있습니다.&lt;/p&gt;
&lt;img src=&quot;http://esotericsoftware.com/img/spine-runtimes-guide/spine-unity/three-exported-files.png&quot;&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위에서 익스포트한 리소스를 유니티에서 사용하기전에 먼저 스파인 유니티 런타임 패키지를&amp;nbsp; 유니티 프로젝트에 임포트 해야 합니다.&lt;/p&gt;&lt;p&gt;아래 링크에서 스파인 런타임 유니티용 패키지를 다운로드 하고 유니테 프로젝트에 임포트 해주세요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://esotericsoftware.com/files/runtimes/unity/spine-unity-3_7-2019-01-21.unitypackage&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://esotericsoftware.com/files/runtimes/unity/spine-unity-3_7-2019-01-21.unitypackage&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;스파인에서 익스포트해서 나온 3개의 파일을 유니티 프러젝트 패널에 드래그 해서 임포트 합니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;관리를 위해서 유니티의 프로젝트 패널에서 캐릭터용 폴더를 따로 만들어서 넣어주세요.&lt;/p&gt;&lt;p&gt;스파인 유니티용 런타임 패키지를 설치 했다면 스파인이 자동으로 필요한 리소스들을 생성해줄겁니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;img src=&quot;http://esotericsoftware.com/img/spine-runtimes-guide/spine-unity/explorer-to-unity-project.gif&quot;&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;xxx_SkeletonData 형태의 이름을 가진 애셋을 씬뷰 또는 하이어라키 패널에 드래그 하면 메뉴가 출력되는데 상단의 SkeletonAnimation을 눌러주면 씬에 임포트한 캐릭터를 배치할 수 있습니다.&lt;/p&gt;
&lt;img src=&quot;http://esotericsoftware.com/img/spine-runtimes-guide/spine-unity/drag-and-drop-instantiate.gif&quot;&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Unity</category>
      <category>Spine</category>
      <category>스파인</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/344</guid>
      <comments>https://eltgroup.tistory.com/344#entry344comment</comments>
      <pubDate>Tue, 22 Jan 2019 20:07:32 +0900</pubDate>
    </item>
    <item>
      <title>브라우저 새로고침</title>
      <link>https://eltgroup.tistory.com/342</link>
      <description>&lt;p&gt;크롬 : 개발자도구가 열린상태에서 새로고침을 꾹 누르면 나오는 메뉴에서 캐시비움 가능&lt;/p&gt;&lt;p&gt;오페라 : 도구 -&amp;gt; 설정 -&amp;gt; 고급설정 -&amp;gt; 검색 데이터 지우기 에서 삭제&lt;/p&gt;&lt;p&gt;파이어폭스 : Shift + 새로고침&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>기타</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/342</guid>
      <comments>https://eltgroup.tistory.com/342#entry342comment</comments>
      <pubDate>Thu, 20 Sep 2018 14:50:38 +0900</pubDate>
    </item>
    <item>
      <title>웹소켓 채팅서버</title>
      <link>https://eltgroup.tistory.com/334</link>
      <description>&lt;div&gt;웹소켓 기반 채팅 서버 예제입니다.&lt;/div&gt;&lt;div&gt;서버는 c#기반 슈퍼웹소켓 이용했고, 모노기반에서 우분투 리눅스 데몬으로 작동합니다. VS2017용 솔류션입니다.&lt;/div&gt;&lt;div&gt;클라이언트는 코코스 크리에이터입니다.&lt;/div&gt;&lt;div&gt;HTML5 지원하는 브라우져에서 테스트 가능합니다.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;a href=&quot;https://github.com/choi98772/chatexam&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;소스 다운로드&lt;/a&gt;(Git)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;먼저 서버 접속을 통해서 채팅서버에 접속후 채팅할 수 있습니다.&lt;/div&gt;&lt;div&gt;아래에 아무것도 표시되지 않는다면 브라우저에 의해서&amp;nbsp; 클라이언트가 차단된경우일 수 있습니다.&lt;/div&gt;&lt;div&gt;안전하지 않은 스크립트소스 로드 허용하시면 플레이 가능합니다.&lt;/div&gt;&lt;iframe width=&quot;700&quot; height=&quot;650&quot; src=&quot;https://choi98772.github.io/chatexam/ChatServer/&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>포트폴리오</category>
      <category>cocoscreator</category>
      <category>superwebsocket</category>
      <category>websocket</category>
      <category>웹소켓</category>
      <category>채팅서버</category>
      <category>코코스크리에이터</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/334</guid>
      <comments>https://eltgroup.tistory.com/334#entry334comment</comments>
      <pubDate>Wed, 13 Jun 2018 00:38:38 +0900</pubDate>
    </item>
    <item>
      <title>유니티 연습</title>
      <link>https://eltgroup.tistory.com/333</link>
      <description>&lt;p&gt;유니티 까먹지 않기 위한 연습프로젝트 입니다.&lt;/p&gt;
&lt;p&gt;1:1 pvp 입니다. 컴퓨터와 서로 공격을 주고 받으면서 이기는게 목표인 단순한 샘플예제입니다.&lt;/p&gt;
&lt;p&gt;HTML5를 지원하는 브라우져에서 플레이 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;A,S,D,F키를 통해서 이동, 마우스 왼버튼이 공격입니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/choi98772/unityexam1&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;소스코드는 여기에서 다운로드 할 수 있습니다.&lt;/a&gt;(Git)&lt;/p&gt;

&lt;iframe width=&quot;800&quot; height=&quot;750&quot; src=&quot;https://d1arer6wlaufoo.cloudfront.net/PVP2/index.html&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>포트폴리오</category>
      <category>Unity</category>
      <category>유니티 타일맵</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/333</guid>
      <comments>https://eltgroup.tistory.com/333#entry333comment</comments>
      <pubDate>Tue, 12 Jun 2018 14:01:56 +0900</pubDate>
    </item>
    <item>
      <title>유닉스 소켓프로그래밍</title>
      <link>https://eltgroup.tistory.com/332</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;BeeJ's Guide to Network Programming.&amp;nbsp;&lt;/p&gt;&lt;p&gt;인터넷 소켓 활용(v.1.5.4, 17-May-1998)&amp;nbsp;&lt;/p&gt;&lt;p&gt;http://www.ecst.csuchico.edu/~beej/guide/net 번역 : 박성호(tempter@fourthline.com),1998/8/20&amp;nbsp;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;시작&lt;/p&gt;&lt;p&gt;소켓 프로그램이 어렵나요?&amp;nbsp;&lt;/p&gt;&lt;p&gt;그냥 맨페이지만 보고서는 알아내기가 좀 어럽나요?&amp;nbsp;&lt;/p&gt;&lt;p&gt;뭔가 있어보이는 인터넷 프로그램을 만들고 싶지만 bind()를 호출하고 connect()&lt;/p&gt;&lt;p&gt;를 호출하고 이런 저런 구조체를 뒤지고 할 시간이 없나요?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;글쎄요, 제가 그 지겨운걸 다 해놓았고요, 여러분과 이 정보를 공유하고 싶군요.&amp;nbsp;&lt;/p&gt;&lt;p&gt;바로 찾아오셨습니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;이 문서가 바로 평균적인 C 프로그래머에게 네트워크 프로그램에 관련된 정보를&amp;nbsp;&lt;/p&gt;&lt;p&gt;드릴겁니다.&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;대상&lt;/p&gt;&lt;p&gt;이 문서는 안내서이지 리퍼런스는 아닙니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;아마도 소켓 프로그래밍을 처음 시작하면서 어디서부터 해야 할지 모르는&amp;nbsp;&lt;/p&gt;&lt;p&gt;사람들에게 도움이 될겁니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;물론 어떤 의미에서도 이 글은 소켓 프로그래밍에 관한 완벽한 안내서는 아닐&amp;nbsp;&lt;/p&gt;&lt;p&gt;겁니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;단지 도저히 의미를 알 수 없던 맨페이지들을 조금씩 이해하게 되기만 바랄&amp;nbsp;&lt;/p&gt;&lt;p&gt;뿐입니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;사용도구&lt;/p&gt;&lt;p&gt;대부분의 코드는 리눅스 PC에서 GNU의 gcc를 이용하여 컴파일 되었습니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;또한 HPUX에서 gcc를 이용해서 컴파일 된다는 것도 확인했습니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;그러나 모든 작은 코드들이 테스트 된것은 아니라는 것을 기억하시기 바랍니다.&lt;/p&gt;&lt;p&gt;(이하 존칭 생략)&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;내용&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;소켓이란 무엇인가.&amp;nbsp;&lt;/p&gt;&lt;p&gt;두가지 종류의 소켓&amp;nbsp;&lt;/p&gt;&lt;p&gt;네트워크 이론과 저수준의 알수없는 것들&amp;nbsp;&lt;/p&gt;&lt;p&gt;struct s--이걸 모르면 외계인이 지구를 파괴할걸~~&amp;nbsp;&lt;/p&gt;&lt;p&gt;순서 바꾸기&amp;nbsp;&lt;/p&gt;&lt;p&gt;IP주소 와 활용법&amp;nbsp;&lt;/p&gt;&lt;p&gt;socket()--파일 기술자를 잡아라&amp;nbsp;&lt;/p&gt;&lt;p&gt;bind()--나는 어떤 포트에 연결되었나?&amp;nbsp;&lt;/p&gt;&lt;p&gt;connect()--어이 거기!&amp;nbsp;&lt;/p&gt;&lt;p&gt;listen()--누가 전화좀 걸어주지&amp;nbsp;&lt;/p&gt;&lt;p&gt;accept()--포트3490에 전화걸어주셔서 감사합니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;send() and recv()--말좀 해봐!&amp;nbsp;&lt;/p&gt;&lt;p&gt;sendto() and recvfrom()--말좀해봐! 데이터그램방식&amp;nbsp;&lt;/p&gt;&lt;p&gt;close() and shutdown()--꺼지쇼!&amp;nbsp;&lt;/p&gt;&lt;p&gt;getpeername()--누구십니까?&amp;nbsp;&lt;/p&gt;&lt;p&gt;gethostname()--난 누구인가?&amp;nbsp;&lt;/p&gt;&lt;p&gt;DNS--&quot;whitehouse.gov&quot;, - &quot;198.137.240.100&quot;&amp;nbsp;&lt;/p&gt;&lt;p&gt;클라이언트 서버의 배경&amp;nbsp;&lt;/p&gt;&lt;p&gt;간단한 스트림서버&amp;nbsp;&lt;/p&gt;&lt;p&gt;간단한 스트림클라이언트&amp;nbsp;&lt;/p&gt;&lt;p&gt;데이터그램 소켓&amp;nbsp;&lt;/p&gt;&lt;p&gt;블로킹&amp;nbsp;&lt;/p&gt;&lt;p&gt;select()--동기화된 중복입출력, 대단하군!&amp;nbsp;&lt;/p&gt;&lt;p&gt;참고사항&amp;nbsp;&lt;/p&gt;&lt;p&gt;주의사항 및 연락처&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;소켓이란 무엇인가.&lt;/p&gt;&lt;p&gt;소켓이란 단어는 많이 들었을 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;그리고 아마도 그 소켓이 정확히 무엇인가에 대하여 궁금해 하기도 했을 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;소켓은 정규 유닉스 파일 기술자를 이용하여 다른 프로그램과 정보를 교환하는&amp;nbsp;&lt;/p&gt;&lt;p&gt;방법을 의미한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;뭐라고라?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;좋다. 아마도 유닉스를 잘하는 사람들이 이렇게 얘기하는 것을 들어본 적이&amp;nbsp;&lt;/p&gt;&lt;p&gt;있을 것이다. &quot;유닉스에서는 모든게 파일로 되어있군!&quot; 실제로 그들이 얘기하는&amp;nbsp;&lt;/p&gt;&lt;p&gt;것은 모든 유닉스 프로그램들이 어떤 종류의 입출력을 하더라도 파일 기술자를&amp;nbsp;&lt;/p&gt;&lt;p&gt;통해서 하게 된다는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;파일 기술자는 사실 열려진 파일을 의미하는 정수일 뿐이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;그러나 그 파일은 네트워크가 될수도 있고 FIFO, 파이프, 터미널, 실제&amp;nbsp;&lt;/p&gt;&lt;p&gt;디스크상의 파일이 될수도 있으며 그 밖의 무엇도 다 된다는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;유닉스의 모든것은 파일이다! 따라서 당신이 인터넷을 통하여 멀리 떨어진 다른&amp;nbsp;&lt;/p&gt;&lt;p&gt;프로그램과 정보를 교환하기 위해서는 파일 기술자를 이용하면 된다는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;믿으쇼~&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&quot;똑똑이 양반, 그 파일 기술자는 도대체 어떻게 만드는거요?&quot; 라는게 당신의&amp;nbsp;&lt;/p&gt;&lt;p&gt;맘속에 지금 막 떠오른 질문일 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;여기에 대답이 있다. socket()을 호출하면 소켓 기술자를 얻게 되고&amp;nbsp;&lt;/p&gt;&lt;p&gt;send(), recv()등의 소켓에 관련된 함수를 호출하여 정보를 교환할 수 있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;(man send, man recv를 해봐도 됨)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&quot;잠깐!&quot; 이렇게 이의를 제기하겠지.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&quot;그 소켓 기술자가 파일 기술자라면 도대체 왜 read(),write()를 쓰면&amp;nbsp;&lt;/p&gt;&lt;p&gt;안되는거요?&quot; 짧게 말하면 맞다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;그러나 send(),recv()를 쓰는 것이 여러모로 네트워크를 통한 정보전달을&amp;nbsp;&lt;/p&gt;&lt;p&gt;제어하기에 도움이 된다는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다음은 뭔가? 소켓의 종류는? DARPA 인터넷 주소(인터넷 소켓),&amp;nbsp;&lt;/p&gt;&lt;p&gt;경로명과 지역노드(유닉스 소켓), CCITT X.25 주소(X.25 소켓, 그냥 무시해도 됨)&lt;/p&gt;&lt;p&gt;등이 있고 아마도 당신이 쓰는 유닉스에 따라서 더 많은 종류의 소켓들이 있을&amp;nbsp;&lt;/p&gt;&lt;p&gt;것이다. 이 문서는 첫번째 (인터넷 소켓) 하나만 설명할 것이다.&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;두가지 종류의 소켓&lt;/p&gt;&lt;p&gt;인터넷 소켓에 두가지 종류가 있나? 그렇다. 음..사실은 거짓말이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;좀 더있긴 하지만 겁을 주고 싶지 않기 때문에 이것 두가지만 이야기 하는 것이다.&lt;/p&gt;&lt;p&gt;RAW 소켓이라는 매우 강력한 것도 있으며 한번 봐두는 것도 좋다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;두가지 종류는 무엇인가? 하나는 스트림소켓 이고 다른 하나는 데이터그램&amp;nbsp;&lt;/p&gt;&lt;p&gt;소켓이다. 이후에는 SOCK_STREAM, SOCK_DGRAM으로 지칭될 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;데이터그램 소켓은 비연결 소켓이라고도 한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;(비록 그 소켓에서도 원한다면 connect()를 사용할 수도 있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;connect()절을 참조할것)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;스트림 소켓은 양측을 신뢰성있게 연결해 주는 소켓이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;만약 두가지 아이템을 이 소켓을 통하여 보낸다면 그 순서는 정확히&amp;nbsp;&lt;/p&gt;&lt;p&gt;유지될 것이다. 에러까지 교정된다. 만일 에러가 생긴다면 당신 실수이고&amp;nbsp;&lt;/p&gt;&lt;p&gt;당신실수를 막는 방법은 여기서 설명하지 않을 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;스트림 소켓은 어디에 쓰이는가? 아마도 텔넷이라고 들어봤을 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;들어봤느뇨? 그게 이 소켓을 쓴다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;입력한 모든 글자는 그 순서대로 전달이 되야 하는 경우이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;사실 WWW사이트의 포트 80에 텔넷으로 접속하여 &quot;GET pagename&quot; 을 입력하면&amp;nbsp;&lt;/p&gt;&lt;p&gt;HTML 화일의 내용이 우르르 나올 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;어떻게 스트림 소켓이 이정도의 정확한 전송 품질을 갖추게 되는가?&amp;nbsp;&lt;/p&gt;&lt;p&gt;이 소켓은 TCP를 이용하기 때문이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;(Transmission Control Protocol, RFC-793에 무척 자세하게 나와있다.)&amp;nbsp;&lt;/p&gt;&lt;p&gt;아마도 TCP 보다는 TCP/IP를 더 많이 들어봤을 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;앞부분은 바로 이 TCP이고 뒷부분의 IP는 인터넷 라우팅을 담당하는 프로토콜이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;괜찮군~ 데이터그램 소켓은 어떤가? 왜 비연결이라고 하는지?&amp;nbsp;&lt;/p&gt;&lt;p&gt;내용에 무슨 관련이 있는지? 왜 신뢰도가 떨어지지?&amp;nbsp;&lt;/p&gt;&lt;p&gt;사실 이 소켓의 경우 당신이 데이터그램을 보낸다면 정확히 도착할 수도 있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;또는 패킷들의 순서가 바뀌어서 도착할 수도 있다. 그러나 만약 도착한다면&amp;nbsp;&lt;/p&gt;&lt;p&gt;그 내용은 사실 정확한 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;데이터그램 소켓 또한 라우팅에는 IP를 이용하지만 TCP는 이용하지 않는다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;사실은 UDP(RFC-768)을 이용한다.&lt;/p&gt;&lt;p&gt;연결을 안하는가? 스트림 소켓에서처럼 열려있는 연결을 관리할 필요가 없는&amp;nbsp;&lt;/p&gt;&lt;p&gt;것이다. 그냥 데이터 패킷을 만들어서 목적지에 관련된 IP헤더를 붙여서&amp;nbsp;&lt;/p&gt;&lt;p&gt;발송하기만 하면 되는 것이다. 연결이 필요없다. 보통 tftp나 bootp 에 사용되는&amp;nbsp;&lt;/p&gt;&lt;p&gt;것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;좋아! 그러면 데이터 패킷이 도착하지 않을지도 모르는 이런 걸 어떻게 실제&amp;nbsp;&lt;/p&gt;&lt;p&gt;프로그램에서 사용하지? 사실 프로그램들은 UDP위에 그 나름대로의 대책을&amp;nbsp;&lt;/p&gt;&lt;p&gt;갖추고 있는 것이다. 예를 들면 tftp같은 경우에는 하나의 패킷을 보낸 후에&amp;nbsp;&lt;/p&gt;&lt;p&gt;상대편이 잘 받았다는 응답 패킷이 올때까지 기다리는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;만약 일정시간(예를 들면 5초)동안 응답이 없으면 못받은 것으로 간주하고&amp;nbsp;&lt;/p&gt;&lt;p&gt;다시 보내고, 다시 보내고 응답이 있으면 다음 패킷을 보내고 하게 되는것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;이 잘받았다는 응답(ACK reply) 방식은 사실 SOCK_DGRAM을 사용할 경우 매우&amp;nbsp;&lt;/p&gt;&lt;p&gt;중요하다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;네트워크 이론과 저아래의 알수없는 것들&lt;/p&gt;&lt;p&gt;간단히 프로토콜의 레이어에 대해서 언급을 했지만(UDP위에 나름대로의&amp;nbsp;&lt;/p&gt;&lt;p&gt;대책 어쩌구) 이제는 실제로 네트워크가 어떻게 작동하는 지를 알아볼 때가&amp;nbsp;&lt;/p&gt;&lt;p&gt;되었고 실제로 SOCK_DGRAM이 어떻게 구성되는 지를 알아볼 필요가 있을 것같다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;사실 이 절은 그냥 넘어가도 된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;여러분~ 이제는 데이타 캡슐화에 대하여 배우겠어요~ 사실 이것은 매우 중요하다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;얼마나 중요하냐면 우리 학교에서 네트워크 코스를 통과하려면 반드시 알아야&amp;nbsp;&lt;/p&gt;&lt;p&gt;하는 사항이기 때문이다. (흠..) 내용은 이렇다. 데이터 패킷이 만들어지면 먼저&amp;nbsp;&lt;/p&gt;&lt;p&gt;첫번째 프로토콜(tftp 프로토콜)에 필요한 머리말과 꼬리말이 붙는다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;이렇게 한번 캡슐화된 내용은 다시 두번째 프로토콜(UDP)에 관련된 머리말과&amp;nbsp;&lt;/p&gt;&lt;p&gt;꼬리말이 다시 붙게 된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;그 다음에는 IP, 그 다음에는 마지막으로 하드웨어 적인 계층으로서 이더넷&amp;nbsp;&lt;/p&gt;&lt;p&gt;프로토콜로 캡슐화가 되는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다른 컴퓨터에서 이 패킷을 받게 되면 하드웨어가 이더넷 헤더를 풀고 커널에서&amp;nbsp;&lt;/p&gt;&lt;p&gt;IP와 UDP 헤더를 풀고 tftp 프로그램에서 tftp헤더를 풀고 하여 끝으로 원래의&amp;nbsp;&lt;/p&gt;&lt;p&gt;데이터를 얻게 되는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제 드디어 악명높은 계층적 네트워크 모델(Layered Network Model)을 얘기할&amp;nbsp;&lt;/p&gt;&lt;p&gt;때가 된것 같다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;이 모델은 다른 모델들에 비해서 네트워크의 시스템을 기술하는 측면에서 많은&amp;nbsp;&lt;/p&gt;&lt;p&gt;이점이 있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;예를 들면 소켓 프로그래밍을 하는 경우 더 낮은 계층에서 어떤 물리적인&amp;nbsp;&lt;/p&gt;&lt;p&gt;방식(시리얼인지 thin ethernet인지 또는 AUI방식인지)으로 전달되는 지에 대하여&lt;/p&gt;&lt;p&gt;&amp;nbsp;전혀 신경을 쓰지 않고도 작업이 가능해 질 수 있다는 것이다. 실제 네트워크&amp;nbsp;&lt;/p&gt;&lt;p&gt;장비나 토폴로지는 소켓 프로그래머에게는 전혀 관계없는 분야이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;더이상 떠들지 않고 다음 계층들을 일러 주는데 만일 네트워크 코스에서 시험을&amp;nbsp;&lt;/p&gt;&lt;p&gt;보게 될 경우라면 외우는 것이 좋을 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Application&amp;nbsp;&lt;/p&gt;&lt;p&gt;Presentation&amp;nbsp;&lt;/p&gt;&lt;p&gt;Session&amp;nbsp;&lt;/p&gt;&lt;p&gt;Transport&amp;nbsp;&lt;/p&gt;&lt;p&gt;Network&amp;nbsp;&lt;/p&gt;&lt;p&gt;Data Link&amp;nbsp;&lt;/p&gt;&lt;p&gt;Physical&amp;nbsp;&lt;/p&gt;&lt;p&gt;물리적 계층(Physical layer)는 하드웨어(시리얼, 이더넷등) 이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;어플리케이션 계층은 상상할 수 있듯이 물리적 계층의 반대편 끝이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;이 계층을 통하여 사용자는 네트워크와 접촉하게 되는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;사실 이 모델은 자동차 수리 설명서 처럼 실질적인 뭔가를 할 수 있기에는&amp;nbsp;&lt;/p&gt;&lt;p&gt;너무나 일반적인 얘기이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;유닉스의 경우를 들어 보다 실질적인 얘기를 해 본다면,&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Application Layer (telnet, ftp, etc.)&amp;nbsp;&lt;/p&gt;&lt;p&gt;Host-to-Host Transport Layer (TCP, UDP)&amp;nbsp;&lt;/p&gt;&lt;p&gt;Internet Layer (IP and routing)&amp;nbsp;&lt;/p&gt;&lt;p&gt;Network Access Layer (was Network, Data Link, and Physical)&amp;nbsp;&lt;/p&gt;&lt;p&gt;이러한 계층으로 살펴 본다면 아까의 데이터 캡슐화가 각각 어떤 계층에 속하는&amp;nbsp;&lt;/p&gt;&lt;p&gt;가를 알 수 있을 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;이렇게 많은 작업이 하나의 데이터 패킷을 만드는데 동원되는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;이 내용을 당신이 데이터의 패킷 머리부분에 몽땅 타이핑 해 넣어야 한다는&amp;nbsp;&lt;/p&gt;&lt;p&gt;얘기다. (물론 농담이다.) 스트림 소켓의 경우 데이터를 내보내기 위해 해야 할 일은 오직 send()를 호출하는 것 뿐이다. 데이터 그램의 경우에는 원하는 방식으로 데이터를 한번 캡슐화하고 (tftp방식등) sendto()로 보내버리면 되는 것이다.커널이 전송계층과 인터넷 계층에 관련된 캡슐화를 하고 나머지는 하드웨어가 한다. 아~ 첨단 기술!!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이것으로 간단한 네트워크 이론은 끝이다. 참, 라우팅에 관해서 하고 싶던 얘기들을 하나도 안했다. 흠, 하나도 없다. 정말이지 라우팅에 관해서 하나도 얘기하지 않을 것이다. 라우터가 IP헤더를 벗겨내서 라우팅 테이블을 참조하여 어쩌구 저쩌구...만일 정말로 여기에 관심이 있다면 IP RFC를 참조할 것이며 만약 거기에 대해서 하나도 알지 못한다면! 생명에 지장은 없다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;struct S&lt;/p&gt;&lt;p&gt;결국은 여기까지 왔군. 드디어 프로그래밍에 관한 얘기를 할 때이다. 이 절에서는 실제로 꽤나 이해하기 어려운 소켓 인터페이스에서 쓰이는 여러가지 데이터 타입에 대한 얘기를 할 예정이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;먼저 쉬운것. 소켓 기술자이다.소켓 기술자의 데이터 형은&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;	&lt;/span&gt;int&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이다. 그냥 보통 int이다. (정수형)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;뭔가 좀 이상하더라도 그냥 참고 읽기 바란다. 이것은 알아야 한다. 정수에는 두 바이트가 있는데 상위 바이트가 앞에 있거나 또는 하위 바이트가 앞에 있게 된다. 앞의 경우가 네트워크 바이트 순서이다. 어떤 호스트는 내부적으로 네트워크 바이트 순서로 정수를 저장하는 경우도 있으나 안그런 경우가 많다. 만일 NBO라고 언급된 정수가 있다면 함수를 이용하여 (htons()함수) 호스트 바이트 순서로 바꾸어야 한다. 만약 그런 언급이 없다면 그냥 내버려 둬도 된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;첫번째 구조체, struct sockaddr. 이 구조체는 여러가지 형태의 소켓 주소를 담게된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; struct sockaddr {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unsigned short &amp;nbsp; &amp;nbsp;sa_family; &amp;nbsp; &amp;nbsp;/* address family, AF_xxx &amp;nbsp; &amp;nbsp; &amp;nbsp; */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sa_data[14]; &amp;nbsp;/* 14 bytes of protocol address */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; };&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;sa_family 는 여러가지가 될 수 있는데, 이 문서에서는 그중에서 &quot;AF_INET&quot;인 경우만 다루게 된다. sa_data 는 목적지의 주소와 포트번호를 가지게 된다. 약간 비실용적이군.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;sockaddr 구조체를 다루기 위해서는 다음과 같은 parallel structure를 만들어야 한다. (&quot;in&quot;은 인터넷을 의미한다.)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; struct sockaddr_in {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; short int &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sin_family; &amp;nbsp;/* Address family &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unsigned short int sin_port; &amp;nbsp; &amp;nbsp;/* Port number &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;*/&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct in_addr &amp;nbsp; &amp;nbsp; sin_addr; &amp;nbsp; &amp;nbsp;/* Internet address &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unsigned char &amp;nbsp; &amp;nbsp; &amp;nbsp;sin_zero[8]; /* Same size as struct sockaddr */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; };&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 구조체는 각각의 항을 참조하기가 좀더 쉬운 것 같다. 주의할 점은 sin_zero배열은 sockaddr 과 구조체의 크기를 맞추기 위해서 넣어진 것이므로 bzero()나 memset()함수를 이용하여 모두 0으로 채워져야 한다. 또한 꽤 중요한 점인데, 이 구조체는 sockaddr 의 포인터를 이용하여 참조될 수 있고 그 반대도 가능하다는 것이다. 따라서 socket()함수가 struct sockaddr * 를 원하더라도 struct sockaddr_in을 사용할 수 있고 바로 참조할 수도 있는 것이다. 또한 sin_family는 sa_family에 대응되는 것이며 물론 &quot;AF_INET&quot;로 지정되어야 하며 sin_port, sin_addr은 네트워크 바이트 순서로 되어야 하는 점이 중요한 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그러나! 어떻게 struct in_addr sin_addr 전체가 NBO가 될 수 있는가? 이 질문은 살아남은 가장 뭣같은 유니온인 struct in_addr 에 대한 보다 신중한 검토가 필요할 것같다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; /* Internet address (a structure for historical reasons) */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; struct in_addr {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unsigned long s_addr;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; };&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;음.. 이것은 유니온 &quot;이었었&quot;다. 그러나 그런 시절은 지나갔다. 시원하게 없어졌군! 따라서 만약 &quot;ina&quot;를 struct sockaddr_in형으로 정의해 놓았다면 ina.sin_addr.s_addr 로 NBO 상태의 4바이트 인터넷 어드레스를 정확하게 참조할 수 있을 것이다. 만약 사용하는 시스템이 struct in_addr에 그 끔찍한 유니온을 아직도 사용하고 있더라도 #defines S 덕분에 위에 한것과 마찬가지로 정확하게 참조할 수는 있을 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;순서 바꾸기&lt;/p&gt;&lt;p&gt;이제 다음 절로 왔다. 네트워크와 호스트 바이트 순서에 대해서 말이 너무 많았고 이제는 실제 움직일 때라고 본다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;좋다. 두가지 형태의 변환이 있는데 하나는 short(2 바이트)와 long(4바이트)의 경우이다. 이 함수들은 unsigned변수에서도 잘 작동된다. 이제 short변수를 호스트 바이트 순서에서 네트워크 바이트 순서로 변환하는 경우를 보자. 호스트의 h 로 시작해서 to 를 넣고 네트워크의 n 을 넣은 후 short의 s 를 넣는다. 그래서 htons()이다. (읽기는 호스트 투 네트워크 쇼트이다.)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;너무 쉬운가?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;사실 h,n,s,l 의 어떤 조합도 사용가능하다. (물론 너무 바보스러운 조합을 하지는 않겠지..예를 들어 stolh, 쇼트 투 롱 호스트?? 이런건 없다. 적어도 이 동네에서는없다.) 있는 것들은 다음과 같다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;htons()--&quot;Host to Network Short&quot;&amp;nbsp;&lt;/p&gt;&lt;p&gt;htonl()--&quot;Host to Network Long&quot;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ntohs()--&quot;Network to Host Short&quot;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ntohl()--&quot;Network to Host Long&quot;&amp;nbsp;&lt;/p&gt;&lt;p&gt;아마도 이제 상당히 많이 알게된 것같이 생각들을 할 것이다. &quot;char의 바이트 순서를 어떻게 바꾸지?(역자주: 이 질문은 아마 의미없는 질문으로 한 것 같은데 답도 없고 더이상의 언급이 없는 것으로 보아 빼고 싶은 부분이다.)&quot; 또는 &quot;염려마, 내가 쓰는 68000 기계는 이미 네트워크 바이트 순서로 정수를 저장하니까 변환할 필요는 없어 &quot; 라고 생각할 수도 있을 것이다. 그러나 꼭 그렇지만은 않다. 그렇게 작성된 프로그램을 다른 기계에서 작동시킨다면 당연히 문제가 발생할 것이다. 여기는 유닉스 세계고 이기종간의 호환성은 매우 중요한 것이다. 반드시 네트워크에 데이터를 보내기 전에 네트워크 바이트 순서로 바꿔서 보낸다는 것을 기억할 지어다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;끝으로 sin_addr, sin_port는 네트워크 바이트 순서로 기록하는데 왜 sin_family는 안 그러는가? 답은 간단하다. sin_addr과 sin_port는 캡슐화되어 네트워크로 전송되어야 하는 변수인 것이다. 따라서 당연히 NBO여야 한다. 그러나 sin_family는 시스템 내부에서 커널에 의해서만 사용되는 변수이며 네트워크로 전송되지 않는 것이므로 호스트 바이트 순서로 기록되어야 하는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;IP주소는 무엇이며 어떻게 다루는가?&lt;/p&gt;&lt;p&gt;다행스럽게도 IP주소를 산정해 주는 수많은 함수들이 있으며 따라서 4바이트의 long변수에 직접 계산해서 &amp;lt;&amp;lt; 연산자를 이용해서 집어넣어야 하는 수고는 할 필요가 없다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;먼저 struct sockaddr_IN ina가 정의되어 있고 132.241.5.10 이 IP 주소이며 이 값을 변수에 넣어야 한다고 가정해 보자. inet_addr()함수가 바로 이럴때 사용하는 것이다. 그 함수는 숫자와 점으로 구성된 IP주소를 unsigned long 변수에 집어 넣어 준다. 다음과 같이 하면 된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ina.sin_addr.s_addr = inet_addr(&quot;132.241.5.10&quot;)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;inet_addr()는 결과값으로 이미 NBO인 값을 돌려주며 굳이 htonl()을 또 사용할 필요는 없다는 점에 주의해야 한다. 멋지군!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그러나 위의 짤막한 코드는 그렇게 견실해 보이진 않는다. 왜냐하면 inet_addr()은 에러의 경우 -1을 돌려주게 되며 unsigned long에서 -1은 255.255.255.255를 의미한다. 이는 인터넷 브로드캐스트 어드레스가 된다. 나쁜 녀석. 항상 에러 처리를 확실히 하는것이 좋다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;좋다. 이제 IP주소를 long에 넣는것은 알았는데 그 반대는 어떻게 할 것인가? 만약에 값이 들어있는 struct in_addr은 가지고 있는데 이를 숫자와 점으로 표시하려면? 이 경우는 inet_ntoa()를 쓰면 된다.(ntoa 는 네트워크 투 아스키이다.)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; printf(&quot;%s&quot;,inet_ntoa(ina.sin_addr));&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위의 코드는 IP주소를 프린트 해 줄것이다. 이 함수는 long 변수가 아니라 struct in_addr 를 변수로 받아 들인다는 점을 주의해야 한다. 또한 이 함수는 char 에 대한 포인터를 결과로 돌려 주는데 이는 함수내에 static 한 공간에 저장되며 따라서 매번 함수가 호출될 때마다 이 포인터가 가리키는 곳의 값은 변화한다는 것이다. 즉 예를 들면,&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; char *a1, *a2;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; a1 = inet_ntoa(ina1.sin_addr); &amp;nbsp;/* this is 198.92.129.1 */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; a2 = inet_ntoa(ina2.sin_addr); &amp;nbsp;/* this is 132.241.5.10 */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; printf(&quot;address 1: %s\n&quot;,a1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; printf(&quot;address 2: %s\n&quot;,a2);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;의 출력은 이렇게 나올 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; address 1: 132.241.5.10&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; address 2: 132.241.5.10&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;만약에 이 값을 저장해야 할 필요가 있다면 strcpy()를 이용하여 고유의 char 배열에 저장해야 할 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이절에서 얘기할 것은 다 했다. 나중에 &quot;whitehouse.gov&quot; 문자열을 해당하는 IP주소로 바꾸는 법을 알려 줄것이다. (DNS절 참조)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;socket() ; 파일 기술자를 잡아라&lt;/p&gt;&lt;p&gt;안하면 맞을것 같아서 socket() 시스템 호출에 대해서 얘기해야만 할것같다. 이걸 잠깐 보자.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/types.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/socket.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int socket(int domain, int type, int protocol);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그런데 이 변수들은 또 뭔가? 첫째 domain 은 struct sockaddr_in 에서처럼 AF_INET 로 지정하면 된다. 다음 type 은 SOCK_STREAM이나 SOCK_DGRAM으로 지정하면 된다. 끝으로 protocol은 0으로 지정하면 된다. (언급하지 않았지만 더 많은 domain과 더 많은 type 이 있다는 것을 기억하라. socket() 맨페이지를 참고하고 또한 protocol 에 대해서 좀더 알려면 getprotobyname()을 참조하면 된다.)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;socket()은 바로 나중에 사용할 소켓 기술자인 정수값을 돌려주며 에러시에는 -1을 돌려주게 된다. 전역변수인 errno에 에러값이 기록된다. (perror()의 맨페이지를 참조할것.)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;bind() ; 나는 어떤 포트에 연결되었나?&lt;/p&gt;&lt;p&gt;일단 소켓을 열게 되면 이 소켓을 현재 시스템의 포트에 연결시켜 주어야 한다. (이 작업은 보통 listen()함수를 이용해서 외부의 접속을 대기할 때 시행되며 일반적으로 머드게임 사이트들이 telnet *.*.*.* 6969 로 접속하라고 할때도 이 작업을 시행했다는 의미이다. ) 만약에 그저 다른 호스트에 연결하기만 할 예정이라면 그냥 connect()를 사용하여 연결만 하면 되고 이 작업은 필요가 없다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래는 bind() 시스템 호출의 선언이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/types.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/socket.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int bind(int sockfd, struct sockaddr *my_addr, int addrlen);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;sockfd는 socket()함수에서 얻은 소켓 기술자이며 my_addr은 IP 주소에 관한 정보(즉, IP 주소와 포트번호)를 담고 있는 struct sockaddr 에 대한 포인터 이고 addrlen은 그 구조체의 사이즈(sizeof(struct sockaddr))이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;휴~~ 한방에 받아들이기에는 좀 그렇군. 예를 보자.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;string.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/types.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/socket.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #define MYPORT 3490&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; main()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int sockfd;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct sockaddr_in my_addr;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_family = AF_INET; &amp;nbsp; &amp;nbsp; /* host byte order */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_port = htons(MYPORT); /* short, network byte order */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_addr.s_addr = inet_addr(&quot;132.241.5.10&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bzero(&amp;amp;(my_addr.sin_zero), 8); &amp;nbsp; &amp;nbsp;/* zero the rest of the struct */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* don't forget your error checking for bind(): */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bind(sockfd, (struct sockaddr *)&amp;amp;my_addr, sizeof(struct sockaddr));&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;몇가지 주의할 점은 my_addr.sin_port 는 my_addr.sin_addr.s_addr과 같이 NBO이다. 또한 헤더화일은 각각의 시스템마다 다를 수 있으므로 각자의 시스템의 맨 페이지를 참고해야 할 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;마지막으로 bind()와 관련해서 주소나 포트의 지정이 때에 따라서 자동화 될 수도 있다는 것을 언급해야 할 것같다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_port = 0; /* choose an unused port at random */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_addr.s_addr = INADDR_ANY; &amp;nbsp;/* use my IP address */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;my_addr.sin_port를 0으로 지정하면 자동으로 사용되지 않고 있는 포트 번호를 지정해 줄것이며 my_addr.sin_addr.s_addr를 INADDR_ANY로 지정할 경우 현재 작동되고 있는 자신의 IP주소를 자동으로 지정해 주게 된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;만약 여기서 약간만 주의를 기울였다면 INADDR_ANY를 지정할 때 NBO로 바꾸는 것을 빼먹은 것을 눈치챌 것이다. 나아쁜~~. 그러나 난 내부정보를 알고 있지롱. 사실은 INADDR_ANY는 0이다. 0은 순서를 바꾸어도 0인것이다. 그러나 순수이론적인 측면에서 INADDR_ANY가 그러니까 12정도인 세계가 존재한다면 이 코드는 작동 안할것이다. 그래서? 난 상관없다. 정 그렇다면,&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_port = htons(0); /* choose an unused port at random */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_addr.s_addr = htonl(INADDR_ANY); &amp;nbsp;/* use my IP address */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제는 믿기 어려울 정도로 이식가능한 코드가 되었다. 다만 지적하고 싶은 것은 작동하는 데에는 아무 문제가 없다는 점이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;bind()또한 에러가 났을때 -1을 돌려주며 errno에 에러의 코드가 남게 된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;bind()를 호출할 때 주의할점 : 절대 제한선 아래로 포트번호를 내리지 말라는 것이다. 1024 아래의 번호는 모두 예약되어 있다. 그 위로는 65535까지 원하는 대로 쓸 수가 있다. (다른 프로그램이 쓰고 있지 않은 경우에 한해서..)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;또 하나의 작은 꼬리말 : bind() 를 호출하지 않아도 되는 경우가 있다. 만일 다른 호스트에 연결 (connect())하고자 하는 경우에는 자신의 포트에는 (텔넷의 경우처럼)전혀 신경 쓸 필요가 없다. 단지 connect()를 호출하기만 하면 알아서 bind가 되어 있는지를 체크해서 비어있는 포트에 bind를 해준다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;connect() ; 어이~ 거기~&lt;/p&gt;&lt;p&gt;이제 잠깐만 마치 자신이 텔넷 프로그램인 것처럼 생각해 보기로 하자. 당신의 사용자는 명령하기를 (TRON영화에서처럼.. (역자: 난 그 영화 안 봤는데..)) 소켓 기술자를 얻어오라 했고 당신은 즉시 socket()를 호출했다. 다음에 사용자는 132.241.5.10 에 포트 23(정규 텔넷 포트번호)에 연결하라고 한다. 윽, 이젠 어떻게 하지?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다행스럽게도 당신(프로그램)은 connect()절(어떻게 연결하는가)를 심각하게 읽고 있으며 당신의 주인을 실망시키지 않으려고 미친듯이 읽어나가는 중이로다~~&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;connet()는 다음과 같이 선언한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/types.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/socket.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;sockfd는 이제는 친숙해진 소켓 기술자이며 serv_addr은 연결하고자 하는 목적지인 서버의 주소와 포트에 관한 정보를 담고 있는 struct sockaddr 이며 addrlen은 앞에서 이야기 한것과 같이 그 구조체의 크기이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;뭔가 좀 이해가 갈듯 하지 않은가? 예를 들어 보자.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;string.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/types.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/socket.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #define DEST_IP &amp;nbsp; &quot;132.241.5.10&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #define DEST_PORT 23&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; main()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int sockfd;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct sockaddr_in dest_addr; &amp;nbsp; /* will hold the destination addr */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dest_addr.sin_family = AF_INET; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* host byte order */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dest_addr.sin_port = htons(DEST_PORT); /* short, network byte order */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bzero(&amp;amp;(dest_addr.sin_zero), 8); &amp;nbsp; &amp;nbsp; &amp;nbsp; /* zero the rest of the struct */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* don't forget to error check the connect()! */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; connect(sockfd, (struct sockaddr *)&amp;amp;dest_addr, sizeof(struct sockaddr));&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다시 말하건데 connect()의 결과값을 한번 체크해 봐야 한다. 에러일 경우 -1을 돌려주고 errno를 세팅하기 때문이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;또한 bind()를 호출하지 않은 것에 주의해야 한다. 기본적으로 여기서는 자신의 포트 번호에는 결코 관심이 없기 때문이다. 단지 어디로 가는가만이 중요하다. 커널이 알아서 로컬 포트를 선정해 줄 것이며 우리가 연결하고자 하는 곳에서는 자동으로 이 정보를 알게 될 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;listen() ; 누가 전화좀 걸어주지~&lt;/p&gt;&lt;p&gt;이제 보조를 바꾸어서, 만약에 어디론가 연결하고자 하는 것이 아니라 외부로부터의 접속을 대기해서 접속이 올 경우 어떤 방식으로든지 간에 처리를 해 주어야 하는 경우라면 어찌 할 것인가. 이 작업은 두 단계로 이루어진다. 먼저 listen()을 해야 되고 그 다음에 accept()를 해야 된다는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;listen()은 상당히 간단하지만 약간의 설명은 필요하다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int listen(int sockfd, int backlog);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;sockfd는 보통의 소켓 기술자이며 backlog는 접속대기 큐의 최대 연결 가능 숫자이다. 그건 또 뭔 얘기인가? 외부로부터의 연결은 이 대기 큐에서 accept()가 호출될 때까지 기다려야 한다는 것이며 숫자는 바로 얼마나 많은 접속이 이 큐에 쌓여질 수 있는가 하는 것이다. 대부분의 시스템은 이 숫자를 조용하게 20정도에서 제한하고 있으며 보통은 5에서 10 사이로 지정하게 된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;또 다시 listen()도 에러의 경우 -1을 돌려주며 errno를 세팅한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아마 상상할 수 있듯이 listen()보다 앞서서 bind()를 호출해야 하며 만약에 bind()가 되지 않으면 우리는 랜덤하게 지정된 포트에서 외부의 접속을 기다려야 한다. (포트를 모르고서 누가 접속할 수 있겠는가? 우엑~~) 따라서 외부의 접속을 기다리는 경우라면 다음 순서대로 작업이 진행되어야 하는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; socket();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; bind();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; listen();&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; /* accept() goes here */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위의 것만으로도 이해가 갈만하다고 보고 예제에 대신하겠다. (accept()절에 보다 괜찮은 코드가 준비되어 있다.) 이 모든 sha-bang(역자: 이 뭐꼬?)중에서 가장 헷갈리는 부분은 accept()를 부르는 부분이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;accept() ; 포트 3490에 전화걸어주셔서 감사합니다.&lt;/p&gt;&lt;p&gt;준비! accept()를 호출하는 것은 뭔가 좀 수상하긴 하다. 과연 뭐가 벌어지는가? 저 멀리 떨어진 곳에서 누군가가 connect()를 호출하여 당신이 listen()을 호출하고 기다리는 포트에 접속을 시도한다. 그들의 연결은 바로 accept()가 호출되기 까지 큐에서 바로 당신이 accept()를 호출하여 그 연결을 지속하라고 명령할 때까지 대기하게 된다. 그러면 이 함수는 오로지 이 연결을 위한 완전히 신제품 소켓 파일 기술자를 돌려주게 된다. 갑자기 당신은 하나값으로 두개의 소켓 기술자를 갖게 되는 것이다. 원래의 것은 아직도 그 포트에서 연결을 listen()하고 있다. 또 하나는 새롭게 창조되어 드디어 send()와 recv()를 할 준비가 되도록 하는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;드디어 여기까지 왔다! 감격~~&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;선언은 아래와 같다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;#include &amp;lt;sys/socket.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int accept(int sockfd, void *addr, int *addrlen);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;sockfd는 listen()하고 있는 소켓의 기술자이다. 뻔하지 뭐.. addr은 로컬 struct sockaddr_in의 포인터이다. 여기에 들어온 접속에 관한 정보가 담겨지게 되고 이를 이용해서 어느 호스트에서 어느 포트를 이용해서 접속이 들어왔는지를 알 수 있게 된다. addrlen은 로컬 정수 변수이며 이 정수에는 struct sockaddr_in의 크기가 미리 지정되어 있어야 한다. 이 숫자보다 더 많은 바이트의 정보가 들어오면 accept()는 받아 들이지 않을 것이며 적데 들어온다면 addrlen의 값을 줄여 줄 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;accept() 는 에러가 났을 경우에 어떻게 한다고? -1을 돌려주고 errno 를 세팅한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아까 맨치로 한방에 받아들이기에는 좀 그러니까 예제를 열심히 읽어 보자.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;string.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/types.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/socket.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #define MYPORT 3490 &amp;nbsp; &amp;nbsp;/* the port users will be connecting to */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #define BACKLOG 10 &amp;nbsp; &amp;nbsp; /* how many pending connections queue will hold */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; main()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int sockfd, new_fd; &amp;nbsp;/* listen on sock_fd, new connection on new_fd */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct sockaddr_in my_addr; &amp;nbsp; &amp;nbsp;/* my address information */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct sockaddr_in their_addr; /* connector's address information */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int sin_size;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_family = AF_INET; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* host byte order */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_port = htons(MYPORT); &amp;nbsp; &amp;nbsp; /* short, network byte order */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bzero(&amp;amp;(my_addr.sin_zero), 8); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* zero the rest of the struct */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* don't forget your error checking for these calls: */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bind(sockfd, (struct sockaddr *)&amp;amp;my_addr, sizeof(struct sockaddr));&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; listen(sockfd, BACKLOG);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sin_size = sizeof(struct sockaddr_in);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; new_fd = accept(sockfd, &amp;amp;their_addr, &amp;amp;sin_size);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제 new_fd를 이용해서 send()와 recv()를 이용할 수 있다는 것이다. 만약 원한다면 더이상의 연결을 받아들이지 않고 하나의 연결만 이용하기 위해서 close()를 이용하여 원래의 sockfd를 막아 버릴 수도 있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;send(), recv() ; 말좀해봐~&lt;/p&gt;&lt;p&gt;이 두 함수는 스트림 소켓이나 연결된 데이터그램 소켓위에서 정보를 주고 받을때 사용하는 것들이다. 만약 보통의 비연결 데이터그램 소켓을 사용한다면 sendto()와 recvfrom()절을 참조하도록 한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;send() 호출의 선언은 아래와 같다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int send(int sockfd, const void *msg, int len, int flags);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;sockfd는 socket()를 통해서 얻었거나 accept()를 통해서 새로 구한, 데이터를 보낼 소켓의 기술자이며, msg는 보낼 데이터를 가리키는 포인터, len은 보낼 데이터의 바이트 수 이며 flags 는 그냥 0으로 해야 한다. (플래그에 관한 보다 자세한 내용은 send()의 맨 페이지를 참조할것.)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;약간의 예제가 다음과 같다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; char *msg = &quot;Beej was here!&quot;;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int len, bytes_sent;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; len = strlen(msg);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; bytes_sent = send(sockfd, msg, len, 0);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;send()는 결과값으로 보내진 모든 바이트 수를 돌려주는데 이것은 보내라고 한 숫자보다 작을 수도 있다. 가끔은 보내고자 하는 데이터의 크기가 미처 감당하지 못할 만한 숫자인 경우도 있으며 이 경우 send()는 자기가 감당할 수 있는 숫자만큼만 보내고 나머지는 잘라 버린후 당신이 그 나머지를 다시 보내 줄 것으로 기대하는 것이다. 만약에 보내라고 한 데이터의 크기보다 작은 숫자가 결과값으로 돌아 왔다면 그 나머지 데이터를 보내는 것은 전적으로 당신의 책임인 것이다. 그나마 희소식은 데이터의 사이즈가 작다면 (1k 이내라면) 아마도 한번에 모두 보낼 수 있을 것이다. 또한 에러의 경우 -1을 돌려주며 errno를 세팅한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;recv()의 경우도 상당히 유사하다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int recv(int sockfd, void *buf, int len, unsigned int flags);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;sockfd는 읽어올 소켓의 기술자이며 buf는 정보를 담을 버퍼이다. len은 버퍼의 최대 크기이고 flags는 0으로 세팅해야 한다. (자세한 flags의 정보는 recv() 맨 페이지를 참조할것.)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;recv()는 실제 읽어들인 바이트 숫자를 돌려주며 에러의 경우는 -1, errno를 세팅한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;쉬웠을까? 쉬웠지.. 이제 당신은 스트림 소켓을 이용해서 데이터를 보내고 받을 수 있게 되었다. 우와~ 유닉스 네트워크 프로그래머네~~&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;sendto(), recvfrom() ; 말좀해봐~ 데이터 그램 방식&lt;/p&gt;&lt;p&gt;괜찮은걸, 이라고 말하고 있는줄로 생각하겠다. 그런데 데이터그램에 관한 나머지는 어딨지? 노프라블레모~ 아미고~(역자: 터미네이터2가 생각나는군~~) 이제 할 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;데이터그램 소켓은 연결을 할 필요가 없다면 데이터를 보내기 전에 주어야 할 나머지 정보는 어떻게 주어야 하는가? 맞다. 목적지의 주소를 알려주어야 한다. 여기에 예제가 있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int sendto(int sockfd, const void *msg, int len, unsigned int flags,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const struct sockaddr *to, int tolen);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;보다시피 이 함수는 두가지 부가정보가 더 들어간 것 이외에는 기본적으로 send()와 동일하다. to 는 struct sockaddr의 포인터이며(아마도 struct sockaddr_in) 여기에는 목적지의 주소와 포트번호가 담겨 있어야 할 것이다. tolen은 그 구조체의 크기인 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;send()와 마찬가지로 sendto()도 보내어진 데이터의 바이트수를 결과로 돌려주며(실제 보내라고 준 데이터의 크기보다 작을지도 모르는), 에러의 경우 -1을 돌려준다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;비슷하게 recvfrom()도 아래와 같다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int recvfrom(int sockfd, void *buf, int len, unsigned int flags&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;struct sockaddr *from, int *fromlen);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;역시 이것도 두가지 변수가 더 주어지게 된다. from은 데이터를 보내는 장비의 주소와 포트를 담고 있는 struct sockaddr 이며 fromlen은 로컬 정수변수로서 구조체의 크기가 세팅되어 있어야 한다. 함수가 호출된 뒤에는 fromlen에는 실제 from의 크기가 수록되게 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;recvfrom()은 실제 받은 데이터의 바이트수를 돌려주며 에러의 경우는 -1, errno를 세팅하게 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;만약 connect()를 이용하여 데이터그램 소켓을 연결한 후의 상황이라면 간단히 send(), recv() 를 사용해도 상관 없으며 소켓 인터페이스는 자동으로 목적지와 소스에 관한 정보를 함수에 추가해서 작동되게 될 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;close(), shutdown() ; 꺼지쇼.&lt;/p&gt;&lt;p&gt;휴~~ 하루종일 데이터를 보내고 받았더니..이제는 소켓을 닫을 때가 된 것이다. 이건 쉽다. 정규 파일 기술자에 관한 close()를 사용하면 되는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; close(sockfd);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이것으로 더이상의 입출력은 불가능 해지며 누구든지 원격지에서 이 소켓에 읽고 쓰려고 하는 자는 에러를 받게 될 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;약간 더 세밀한 제어를 위해서는 shutdown()을 사용하면 된다. 이것을 이용하면 특정방향으로의 통신만을 끊을 수도 있게 된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int shutdown(int sockfd, int how);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;sockfd는 소켓 기술자이며 how는 다음과 같다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;0 - 더이상의 수신 금지&amp;nbsp;&lt;/p&gt;&lt;p&gt;1 - 더이상의 송신 금지&amp;nbsp;&lt;/p&gt;&lt;p&gt;2 - 더이상의 송수신 금지(close()와 같은 경우)&amp;nbsp;&lt;/p&gt;&lt;p&gt;shutdown() 은 에러의 경우 -1을 돌려주며 errno를 세팅한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;황송하옵게도 연결도 되지않은 데이터그램 소켓에 shutdown()을 사용한다면 단지 send(), recv()를 사용하지 못하게만 만들 것이다. connect()를 사용한 경우에만 이렇게 사용할 수 있다는 것을 기억해야 한다. (역자: 그렇다면 sendto, recvfrom은 사용이 된다는 얘기인가??테스트가 필요할듯.)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;암것도 아니군.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;getpeername() ; 누구십니까?&lt;/p&gt;&lt;p&gt;이 함수는 되게 쉽다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;너무 쉬워서 절을 따로 만들 필요가 없지않나 고민했지만 여기 있는걸 보니까..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;getpeername()은 상대편 쪽 스트림 소켓에 누가 연결되어 있는가를 알려준다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/socket.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int getpeername(int sockfd, struct sockaddr *addr, int *addrlen);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;sockfd는 연결된 스트림 소켓의 기술자이며 addr은 상대편의 정보를 담게 될 struct sockaddr(또는 struct sockaddr_in)의 포인터 이며 addrlen은 정수를 가리키는 포인터로서 구조체의 크기가 지정되어 있어야 한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;에러의 경우는 -1을 돌려주고 errno를 세팅한다. (외우겠군.)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;일단 주소를 알게되면 inet_ntoa()나 gethostbyaddr()을 이용하여 좀더 많은 정보를 알아낼 수 있게 되지만 상대편의 login name을 알게되는 것은 아니다. (만일 상대편에 ident 데몬이 돌고 있다면 알아낼 방법이 없는 것은 아니지만 이 내용은 이 글의 취지를 벗어나는 내용이므로 RFC-1413을 참조하라고 말하고 싶다.)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;gethostname() ; 난 누구인가?&lt;/p&gt;&lt;p&gt;getpeername()보다 더 쉬운 것이 이 함수이다. 결과로 프로그램이 돌고 있는 컴퓨터의 이름을 알려준다. 이름은 gethostbyname()을 이용하여 로컬 장비의 IP주소를 알아내는데 사용될 수도 있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;뭐가 더 재미있는가? 몇가지 생각해 볼 수 있는데 이 문서에는 적절하지 않은 내용이다(역자: 과연 뭘까..되게 궁금하네..). 어쨌거나,&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;unistd.h&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int gethostname(char *hostname, size_t size);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;hostname은 문자열의 포인터이며 함수가 돌려주는 값을 담게 될 변수이다. size는 그 문자열의 크기이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;성공적이면 0을, 에러의 경우 -1을 리턴하고 errno를 세팅한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;DNS ; whitehouse.gov - 198.137.240.100&lt;/p&gt;&lt;p&gt;모르는 사람을 위하여 DNS는 Domain Name Service 라는 것을 먼저 얘기 하겠다. 간결하게 얘기한다면 DNS에다가 사람이 읽을수 있는 주소를 말해주면 DNS는 bind,connect,sendto,어쨌거나 IP주소가 필요한 것들에서 사용할 수 있는 IP주소를 돌려준다. 즉 누군가가 이렇게 입력했다면&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; $ telnet whitehouse.gov&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;telnet 은 connect()에 사용하기 위해서 198.137.240.100이라는 IP주소를 찾아내게 된다. 그런데 어떻게 그렇게 하는 것인가? gethostbyname()을 사용하면 된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;netdb.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; struct hostent *gethostbyname(const char *name);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;보다시피 결과로 struct hostent의 포인터가 돌아온다. 그 구조는 아래와 같다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; struct hostent {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char &amp;nbsp; &amp;nbsp;*h_name;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char &amp;nbsp; &amp;nbsp;**h_aliases;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int &amp;nbsp; &amp;nbsp; h_addrtype;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int &amp;nbsp; &amp;nbsp; h_length;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char &amp;nbsp; &amp;nbsp;**h_addr_list;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; };&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #define h_addr h_addr_list[0]&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;각 필드에 대한 설명은 다음과 같다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;h_name - 호스트의 공식적인 이름&amp;nbsp;&lt;/p&gt;&lt;p&gt;h_aliases - 호스트의 별명으로서 NULL 로 끝맺음된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;h_addrtype - 주소의 종류, 보통 AF_INET&amp;nbsp;&lt;/p&gt;&lt;p&gt;h_length - 주소의 바이트 수&amp;nbsp;&lt;/p&gt;&lt;p&gt;h_addr_list - 0으로 끝나는 네트워크 주소들, NBO로 되어 있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;h_addr - h_addr_list속의 첫번째 주소&amp;nbsp;&lt;/p&gt;&lt;p&gt;gethostbyname()은 위의 구조체의 포인터를 돌려주게 되며 에러의 경우 NULL을 돌려준다. errno는 세팅되지 않고 h_errno가 세팅이 된다. (아래의 herror()참조)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그런데 이걸 어떻게 사용하는가? 보통 컴퓨터 매뉴얼들 처럼 독자앞에 정보를 마구 쌓아놓은 것만으로는 부족한 법이다. 이 함수는 사실 보기보다는 쓰기가 쉬운 편이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예제를 보자.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;stdio.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;stdlib.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;errno.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;netdb.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/types.h&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;netinet/in.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int main(int argc, char *argv[])&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct hostent *h;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (argc != 2) { &amp;nbsp;/* error check the command line */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fprintf(stderr,&quot;usage: getip address\n&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((h=gethostbyname(argv[1])) == NULL) { &amp;nbsp;/* get the host info */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; herror(&quot;gethostbyname&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&quot;Host name &amp;nbsp;: %s\n&quot;, h-&amp;gt;h_name);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&quot;IP Address : %s\n&quot;,inet_ntoa(*((struct in_addr *)h-&amp;gt;h_addr)));&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;gethostbyname()에서는 errno가 세팅되지 않는 까닭으로 perror()를 사용할 수 없고 herror()을 사용해야 한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;간단히 호스트의 이름을 담고 있는 스트링을 gethostbyname()함수에 넣어 줌으로써 바로 struct hostent 를 얻게 되는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;남아있는 한가지 수상한 점은 위의 방법으로 어떻게 주소를 숫자와 점으로 출력할 것인가 하는 문제이다. h-&amp;gt;h_addr 은 문자 포인터( char *) 인데 inet_ntoa()는 변수로서 struct in_addr 을 원하기 때문이다. 따라서 h-&amp;gt;h_addr 을 struct in_addr * 으로 형변환을 하고 결과값을 얻기 위해 다시 역참조 하면 된다는 것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;클라이언트-서버의 배경&lt;/p&gt;&lt;p&gt;요즘은 클라이언트-서버가 판치는 세상이죠~~&amp;nbsp;&lt;/p&gt;&lt;p&gt;네트워크에 관한 모든 것은 서버 프로세스를 요청하는 클라이언트 프로세스로서&amp;nbsp;&lt;/p&gt;&lt;p&gt;다루어진다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;텔넷을 이용하여 23번 포트에 접속하는 (클라이언트)것은&amp;nbsp;&lt;/p&gt;&lt;p&gt;서버프로그램(telnetd)을 작동시키게 되는 것이며 이 서버 프로그램은 들어오는&amp;nbsp;&lt;/p&gt;&lt;p&gt;각종 신호를 받아들여서 당신의 텔넷 접속을 위하여 로그인 프롬프트를 주게&amp;nbsp;&lt;/p&gt;&lt;p&gt;되는 것이다. 등등..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;그림2. 클라이언트-서버간의 관계&amp;nbsp;&lt;/p&gt;&lt;p&gt;클라이언트와 서버간의 정보 교환의 모델이 그림에 잘 나와있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;주목할점은 클라이언트와 서버간에는 SOCK_STREAM이든, SOCK_DGRAM이든지간에&amp;nbsp;&lt;/p&gt;&lt;p&gt;같은 것으로만 된다면 의사소통이 된다는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;좋은 예들은 telnet-telnetd, ftp-ftpd, 또는 bootp-bootpd 등이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;ftp를 쓴다면 반드시 상대편에 ftpd가 돌고 있다는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;보통 호스트에는 하나의 서버 프로그램이 돌고 있게 된다. 그리고 그 서버는&amp;nbsp;&lt;/p&gt;&lt;p&gt;fork()를 이용하여 다중의 클라이언트를 받게 되는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;기본적인 루틴의 구조는 다음과 같다. 서버는 접속을 대기하다가 accept()를&amp;nbsp;&lt;/p&gt;&lt;p&gt;호출하게 되며 그 때 fork()를 이용하여 자식 프로세스를 만들어내어 그 접속을&amp;nbsp;&lt;/p&gt;&lt;p&gt;처리하게 된다. 이것이 바로 다음에 소개될 예제 서버 프로그램의 구조이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;간단한 스트림 서버&lt;/p&gt;&lt;p&gt;이 서버가 하는 일은 오직 스트림 접속을 하게 되는 모든 클라이언트에게&amp;nbsp;&lt;/p&gt;&lt;p&gt;&quot;Hello, World!\n&quot;을 출력해 주는 것이다. 이 서버를 테스트하기 위해서는&amp;nbsp;&lt;/p&gt;&lt;p&gt;하나의 윈도우에서 이 서버를 실행시켜 놓고 다른 윈도우에서 텔넷 접속을&amp;nbsp;&lt;/p&gt;&lt;p&gt;시도해 보는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; $ telnet remotehostname 3490&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;hostname 은 서버 프로그램이 작동된 호스트의 이름이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;서버 프로그램 코드&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;stdio.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;stdlib.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;errno.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;string.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/types.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;netinet/in.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/socket.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/wait.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #define MYPORT 3490 &amp;nbsp; &amp;nbsp;/* the port users will be connecting to */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #define BACKLOG 10 &amp;nbsp; /* how many pending connections queue will hold */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; main()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int sockfd, new_fd; &amp;nbsp;/* listen on sock_fd, new connection on new_fd */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct sockaddr_in my_addr; &amp;nbsp; &amp;nbsp;/* my address information */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct sockaddr_in their_addr; /* connector's address information */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int sin_size;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; perror(&quot;socket&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_family = AF_INET; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* host byte order */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_port = htons(MYPORT); &amp;nbsp; &amp;nbsp; /* short, network byte order */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bzero(&amp;amp;(my_addr.sin_zero), 8); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* zero the rest of the struct */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (bind(sockfd, (struct sockaddr *)&amp;amp;my_addr, sizeof(struct sockaddr)) \&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; == -1) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; perror(&quot;bind&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (listen(sockfd, BACKLOG) == -1) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; perror(&quot;listen&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while(1) { &amp;nbsp;/* main accept() loop */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sin_size = sizeof(struct sockaddr_in);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((new_fd = accept(sockfd, (struct sockaddr *)&amp;amp;their_addr, \&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;amp;sin_size)) == -1) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; perror(&quot;accept&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; continue;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&quot;server: got connection from %s\n&quot;, \&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;inet_ntoa(their_addr.sin_addr));&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!fork()) { /* this is the child process */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (send(new_fd, &quot;Hello, world!\n&quot;, 14, 0) == -1)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; perror(&quot;send&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; close(new_fd);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(0);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; close(new_fd); &amp;nbsp;/* parent doesn't need this */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; while(waitpid(-1,NULL,WNOHANG) &amp;gt; 0); /* clean up child processes */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 코드는 문법상의 단순함을 위하여 하나의 커다란(내 생각에) main()에 모든&amp;nbsp;&lt;/p&gt;&lt;p&gt;것이 들어가 있다. 만약에 이것을 잘게 잘라서 작은 여러개의 함수로 구성을&amp;nbsp;&lt;/p&gt;&lt;p&gt;하는것이 좋다고 생각된다면 그래도 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다음의 클라이언트 코드를 이용한다면 이 서버로부터 문자열을 받아 낼수도 있다.&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;간단한 스트림 클라이언트&lt;/p&gt;&lt;p&gt;이녀석은 서버보다 더 쉬운 코드이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;이 프로그램이 하는 일은 명령행에서 지정된 주소에 3490번 포트에 접속하여&amp;nbsp;&lt;/p&gt;&lt;p&gt;서버가 보내는 문자열을 받는 것 뿐이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;stdio.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;stdlib.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;errno.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;string.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;netdb.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/types.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;netinet/in.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/socket.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #define PORT 3490 &amp;nbsp; &amp;nbsp;/* the port client will be connecting to */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #define MAXDATASIZE 100 /* max number of bytes we can get at once */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int main(int argc, char *argv[])&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int sockfd, numbytes; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char buf[MAXDATASIZE];&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct hostent *he;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct sockaddr_in their_addr; /* connector's address information */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (argc != 2) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fprintf(stderr,&quot;usage: client hostname\n&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((he=gethostbyname(argv[1])) == NULL) { &amp;nbsp;/* get the host info */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; herror(&quot;gethostbyname&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; perror(&quot;socket&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; their_addr.sin_family = AF_INET; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* host byte order */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; their_addr.sin_port = htons(PORT); &amp;nbsp; &amp;nbsp;/* short, network byte order */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; their_addr.sin_addr = *((struct in_addr *)he-&amp;gt;h_addr);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bzero(&amp;amp;(their_addr.sin_zero), 8); &amp;nbsp; &amp;nbsp; /* zero the rest of the struct */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (connect(sockfd, (struct sockaddr *)&amp;amp;their_addr, \&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sizeof(struct sockaddr)) == -1) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; perror(&quot;connect&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; perror(&quot;recv&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; buf[numbytes] = '\0';&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&quot;Received: %s&quot;,buf);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; close(sockfd);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 클라이언트를 작동하기에 앞서서 서버를 작동시켜놓지 않았다면&amp;nbsp;&lt;/p&gt;&lt;p&gt;connect()함수는 &quot;Connection refused&quot;를 돌려주게 될것이다. 쓸만하군!&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;데이터그램 소켓&lt;/p&gt;&lt;p&gt;이에 관해서는 그다지 얘기할 것이 많지 않다. 따라서 그냥 두개의 프로그램을&amp;nbsp;&lt;/p&gt;&lt;p&gt;보여 주겠다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;listener는 호스트에 앉아서 4950포트에 들어오는 데이터 패킷을 기다린다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;talker는 지정된 호스트의 그 포트로 뭐든지 간에 사용자가 입력한 데이터를&amp;nbsp;&lt;/p&gt;&lt;p&gt;보낸다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;listener.c&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;stdio.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;stdlib.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;errno.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;string.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/types.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;netinet/in.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/socket.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/wait.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #define MYPORT 4950 &amp;nbsp; &amp;nbsp;/* the port users will be connecting to */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #define MAXBUFLEN 100&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; main()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int sockfd;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct sockaddr_in my_addr; &amp;nbsp; &amp;nbsp;/* my address information */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct sockaddr_in their_addr; /* connector's address information */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int addr_len, numbytes;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; char buf[MAXBUFLEN];&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; perror(&quot;socket&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_family = AF_INET; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* host byte order */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_port = htons(MYPORT); &amp;nbsp; &amp;nbsp; /* short, network byte order */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bzero(&amp;amp;(my_addr.sin_zero), 8); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* zero the rest of the struct */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (bind(sockfd, (struct sockaddr *)&amp;amp;my_addr, sizeof(struct sockaddr)) \&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;== -1) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; perror(&quot;bind&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; addr_len = sizeof(struct sockaddr);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((numbytes=recvfrom(sockfd, buf, MAXBUFLEN, 0, \&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(struct sockaddr *)&amp;amp;their_addr, &amp;amp;addr_len)) == -1) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; perror(&quot;recvfrom&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&quot;got packet from %s\n&quot;,inet_ntoa(their_addr.sin_addr));&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&quot;packet is %d bytes long\n&quot;,numbytes);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; buf[numbytes] = '\0';&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&quot;packet contains \&quot;%s\&quot;\n&quot;,buf);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; close(sockfd);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;결국 socket()를 호출할 때 SOCK_DGRAM을 사용하게 된것을 주의하고,&amp;nbsp;&lt;/p&gt;&lt;p&gt;listen()이나 accept()를 사용하지 않은것도 주의해 봐야 한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;이 코드가 바로 비연결 데이터그램 소켓의 자랑스러운 사용예인 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;talker.c&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;stdio.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;stdlib.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;errno.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;string.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/types.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;netinet/in.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;netdb.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/socket.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;sys/wait.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #define MYPORT 4950 &amp;nbsp; &amp;nbsp;/* the port users will be connecting to */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; int main(int argc, char *argv[])&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int sockfd;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct sockaddr_in their_addr; /* connector's address information */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; struct hostent *he;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int numbytes;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (argc != 3) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fprintf(stderr,&quot;usage: talker hostname message\n&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((he=gethostbyname(argv[1])) == NULL) { &amp;nbsp;/* get the host info */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; herror(&quot;gethostbyname&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; perror(&quot;socket&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; their_addr.sin_family = AF_INET; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* host byte order */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; their_addr.sin_port = htons(MYPORT); &amp;nbsp;/* short, network byte order */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; their_addr.sin_addr = *((struct in_addr *)he-&amp;gt;h_addr);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bzero(&amp;amp;(their_addr.sin_zero), 8); &amp;nbsp; &amp;nbsp; /* zero the rest of the struct */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((numbytes=sendto(sockfd, argv[2], strlen(argv[2]), 0, \&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(struct sockaddr *)&amp;amp;their_addr, sizeof(struct sockaddr))) == -1) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; perror(&quot;sendto&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(1);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; printf(&quot;sent %d bytes to %s\n&quot;,numbytes,inet_ntoa(their_addr.sin_addr));&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; close(sockfd);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이것이 다다. listener를 한 호스트에서 실행 시키고 다른 곳에서 talker를&amp;nbsp;&lt;/p&gt;&lt;p&gt;실행시킨다. 핵가족시대에 어울리는 가족용 오락이 될수도...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;앞에서도 얘기했었지만 한가지 작은 내용을 더 말해야 할것 같다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;만약 talker에서 connect()를 호출해서 연결을 했다면 그 다음부터는 sendto(),&amp;nbsp;&lt;/p&gt;&lt;p&gt;recvfrom()이 아니라 그냥 send().recv()를 사용해도 된다는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;전달되어야 하는 호스트의 주소는 connect()에 지정된 주소가 사용되게 된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;블로킹&lt;/p&gt;&lt;p&gt;블로킹. 아마 들어봤겠지. 그런데 도대체 그게 뭘까? 사실 &quot;잠들다&quot;의&amp;nbsp;&lt;/p&gt;&lt;p&gt;기술용어에 불과한 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;아마도 listener를 실행시키면서 눈치를 챘겠지만 그 프로그램은 그저 앉아서&amp;nbsp;&lt;/p&gt;&lt;p&gt;데이터 패킷이 올때까지 기다리는 것이다. 잠자면서.. recvfrom()을 호출했는데&amp;nbsp;&lt;/p&gt;&lt;p&gt;데이터가 들어온 것이 없다면? 바로 뭔가 데이터가 들어올 때까지 블로킹이 되는&amp;nbsp;&lt;/p&gt;&lt;p&gt;것이다(그냥 거기서 자고 있는 것이다.).&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;많은 함수들이 블로킹이 된다. accept()는 블록이 된다. recv*()종류들이 모두&amp;nbsp;&lt;/p&gt;&lt;p&gt;블록이 된다. 그들이 이렇게 할 수 있는 이유는 그렇게 할 수 있도록 허락을&amp;nbsp;&lt;/p&gt;&lt;p&gt;받았기 때문이다. 처음에 socket()으로 소켓이 만들어질때 커널이 블록 가능하도록&lt;/p&gt;&lt;p&gt;&amp;nbsp;세팅을 했기 때문이다. 만일 블록할수 없도록 세팅하려면 fcntl()을 사용한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;unistd.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; #include &amp;lt;fcntl.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; sockfd = socket(AF_INET, SOCK_STREAM, 0);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; fcntl(sockfd, F_SETFL, O_NONBLOCK);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;소켓을 블록할수 없도록 세팅함으로써 정보를 추출하는 데에 효과적으로&amp;nbsp;&lt;/p&gt;&lt;p&gt;socket을 이용할 수 있다. 만일 데이터가 접수되지 않은 소켓에서 데이터를&amp;nbsp;&lt;/p&gt;&lt;p&gt;읽으려고 시도한다면 -1을 결과로 돌려주고 errno를 EWOULDBLOCK 으로 세팅하게&amp;nbsp;&lt;/p&gt;&lt;p&gt;된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;일반적으로는 이런 식으로 정보를 뽑아 내는 것은 별로 좋은 방식은 아니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;만일 들어오는 데이터를 감시하기 위하여 이런 방식으로 바쁘게 데이터를 찾는&amp;nbsp;&lt;/p&gt;&lt;p&gt;루틴을 만든다면 이는 CPU 시간을 소모하게 되는 것이다. 구식이다. 보다 멋진&amp;nbsp;&lt;/p&gt;&lt;p&gt;방법은 다음절에 나오는 select()를 사용하여 데이터를 기다리는 식이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;select() ; 동기화된 중복 입출력. 대단하군!&lt;/p&gt;&lt;p&gt;이건 뭔가 좀 이상한 함수이다. 그러나 상당히 유용하므로 잘 읽어보기 바란다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;다음 상황을 가정해 보자. 지금 서버를 돌리고 있으며 이미 연결된 소켓에서&amp;nbsp;&lt;/p&gt;&lt;p&gt;데이터가 들어오는 것을 기다리고 있다고 하자.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;문제없지, 그냥 accept()하고 recv()몇개면 될텐데.. 서둘지 말지어다,&amp;nbsp;&lt;/p&gt;&lt;p&gt;친구. 만일 accept()에서 블로킹이 된다면? 동시에 어떻게 recv()를 쓸 것인가?&amp;nbsp;&lt;/p&gt;&lt;p&gt;블로킹 못하게 세팅한다고? CPU시간을 낭비하지 말라니까. 그러면 어떻게?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;더이상 떠들지 말고 다음을 보여주겠다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;#include &amp;lt;sys/time.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;#include &amp;lt;sys/types.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;#include &amp;lt;unistd.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int select(int numfds, fd_set *readfds, fd_set *writefds,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fd_set *exceptfds, struct timeval *timeout);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 함수는 화일 기술자의 &quot;집합&quot;, 특별히 readfds,writefds,exceptfds등을&amp;nbsp;&lt;/p&gt;&lt;p&gt;관리한다. 만일 일반적인 입력이나 소켓 기술자로부터 읽어 들일수 있는가를&amp;nbsp;&lt;/p&gt;&lt;p&gt;확인하려면 단지 화일 기술자 0과 sockfd를 readfds에 더해주기만 하면 된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;numfds는 가장 높은 파일 기술자에다가 1을 더해서 지정해야 하며 이번 예제에서&lt;/p&gt;&lt;p&gt;는 정규 입력의 0보다 확실히 크게 하기 위해서 sockfd+1 을 지정해야 한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;select()의 결과값이 나올때 readfs는 선택한 파일 기술자 중에 어떤 것이 읽기&amp;nbsp;&lt;/p&gt;&lt;p&gt;가능한가를 반영할 수 있도록 수정되며 FD_ISSET() 매크로를 이용하여 체크할 수&amp;nbsp;&lt;/p&gt;&lt;p&gt;있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;너무 멀리 나가기 전에 이 &quot;집합&quot;들을 어떻게 관리하는 가에 대해서 얘기를 해야&amp;nbsp;&lt;/p&gt;&lt;p&gt;할것 같다. 각각의 &quot;집합&quot;은 fd_set형이며 다음의 매크로들로 이를 제어할 수&amp;nbsp;&lt;/p&gt;&lt;p&gt;있다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;FD_ZERO(fd_set *set) - 파일기술자 집합을 소거한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;FD_SET(int fd, fd_set *set) - fd 를 set에 더해준다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;FD_CLR(int fd, fd_set *set) - fd 를 set에서 빼준다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;FD_ISSET(int fd, fd_set *set) - fd가 set안에 있는지 확인한다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;끝으로 이 수상한 struct timeval은 또 무엇인가? 아마도 누군가가 어떤 데이터를&lt;/p&gt;&lt;p&gt;&amp;nbsp;보내는 것을 무한정 기다리기를 원치는 않을 것이다. 특정시간마다 아무일도 안&amp;nbsp;&lt;/p&gt;&lt;p&gt;벌어지더라도 &quot;현재 진행중...&quot;이라는 메시지를 터미널에 출력시키기라도 원할&amp;nbsp;&lt;/p&gt;&lt;p&gt;것이다. 이 구조체는 그 시간간격을 정의하기 위해서 사용되는 것이다. 이&amp;nbsp;&lt;/p&gt;&lt;p&gt;시간이 초과되고 그 때까지 select()가 아무런 변화를 감지하지 못한 경우라면&amp;nbsp;&lt;/p&gt;&lt;p&gt;결과를 돌려주고 다음 작업을 진행 할수 있도록 해준다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;struct timeval의 구조는 다음과 같다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; struct timeval {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int tv_sec; &amp;nbsp; &amp;nbsp; /* seconds */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int tv_usec; &amp;nbsp; &amp;nbsp;/* microseconds */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; };&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;기다릴 시간의 초를 지정하려면 그냥 tv_sec에 지정하면 된다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;tv_usec에는 마이크로 초를 지정한다. 밀리초가 아니고 마이크로초이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;마이크로초는 백만분의 일초이다. 그런데 왜 usec인가? u는 그리스 문자의&amp;nbsp;&lt;/p&gt;&lt;p&gt;Mu를 닮았고 이는 마이크로를 의미하는데 사용된다. 함수가 끝날때 timeout에&amp;nbsp;&lt;/p&gt;&lt;p&gt;남은 시간이 기록될수도 있으며 이 내용은 유닉스마다 다르기는 하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;와우~ 마이크로 초 단위의 타이머를 가지게 되었군! 만일 timeval에 필드들을&amp;nbsp;&lt;/p&gt;&lt;p&gt;0으로 채우면 select()는 즉시 결과를 돌려주며 현재 set들의 내용을 즉시&amp;nbsp;&lt;/p&gt;&lt;p&gt;알려주게 된다. timeout을 NULL로 세팅하면 결코 끝나지 않고 계속 파일&amp;nbsp;&lt;/p&gt;&lt;p&gt;기술자가 준비되는 것을 기다리게 되며 끝으로 특정한 set에 변화에 관심이&amp;nbsp;&lt;/p&gt;&lt;p&gt;없다면 그 항목을 NULL로 지정하면 된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다음은 정규 입력에 무언가 나타날때까지 2.5초를 기다리는 코드이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;#include &amp;lt;sys/time.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;#include &amp;lt;sys/types.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;#include &amp;lt;unistd.h&amp;gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;#define STDIN 0 &amp;nbsp;/* file descriptor for standard input */&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;main()&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;struct timeval tv;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fd_set readfds;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tv.tv_sec = 2;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tv.tv_usec = 500000;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FD_ZERO(&amp;amp;readfds);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FD_SET(STDIN, &amp;amp;readfds);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* don't care about writefds and exceptfds: */&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;select(STDIN+1, &amp;amp;readfds, NULL, NULL, &amp;amp;tv);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (FD_ISSET(STDIN, &amp;amp;readfds))&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;printf(&quot;A key was pressed!\n&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;else&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;printf(&quot;Timed out.\n&quot;);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;만일 한줄씩 버퍼링하는 터미널이라면 엔터키를 치지 않는 이상은 그냥&amp;nbsp;&lt;/p&gt;&lt;p&gt;타임아웃에 걸릴것이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제 아마도 이 훌륭한 방법을 데이터그램 소켓에서 데이터를 기다리는 데에&amp;nbsp;&lt;/p&gt;&lt;p&gt;사용할수 있으리라고 생각할 것이다. 맞다. 그럴 수도 있다. 어떤 유닉스에서는&amp;nbsp;&lt;/p&gt;&lt;p&gt;이 방법이 되지만 안되는 것도 있다. 하고자 하는 내용에 대해서는 아마도&amp;nbsp;&lt;/p&gt;&lt;p&gt;맨페이지를 참조해야 할 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;select()에 관한 마지막 얘기는 listen()이 된 소켓이 있다면 이 방법을&amp;nbsp;&lt;/p&gt;&lt;p&gt;이용하여 소켓 기술자를 readfds에 첨가하는 방식으로 새로운 연결이 있었는가를&amp;nbsp;&lt;/p&gt;&lt;p&gt;확인할 수도 있다는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이것이 select()에 대한 짧은 검토였다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;참고사항&lt;/p&gt;&lt;p&gt;여기까지 와서는 아마 좀더 새로운 다른 것은 없는가 할것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;또 어디서 다른 무언가를 더 찾을수 있는가를 알고자 할것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;초보자라면 다음의 맨페이지를 참고하는 것도 좋다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;socket()&amp;nbsp;&lt;/p&gt;&lt;p&gt;bind()&amp;nbsp;&lt;/p&gt;&lt;p&gt;connect()&amp;nbsp;&lt;/p&gt;&lt;p&gt;listen()&amp;nbsp;&lt;/p&gt;&lt;p&gt;accept()&amp;nbsp;&lt;/p&gt;&lt;p&gt;send()&amp;nbsp;&lt;/p&gt;&lt;p&gt;recv()&amp;nbsp;&lt;/p&gt;&lt;p&gt;sendto()&amp;nbsp;&lt;/p&gt;&lt;p&gt;recvfrom()&amp;nbsp;&lt;/p&gt;&lt;p&gt;close()&amp;nbsp;&lt;/p&gt;&lt;p&gt;shutdown()&amp;nbsp;&lt;/p&gt;&lt;p&gt;getpeername()&amp;nbsp;&lt;/p&gt;&lt;p&gt;getsockname()&amp;nbsp;&lt;/p&gt;&lt;p&gt;gethostbyname()&amp;nbsp;&lt;/p&gt;&lt;p&gt;gethostbyaddr()&amp;nbsp;&lt;/p&gt;&lt;p&gt;getprotobyname()&amp;nbsp;&lt;/p&gt;&lt;p&gt;fcntl()&amp;nbsp;&lt;/p&gt;&lt;p&gt;select()&amp;nbsp;&lt;/p&gt;&lt;p&gt;perror()&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다음 책들도 도움이 될것이다. books:&amp;nbsp;&lt;/p&gt;&lt;p&gt;Internetworking with TCP/IP, volumes I-III&lt;/p&gt;&lt;p&gt;by Douglas E. Comer and David L. Stevens.&lt;/p&gt;&lt;p&gt;Published by Prentice Hall.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Second edition ISBNs: 0-13-468505-9, 0-13-472242-6, 0-13-474222-2.&lt;/p&gt;&lt;p&gt;There is a third edition of this set which covers IPv6 and IP over ATM.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Using C on the UNIX System&lt;/p&gt;&lt;p&gt;by David A. Curry.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Published by O'Reilly &amp;amp; Associates, Inc.&amp;nbsp;&lt;/p&gt;&lt;p&gt;ISBN 0-937175-23-4.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;TCP/IP Network Administration&lt;/p&gt;&lt;p&gt;by Craig Hunt.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Published by O'Reilly &amp;amp; Associates, Inc.&amp;nbsp;&lt;/p&gt;&lt;p&gt;ISBN 0-937175-82-X.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;TCP/IP Illustrated, volumes 1-3&lt;/p&gt;&lt;p&gt;by W. Richard Stevens and Gary R. Wright.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Published by Addison Wesley.&amp;nbsp;&lt;/p&gt;&lt;p&gt;ISBNs: 0-201-63346-9, 0-201-63354-X, 0-201-63495-3.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Unix Network Programming&lt;/p&gt;&lt;p&gt;by W. Richard Stevens.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Published by Prentice Hall.&amp;nbsp;&lt;/p&gt;&lt;p&gt;ISBN 0-13-949876-1.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;웹상에는 다음과 같은 것들이 있을것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;BSD Sockets: A Quick And Dirty Primer (http://www.cs.umn.edu/~bentlema/unix/--has other great Unix system programming info, too!)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Client-Server Computing (http://pandonia.canberra.edu.au/ClientServer/socket.html)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Intro to TCP/IP (gopher) (gopher://gopher-chem.ucdavis.edu/11/Index/Internet_aw/Intro_the_Internet/intro.to.ip/)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Internet Protocol Frequently Asked Questions (France) (http://web.cnam.fr/Network/TCP-IP/)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The Unix Socket FAQ (http://www.ibrado.com/sock-faq/)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;끔찍하지만..RFC도 봐야 하겠다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;RFC-768 -- The User Datagram Protocol (UDP) (ftp://nic.ddn.mil/rfc/rfc768.txt)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;RFC-791 -- The Internet Protocol (IP) (ftp://nic.ddn.mil/rfc/rfc791.txt)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;RFC-793 -- The Transmission Control Protocol (TCP) (ftp://nic.ddn.mil/rfc/rfc793.txt)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;RFC-854 -- The Telnet Protocol (ftp://nic.ddn.mil/rfc/rfc854.txt)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;RFC-951 -- The Bootstrap Protocol (BOOTP) (ftp://nic.ddn.mil/rfc/rfc951.txt)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;RFC-1350 -- The Trivial File Transfer Protocol (TFTP) (ftp://nic.ddn.mil/rfc/rfc1350.txt)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;주의사항 및 연락처&lt;/p&gt;&lt;p&gt;이상이 전부이며 문서상에서 크게 틀린 곳이 없기만을 바랄 뿐이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;하지만 실수는 항상 있는 법이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;만약 실수가 있다면 부정확한 정보를 주어 헷갈리게 만듯것에 대하여 사과하지만&amp;nbsp;&lt;/p&gt;&lt;p&gt;사실상 나한테 책임을 물을수는 없다. 이 얘기는 법적인 경고이며 사실상 이 모든&lt;/p&gt;&lt;p&gt;&amp;nbsp;글들이 몽땅 거짓말 일수도 있는 것이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그래도 설마 그렇지는 않을 것이다. 사실 난 이 모든것들 때문에 상당히 많은&amp;nbsp;&lt;/p&gt;&lt;p&gt;시간을 소모했고 윈도우용 TCP/IP네트워크 유틸리티(예를 들어 텔넷등)을&amp;nbsp;&lt;/p&gt;&lt;p&gt;방학숙제로 했었다. 난 소켓의 신이 아니라 그냥 보통 사람일 뿐이다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그건 그렇고 생산적인 (혹은 파괴적이라도) 비평이 있는 분은&amp;nbsp;&lt;/p&gt;&lt;p&gt;beej@ecst.csuchico.edu 앞으로 메일을 주기 바란다. 참고하여 고쳐나가도록&amp;nbsp;&lt;/p&gt;&lt;p&gt;노력을 해 보겠다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;왜 이 일을 했는가 궁금하다면, 돈벌려고 했다. 하하~ 사실은 아니고 많은&amp;nbsp;&lt;/p&gt;&lt;p&gt;사람들이 소켓에 관련된 질문을 해 대는 바람에 그들에게 이 내용을 웹에&amp;nbsp;&lt;/p&gt;&lt;p&gt;올리려고 생각중이라고 말했더니 &quot;바로 그거야~&quot;라고들 해서 썼다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;아무리 고생해서 얻은 정보라도 만일 다른 사람과 공유하지 않는다면 쓰레기일&amp;nbsp;&lt;/p&gt;&lt;p&gt;뿐이라고 생각한다. WWW는 바로 적당한 수단이 된 것 뿐이다. 다른 사람도 이런&amp;nbsp;&lt;/p&gt;&lt;p&gt;정보의 제공이 가능하다면 이렇게 해주길 바란다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;끝났다. 프로그램이나 짜러가자. ;-)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;번역한 사람의 말: 우연히 이 글을 발견하게 되어 번역을 하고 보니 나름대로&amp;nbsp;&lt;/p&gt;&lt;p&gt;가치가 있어 보여서 홈페이지에 올려 놓았습니다. 번역상의 실수가 있었다면&amp;nbsp;&lt;/p&gt;&lt;p&gt;사과드리며 지적해 주신다면 고쳐 나가겠습니다. 좋은 프로그램을 만드는데에 이&amp;nbsp;&lt;/p&gt;&lt;p&gt;글이 작으나마 도움이 되길 바랍니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;--------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;Copyright ⓒ 1995, 1996 by Brian &quot;Beej&quot; Hall.&amp;nbsp;&lt;/p&gt;&lt;p&gt;This guide may be reprinted in any medium provided that its content is not&amp;nbsp;&lt;/p&gt;&lt;p&gt;altered, it is presented in its entirety, and this copyright notice remains&amp;nbsp;&lt;/p&gt;&lt;p&gt;intact. Contact beej@ecst.csuchico.edu for more information.&amp;nbsp;&lt;/p&gt;&lt;p&gt;좋은 내용의 글을작성하고 한글판 번역을 허락해준 원작자에게 감사하며&amp;nbsp;&lt;/p&gt;&lt;p&gt;번역자로서의 모든권리는 읽어주신 분들께 드리겠습니다. 번역상의 실수나&amp;nbsp;&lt;/p&gt;&lt;p&gt;생산적인 지적은 tempter@fourthline.com 으로 보내주시면 되겠습니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;감사합니다.&lt;/p&gt;</description>
      <category>서버</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/332</guid>
      <comments>https://eltgroup.tistory.com/332#entry332comment</comments>
      <pubDate>Sat, 2 Jun 2018 07:38:15 +0900</pubDate>
    </item>
    <item>
      <title>IOCP를 사용한 머그게임 서버만들기</title>
      <link>https://eltgroup.tistory.com/331</link>
      <description>&lt;p&gt;십년전 공부할때 참고한자료입니다. 제가 쓴글이 아닙니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p &gt;&lt;b&gt;&lt;span  style=&quot;font-size:14.0pt;&quot;&gt;IOCP&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-size:14.0pt;&quot;&gt;를 사용한 머그게임 서버만들기&lt;span &gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:18.0pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1;
tab-stops:list 18.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;b&gt;&lt;span  style=&quot;font-size:12.0pt;mso-bidi-font-family:바탕&quot;&gt;1.&lt;span style=&quot;font-variant-numeric: normal; font-weight: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b&gt;&lt;span style=&quot;font-size:12.0pt&quot;&gt;프로토콜이란&lt;span &gt;?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p &gt;프로토콜이란 한 컴퓨터와 다른 컴퓨터가 통신하는 방식을 정의한 것이다&lt;span &gt;. &lt;/span&gt;즉&lt;span &gt;, &lt;/span&gt;원거리에 있는 두 사람이 서로 교신을 할 때&lt;span &gt;, &lt;/span&gt;빨간 깃발을 들으면
누군가 공격해온다는 의미이고&lt;span &gt;, &lt;/span&gt;파란색 깃발을 들면 비가 온다는 의미라고 정하는 것 이것이 프로토콜이다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;일반적으로 머그게임 또는 대부분의 인터넷을 경유하는 통신에서 프로토콜을 만들 때&lt;span &gt; TCP/IP &lt;/span&gt;기반에서 프로토콜을 작성한다고 한다&lt;span &gt;. &lt;/span&gt;이는&lt;span &gt; TCP/IP&lt;/span&gt;의 프로토콜을 사용하여 자신만의 프로토콜을 만드는 것을 의미한다&lt;span &gt;. &lt;/span&gt;어쨌든
프로토콜에 대한 자세한 내용은 다른 서적을 참조하기 바란다&lt;span &gt;. &lt;/span&gt;여기서&lt;span &gt;,
&lt;/span&gt;중요한 것은 네트워크를 통해서 컴퓨터끼리 통신을 하기 위해서는 프로토콜을 정의 해야 한다는 것만 알면 충분하다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;어떤 의미를 가진 것을 이제부터 패킷이라고 부르자&lt;span &gt;. &lt;/span&gt;즉 하나의 프로토콜을
여러 개의 패킷으로 이루어졌다&lt;span &gt;. &lt;/span&gt;누군가 공격을 해 올 때는 빨간 깃발을 들어라&lt;span &gt;. &lt;/span&gt;여기서 빨간 깃발이 패킷이 되는 것이다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;이제 머그게임에서 나올만한 상황 중에 하나인 이동에 대한 패킷을 만들어보자&lt;span &gt;. &lt;/span&gt;이동
패킷이 어떤 정보를 가지고 있을 것인가는 프로그래머의 마음이다&lt;span &gt;. &lt;/span&gt;필자는 이 패킷이 어떤 패킷인지에 대한
정보&lt;span &gt;( Command )&lt;/span&gt;와 이동위치&lt;span &gt;(X, Y)&lt;/span&gt;의 정보를 가지는
패킷을 만들도록 하겠다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;BYTE[4]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Command&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;BYTE[4]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; X
&lt;/span&gt;좌표&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;BYTE[4]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y
&lt;/span&gt;좌표&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;위와 같이 이동 패킷이 만들어졌다&lt;span &gt;. &lt;/span&gt;각각의 정보가&lt;span &gt; 4&lt;/span&gt;바이트로 이루어진&lt;span &gt; 12&lt;/span&gt;바이트의 패킷이 만들어졌다&lt;span &gt;. &lt;/span&gt;이와 같이 머그게임의 서버와 클라이언트가 서로 전달해야 할 모든 메시지에 대해 패킷을 만드는 것이 프로토콜
작성이다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;한가지 더 알아야 하는 것은 네트워크에서는 실제로 자신이 원하는 만큼 쓰고 원하는 만큼 읽을 수 없다는 것이다&lt;span &gt;. &lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;send( socket, packet, size, 0 );&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;recv( socket, packet, size, 0 );&lt;/span&gt;&lt;/p&gt;&lt;p &gt;다음과 같은 두 코드를 보고 프로그래머는 항상&lt;span &gt; packet&lt;/span&gt;버퍼에 있는
내용을&lt;span &gt; size&lt;/span&gt;만큼 쓰고 읽을 수 있다고 생각하면 안 된다&lt;span &gt;. &lt;/span&gt;이는
네트워크 상에서 발생하는 여러 가지 문제에 의해서 얼마를 읽고 쓸 수 있는지 결정이 된다&lt;span &gt;.( &lt;/span&gt;자세한
내용은 관련서적 참조&lt;span &gt; ) &lt;/span&gt;따라서&lt;span &gt;, &lt;/span&gt;프로그래머는 항상 원하는
만큼의 데이터를 읽고 썼는지에 대해 확인을 해야 한다&lt;span &gt;. &lt;/span&gt;어떻게 원하는 만큼의 데이터를 읽고 쓸 수 있는지는
뒤에서 설명하겠다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;위와 같은 이유 때문에 우리가 만드는 패킷에는 길이에 대한 정보가 추가 되어야 한다&lt;span &gt;. &lt;/span&gt;즉&lt;span &gt;, &lt;/span&gt;위에서 만든 이동 패킷은 다음과 같이 변경되어야 한다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;BYTE[2]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;패킷의
길이&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;BYTE[4]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Command&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;BYTE[4]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; X
&lt;/span&gt;좌표&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;BYTE[4]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Y
&lt;/span&gt;좌표&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;2&lt;/span&gt;바이트의 패킷 길이가 추가 되었다&lt;span &gt;.
&lt;/span&gt;필자는 패킷이 아무리 길어도&lt;span &gt; 65535&lt;/span&gt;바이트를 넘지 않을 것이라고 생각해서 패킷의 길이를&lt;span &gt; 2&lt;/span&gt;바이트로 나타내었다&lt;span &gt;. &lt;/span&gt;그러나 자신은&lt;span &gt; 4&lt;/span&gt;바이트 또는&lt;span &gt; 1&lt;/span&gt;바이트로 만들겠다고 한다면 그렇게 해도 상관없다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;이제 다음에서는 위와 같이 만든 패킷들을 어떻게 쓰고 읽는 지에 대해서 알아보도록 하겠다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:18.0pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1;
tab-stops:list 18.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;b&gt;&lt;span  style=&quot;font-size:12.0pt;mso-bidi-font-family:바탕&quot;&gt;2.&lt;span style=&quot;font-variant-numeric: normal; font-weight: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b&gt;&lt;span style=&quot;font-size:12.0pt&quot;&gt;패킷 쓰기와 읽기&lt;span &gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p &gt;먼저&lt;span &gt;, &lt;/span&gt;패킷을 쓰는 것에 대해서 알아보도록 하자&lt;span &gt;. &lt;/span&gt;사실 쓰는 것에 대해서는 별로 걱정할 것이 없다&lt;span &gt;. &lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;send( socket, packet, size, 0 );&lt;/span&gt;&lt;/p&gt;&lt;p &gt;위와 같이 우리가 아는 방식대로 쓰기만 하면 된다&lt;span &gt;. &lt;/span&gt;단 &lt;span  style=&quot;font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:
바탕&quot;&gt;“&lt;/span&gt;&lt;span &gt;IOCP&lt;/span&gt;사용하기&lt;span  style=&quot;font-family:
&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:바탕&quot;&gt;”&lt;/span&gt;나 &lt;span  style=&quot;font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:바탕&quot;&gt;“&lt;/span&gt;&lt;span &gt;IOCP&lt;/span&gt;로 채팅만들기&lt;span  style=&quot;font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;
mso-ascii-font-family:바탕&quot;&gt;”&lt;/span&gt;에서 말했던 것과 같이 중첩입출력의 경우&lt;span &gt;
packet&lt;/span&gt;의 내용은 작업이 끝나기 전에는 변경되면 안 된다는 사실만 기억하기 바란다&lt;span &gt;. &lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;패킷을 읽는 것은 쓰는 것과는 다르게 약간의 처리를 해주어야 하는데 이는&lt;span &gt; 1&lt;/span&gt;장에서
패킷에 패킷 길이를 추가한 이유이기도 하다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;table Table&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; style=&quot;border-collapse:collapse;border:none;mso-border-alt:solid windowtext .5pt;
 mso-padding-alt:0cm 4.95pt 0cm 4.95pt;mso-border-insideh:.5pt solid windowtext;
 mso-border-insidev:.5pt solid windowtext&quot;&gt;
 &lt;tbody&gt;&lt;tr&gt;
  &lt;td width=&quot;580&quot; valign=&quot;top&quot; style=&quot;width:435.1pt;border:solid windowtext 1.0pt;
  mso-border-alt:solid windowtext .5pt;padding:0cm 4.95pt 0cm 4.95pt&quot;&gt;
  &lt;p &gt;&lt;span &gt;int nRead;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;while ((nRead = recv(hSocket, g_szPacket,
  PACKET_BUFFER - g_nPI, 0)) &amp;gt; 0) &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_nRI
  += nRead;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while
  (g_nPI &amp;lt; g_nRI) &lt;/span&gt;&lt;/p&gt;
  &lt;p  style=&quot;text-indent:40.0pt&quot;&gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if
  (g_mode == PACKET_LENGTH) &lt;/span&gt;&lt;/p&gt;
  &lt;p  style=&quot;margin-left:40.0pt;text-indent:40.0pt&quot;&gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if
  (g_nPI + 2 &amp;lt;= g_nRI) &lt;/span&gt;&lt;/p&gt;
  &lt;p  style=&quot;margin-left:40.0pt;text-indent:40.0pt&quot;&gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_sPacketLen = g_szPacket[0] +
  (g_szPacket[1] &amp;lt;&amp;lt; 8) - 2;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_nPI
  += 2;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_mode
  = PACKET_BODY;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else
  &lt;/span&gt;&lt;/p&gt;
  &lt;p  style=&quot;text-indent:40.0pt&quot;&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else
  if (g_mode == PACKET_BODY) &lt;/span&gt;&lt;/p&gt;
  &lt;p  style=&quot;text-indent:40.0pt&quot;&gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (g_nPI + g_sPacketLen &amp;lt;=
  g_nRI) &lt;/span&gt;&lt;/p&gt;
  &lt;p  style=&quot;margin-left:40.0pt;text-indent:40.0pt&quot;&gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if
  (g_szPacket[g_nPI] &amp;gt;= S_MAX) &lt;/span&gt;&lt;/p&gt;
  &lt;p  style=&quot;margin-left:80.0pt;text-indent:40.0pt&quot;&gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else
  &lt;/span&gt;&lt;/p&gt;
  &lt;p  style=&quot;margin-left:80.0pt;text-indent:40.0pt&quot;&gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Packet(g_szPacket + g_nPI);&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_nPI
  += g_sPacketLen;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_mode
  = PACKET_LENGTH;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;if( g_nPI == g_nRI )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p  style=&quot;text-indent:40.0pt&quot;&gt;&lt;span &gt;g_nPI = g_nRI
  = 0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;else if (g_nPI &amp;gt; 0) &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; memmove(g_szPacket,
  g_szPacket + g_nPI, g_nRI - g_nPI);&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_nRI
  -= g_nPI;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p &gt;표&lt;span &gt; 1 &lt;/span&gt;프로그램세계&lt;span &gt; 12&lt;/span&gt;월호
특집기사중&lt;span &gt; (TCP/IP&lt;/span&gt;기반의 멀티플레이어 온라인 게임제작 관련화일에서 발취&lt;span &gt;) ( &lt;/span&gt;이에 대한 설명은 프로그램세계&lt;span &gt; 12&lt;/span&gt;월호에 있을거라고 생각합니다&lt;span &gt;. &lt;/span&gt;이해 안되시면 질문 주세요&lt;span &gt; )&lt;/span&gt;&lt;/p&gt;&lt;p &gt;위의 소스는 하나의 패킷을 정확히 읽을 수 있는 가장 좋은 방법이라고 생각하는 소스이다&lt;span &gt;. &lt;/span&gt;우리가 만들 머그 서버에서도 위와 같은 알고리즘으로 패킷을 읽어 오도록 하겠다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:18.0pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1;
tab-stops:list 18.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;b&gt;&lt;span  style=&quot;font-size:12.0pt;mso-bidi-font-family:바탕&quot;&gt;3.&lt;span style=&quot;font-variant-numeric: normal; font-weight: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b&gt;&lt;span style=&quot;font-size:12.0pt&quot;&gt;이 모든 것을 종합하여 머그게임 서버를 작성하자&lt;span &gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p &gt;먼저 우리가 머그게임 서버를 만들기 위해서 필요한 것들을 생각해보도록 하자&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:20.0pt;text-indent:-20.0pt;mso-list:l1 level1 lfo2;
tab-stops:list 20.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;span  style=&quot;font-family:
Wingdings;mso-fareast-font-family:Wingdings;mso-bidi-font-family:Wingdings;
mso-bidi-font-weight:bold&quot;&gt;l&lt;span style=&quot;font-variant-numeric: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;b&gt;&lt;span &gt;ICOP &lt;/span&gt;핸들&lt;span &gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p &gt;&lt;span  style=&quot;font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;
mso-ascii-font-family:바탕&quot;&gt;“&lt;/span&gt;&lt;span &gt;IOCP&lt;/span&gt;채팅서버만들기&lt;span  style=&quot;font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:
바탕&quot;&gt;”&lt;/span&gt;&lt;span &gt; &lt;/span&gt;참조&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:20.0pt;text-indent:-20.0pt;mso-list:l1 level1 lfo2;
tab-stops:list 20.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;span  style=&quot;font-family:
Wingdings;mso-fareast-font-family:Wingdings;mso-bidi-font-family:Wingdings&quot;&gt;l&lt;span style=&quot;font-variant-numeric: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;b&gt;확장&lt;span &gt; OVERLAPPED&lt;/span&gt;구조체 또는 클래스&lt;/b&gt;&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span  style=&quot;font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;
mso-ascii-font-family:바탕&quot;&gt;“&lt;/span&gt;&lt;span &gt;IOCP&lt;/span&gt;채팅서버만들기&lt;span  style=&quot;font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:
바탕&quot;&gt;”&lt;/span&gt;&lt;span &gt; &lt;/span&gt;참조&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:20.0pt;text-indent:-20.0pt;mso-list:l1 level1 lfo2;
tab-stops:list 20.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;span  style=&quot;font-family:
Wingdings;mso-fareast-font-family:Wingdings;mso-bidi-font-family:Wingdings&quot;&gt;l&lt;span style=&quot;font-variant-numeric: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;b&gt;클라이언트
정보를 저장할 공간&lt;/b&gt;&lt;span &gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span  style=&quot;font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;
mso-ascii-font-family:바탕&quot;&gt;“&lt;/span&gt;&lt;span &gt;ICOP&lt;/span&gt;채팅서버만들기&lt;span  style=&quot;font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:
바탕&quot;&gt;”&lt;/span&gt;에서는 클라이언트의 소켓만을 저장했지만&lt;span &gt;, &lt;/span&gt;패킷 읽기를 구현해야 하기 때문에 많은
정보가 필요하다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;Class CClient&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;public:&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enum
{ PACKET_BODY, PACKET_LENGTH };&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enum
{ PACKET_BUFFER = 512 };&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SOCKET
m_Socket;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int
m_nPI;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int
m_nRI;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; short
m_nPacketLen;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;};&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;Ccleint g_ClientC[MAX_CLIENT];&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;지금은 서버를 구성하는 것이 중심이므로 클래스를 다음과 같이 만들지만&lt;span &gt;, &lt;/span&gt;위와
같이&lt;span &gt; GetXXX(), SetXXX()&lt;/span&gt;로 만들어지는 클래스는 프로그래머가 잘못 클래스를 작성했다고 생각하면
틀림없다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;





































































































































&lt;span  style=&quot;font-size:10.0pt;;font-family:
&amp;quot;바탕&amp;quot;,&amp;quot;serif&amp;quot;;mso-hansi-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-font-family:&amp;quot;Times New Roman&amp;quot;;
mso-font-kerning:1.0pt;mso-ansi-language:EN-US;mso-fareast-language:KO;
mso-bidi-language:AR-SA&quot;&gt;&lt;br clear=&quot;all&quot; style=&quot;page-break-before:always&quot;&gt;
&lt;/span&gt;

&lt;/p&gt;&lt;p  style=&quot;margin-left:18.0pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1;
tab-stops:list 18.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;b&gt;&lt;span &gt;4.&lt;span style=&quot;font-variant-numeric: normal; font-weight: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b&gt;채팅서버
프로그램을 확장하자&lt;span &gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;table Table&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; style=&quot;border-collapse:collapse;border:none;mso-border-alt:solid windowtext .5pt;
 mso-padding-alt:0cm 4.95pt 0cm 4.95pt;mso-border-insideh:.5pt solid windowtext;
 mso-border-insidev:.5pt solid windowtext&quot;&gt;
 &lt;tbody&gt;&lt;tr&gt;
  &lt;td width=&quot;580&quot; valign=&quot;top&quot; style=&quot;width:435.1pt;border:solid windowtext 1.0pt;
  mso-border-alt:solid windowtext .5pt;padding:0cm 4.95pt 0cm 4.95pt&quot;&gt;
  &lt;p &gt;&lt;span &gt;// IOCP.cpp&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;#define WIN32_LEAN_AND_MEAN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Exclude rarely-used stuff
  from Windows headers&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;#include &amp;lt;windows.h&amp;gt;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;#include &amp;lt;winsock2.h&amp;gt;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;#define MY_RECV_BUFFER&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 512&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;//#define MY_CHAT_PORT 50000&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;#define MY_MAX_CLIENT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 10&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;#define MY_MAX_PACKET&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 100&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;class CClient&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;public:&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; enum
  MODE { PACKET_BODY, PACKET_LENGTH };&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SOCKET
  m_Socket;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int
  m_nPI;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int
  m_nRI;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; short
  m_nPacketLen;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MODE
  m_eMode;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;public:&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CClient()&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_Socket
  = INVALID_SOCKET;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_nPI
  = m_nRI = 0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_nPacketLen
  = 0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_eMode
  = PACKET_BODY;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;};&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;#define READ&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;#define WRITE&amp;nbsp;&amp;nbsp;&amp;nbsp; 2&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;class CXOverlapped : public OVERLAPPED&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;public:&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int
  mode;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //
  Read&lt;/span&gt;냐&lt;span &gt; Write&lt;/span&gt;냐&lt;span &gt;..&lt;/span&gt;결정&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; char
  szRecv[MY_RECV_BUFFER];&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int
  iNum;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //
  Send&lt;/span&gt;할 때&lt;span &gt;, &lt;/span&gt;같은 데이터를 여러 개 만들지&lt;span &gt;&lt;/span&gt;&lt;/p&gt;
  &lt;p  style=&quot;text-indent:10.0pt;mso-char-indent-count:1.0&quot;&gt;&lt;span &gt;// &lt;/span&gt;않기 위해서 사용하는 변수이다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;// &lt;/span&gt;원리는 이 구조체를 사용하여&lt;span &gt; Send&lt;/span&gt;를 하면&lt;span &gt; &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;// iNum&lt;/span&gt;값을&lt;span &gt; 1&lt;/span&gt;씩
  증가 시킨다&lt;span &gt;. &lt;/span&gt;작업 완료 처리&lt;span &gt; &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;// &lt;/span&gt;루틴에서&lt;span &gt; Send&lt;/span&gt;가
  완료 되었으면 이 값을&lt;span &gt; 1&lt;/span&gt;씩&lt;span &gt; &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;// &lt;/span&gt;빼주고&lt;span &gt; 0&lt;/span&gt;이 된
  구조체를&lt;span &gt; delete&lt;/span&gt;한다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CXOverlapped()&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Clear();&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mode
  = READ;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ~CXOverlapped()&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inline
  void Clear()&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Internal
  = 0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InternalHigh
  = 0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Offset
  = 0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OffsetHigh
  = 0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hEvent
  = 0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;};&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;SOCKET g_sockListen;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/span&gt;클라이언트의 접속을 대기하는 소켓&lt;span &gt;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;int g_nClients = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;/span&gt;현재 몇명의 클라이언트가
  접속했는지 저장&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;CClient g_ClientsC[MY_MAX_CLIENT];&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;HANDLE g_hCompletionPort;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;// &lt;/span&gt;소켓 초기화 함수&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;BOOL InitSocket() &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WORD
  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wVer;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WSADATA
  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wsaData;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SOCKADDR_IN
  &amp;nbsp;&amp;nbsp; serv_addr;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; wVer
  = MAKEWORD(1,1);&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(WSAStartup(wVer,
  &amp;amp;wsaData) != 0) &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(
  &quot;WSAStartup() &lt;/span&gt;실패&lt;span &gt; : %d\n&quot;,
  WSAGetLastError());&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  FALSE;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_sockListen
  = socket(AF_INET, SOCK_STREAM, 0);&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if
  ( g_sockListen == INVALID_SOCKET ) &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(
  &quot;socket() &lt;/span&gt;실패&lt;span &gt; : %d\n&quot;, WSAGetLastError());&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  FALSE;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ZeroMemory
  (&amp;amp;serv_addr, sizeof (serv_addr));&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; serv_addr.sin_family
  = AF_INET;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; serv_addr.sin_port
  = htons(MY_CHAT_PORT);&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  bind( g_sockListen, (LPSOCKADDR)&amp;amp;serv_addr, sizeof(serv_addr) ) ==&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; SOCKET_ERROR )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(
  &quot;bind() &lt;/span&gt;실패&lt;span &gt; : %d\n&quot;, WSAGetLastError());&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  FALSE;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if
  (listen(g_sockListen, 5) == SOCKET_ERROR) &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(
  &quot;listen() &lt;/span&gt;실패&lt;span &gt; : %d\n&quot;, WSAGetLastError());&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  FALSE;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&quot;g_sockListen
  &lt;/span&gt;소켓 초기화 성공&lt;span &gt;\n&quot;);&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  TRUE;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;void PacketProcess( char* pPacket )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //
  &lt;/span&gt;여기서 패킷에 대한 처리를 하며 된다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;DWORD WINAPI WorkerThread( void* pModel )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD
  dwBytesTransferred;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD
  dwCompKey;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CXOverlapped*
  pPacket;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPOVERLAPPED
  pOverlap;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(
  &quot;Worker &lt;/span&gt;시작&lt;span &gt;\n&quot; );&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(
  1 )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //////////////////////////////////////////&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //3.
  Read Request from client&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //////////////////////////////////////////&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  FALSE == GetQueuedCompletionStatus( g_hCompletionPort,
  &amp;amp;dwBytesTransferred,&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;amp;dwCompKey,
  (LPOVERLAPPED *)&amp;amp;pOverlap, INFINITE ) )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  pOverlap != NULL )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(
  &quot;Error Thread : GetQueueCompletionStatus( %d )\n&quot;,&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GetLastError()
  );&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  dwBytesTransferred == 0 )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&quot;Closing
  socket %d\n&quot;, g_ClientsC[dwCompKey] );&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  SOCKET_ERROR == closesocket( g_ClientsC[dwCompKey].m_Socket ) )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(GetLastError()
  == 10038)&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&quot;closesocket()
  failed with error %d\n&quot;, WSAGetLastError());&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; continue;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //////////////////////////////////////////&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //4.
  Excute request locally&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //////////////////////////////////////////&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pPacket
  = (CXOverlapped*)pOverlap;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  READ == pPacket-&amp;gt;mode )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_ClientsC[dwCompKey].m_nRI
  += dwBytesTransferred;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(
  g_ClientsC[dwCompKey].m_nPI &amp;lt; g_ClientsC[dwCompKey].m_nRI )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  g_ClientsC[dwCompKey].m_eMode == CClient::PACKET_LENGTH )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  g_ClientsC[dwCompKey].m_nPI + 2 &amp;lt;= g_ClientsC[dwCompKey].m_nRI) &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_ClientsC[dwCompKey].m_nPacketLen
  = pPacket-&amp;gt;szRecv[g_ClientsC[dwCompKey].m_nPI] &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; +
  (pPacket-&amp;gt;szRecv[g_ClientsC[dwCompKey].m_nPI+1] &amp;lt;&amp;lt; 8 ) - 2;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_ClientsC[dwCompKey].m_nPI
  += 2;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_ClientsC[dwCompKey].m_eMode
  = CClient::PACKET_BODY;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else
  if( g_ClientsC[dwCompKey].m_eMode == CClient::PACKET_BODY )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  g_ClientsC[dwCompKey].m_nPI + g_ClientsC[dwCompKey].m_nPacketLen &amp;lt;=
  g_ClientsC[dwCompKey].m_nRI )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //////////////////////////////////////////&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //5.
  Return result to client&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //////////////////////////////////////////&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; PacketProcess(
  (char*)(pPacket-&amp;gt;szRecv + g_ClientsC[dwCompKey].m_nPI) );&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_ClientsC[dwCompKey].m_nPI
  += g_ClientsC[dwCompKey].m_nPacketLen;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_ClientsC[dwCompKey].m_eMode
  = CClient::PACKET_LENGTH;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  g_ClientsC[dwCompKey].m_nPI == g_ClientsC[dwCompKey].m_nRI )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_ClientsC[dwCompKey].m_nPI
  = g_ClientsC[dwCompKey].m_nRI = 0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else
  if( g_ClientsC[dwCompKey].m_nPI &amp;gt; 0 )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; memmove(
  pPacket-&amp;gt;szRecv, &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;pPacket-&amp;gt;szRecv +
  g_ClientsC[dwCompKey].m_nPI, &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;g_ClientsC[dwCompKey].m_nRI -
  g_ClientsC[dwCompKey].m_nPI );&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_ClientsC[dwCompKey].m_nRI
  -= g_ClientsC[dwCompKey].m_nPI;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pPacket-&amp;gt;Clear();&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  FALSE == ReadFile( (HANDLE)g_ClientsC[dwCompKey].m_Socket, &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pPacket-&amp;gt;szRecv
  + g_ClientsC[dwCompKey].m_nRI,&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MY_RECV_BUFFER -
  g_ClientsC[dwCompKey].m_nRI,&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL,&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pPacket
  ) )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  GetLastError() != ERROR_IO_PENDING )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&quot;WSARecv()
  failed with error %d\n&quot;, WSAGetLastError());&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else
  if( WRITE == pPacket-&amp;gt;mode )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(
  &quot;Send complete to %d&amp;nbsp;
  packet(%d)\n&quot;, dwCompKey, pPacket-&amp;gt;iNum );&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  --(pPacket-&amp;gt;iNum) &amp;lt;= 0 )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; delete
  pPacket;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(
  &quot;Error\n&quot; );&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }//while(1)&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;int main()&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //
  &lt;/span&gt;모든 과정을 진행 하기 전에 해야 하는 일들&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitSocket();&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_hCompletionPort
  = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 0 );&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  INVALID_HANDLE_VALUE == g_hCompletionPort )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(
  &quot;IOCP create error..\n&quot; );&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //
  &lt;/span&gt;쓰레드 생성&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DWORD
  ThreadId;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HANDLE
  ThreadHandle;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ThreadHandle
  = CreateThread( NULL, 0, WorkerThread,&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NULL,
  0, &amp;amp;ThreadId );&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if
  (!ThreadHandle)&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf
  (stdout, &quot;Create Worker Thread Failed\n&quot;);&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  FALSE;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CloseHandle
  (ThreadHandle);&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; while(
  1 )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //////////////////////////////////////////&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //1.
  Wait for client to connect&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //////////////////////////////////////////&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SOCKET
  sockTemp = accept( g_sockListen, NULL, NULL );&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  INVALID_SOCKET == sockTemp )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&quot;&lt;/span&gt;연결된
  소켓 에러&lt;span &gt;\n&quot;);&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //////////////////////////////////////////&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //2.
  Open communication channel for client&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //////////////////////////////////////////&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(
  &quot;Socket number %d connected\n&quot;&amp;nbsp;
  , sockTemp );&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_ClientsC[g_nClients].m_Socket
  = sockTemp;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //
  &lt;/span&gt;접속한 소켓&lt;span &gt;(&lt;/span&gt;핸들&lt;span &gt;)-&lt;/span&gt;클라이언트 소켓을 저장한
  배열의 인덱스&lt;span &gt;(KEY)&lt;/span&gt;의&lt;span &gt;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //
  &lt;/span&gt;쌍으로&lt;span &gt; IOCP&lt;/span&gt;에 등록한다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  NULL == ( g_hCompletionPort = CreateIoCompletionPort( &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (HANDLE)sockTemp , &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_hCompletionPort,&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (DWORD)g_nClients, 0 ) ) )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&quot;CreateIoCompletionPort
  failed with error %d\n&quot;, GetLastError());&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }
  &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CXOverlapped
  *pPacket = new CXOverlapped;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  FALSE == ReadFile( (HANDLE)g_ClientsC[g_nClients].m_Socket, &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pPacket-&amp;gt;szRecv,
  &lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MY_RECV_BUFFER,
  NULL, pPacket ) )&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(
  GetLastError() != ERROR_IO_PENDING ) {&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(&quot;ReadFile()
  failed with error %d\n&quot;, WSAGetLastError());&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_nClients++;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return
  0;&lt;/span&gt;&lt;/p&gt;
  &lt;p &gt;&lt;span &gt;}&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;&lt;p &gt;&lt;b&gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;





&lt;/p&gt;&lt;p &gt;위에 소스에서&lt;span &gt; ProcessPacket() &lt;/span&gt;함수는 표&lt;span &gt;1&lt;/span&gt;의 소스 출처 프로그램에서&lt;span &gt; Packet()&lt;/span&gt;이라는 함수를 그대로 사용하시면
됩니다&lt;span &gt;. &lt;/span&gt;이 강좌는 전체 머그게임 서버를 구성하는 것이 아니라&lt;span &gt;.
IOCP&lt;/span&gt;를 사용하여 네트워크에서 패킷을 읽어 드리는 방법에 대해 초점을 잡았으므로 나머지는 표&lt;span &gt;1&lt;/span&gt;의
출처자료를 참조하세요&lt;span &gt;. &lt;/span&gt;저보다 훨씬 설명이 잘되어있으니까요&lt;span &gt;. &lt;/span&gt;그럼&lt;span &gt;, &lt;/span&gt;모두들 열심히 프로그래밍 하시고요&lt;span &gt;. &lt;/span&gt;화이링&lt;span &gt;~~~~&lt;/span&gt;&lt;/p&gt;</description>
      <category>서버</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/331</guid>
      <comments>https://eltgroup.tistory.com/331#entry331comment</comments>
      <pubDate>Sat, 2 Jun 2018 07:34:47 +0900</pubDate>
    </item>
    <item>
      <title>IOCP 사용 방법</title>
      <link>https://eltgroup.tistory.com/330</link>
      <description>&lt;p &gt;&lt;b&gt;&lt;span  style=&quot;font-size:16.0pt;&quot;&gt;IOCP &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-size:16.0pt;&quot;&gt;사용 방법&lt;span &gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p &gt;&lt;b&gt;&lt;span  style=&quot;font-size:14.0pt;&quot;&gt;IOCP&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-size:14.0pt;&quot;&gt;의 목적&lt;span &gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;IOCP&lt;/span&gt;는 프로그램이 어떤 핸들&lt;span &gt;( &lt;/span&gt;파일&lt;span &gt;, &lt;/span&gt;소켓 등&lt;span &gt; )&lt;/span&gt;에 대해&lt;span &gt; I/O &lt;/span&gt;작업을
할 때&lt;span &gt;, &lt;/span&gt;블록 되지 않게 함으로써 프로그램의 대기 시간을 줄일 수 있는 방법이다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;블록이 되면 생기는 문제 제시하면서&lt;span &gt;, &lt;/span&gt;타당성 제공&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;b&gt;&lt;span  style=&quot;font-size:14.0pt;&quot;&gt;IOCP&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-size:14.0pt;&quot;&gt;의 사용하기 위한 절차&lt;span &gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p &gt;마치&lt;span &gt; IOCP&lt;/span&gt;에게 작업을 해줘라고 신청하고 신청한 작업이 끝나면 이런
작업을 누군가 하라고 했는데 그 작업이 지금 완료 되었다고 알려주는 것과 같은 절차를 가진다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:38.0pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1;
tab-stops:list 38.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;span &gt;1.&lt;span style=&quot;font-variant-numeric: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;&lt;span &gt;IOCP &lt;/span&gt;핸들을 생성한다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:38.0pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1;
tab-stops:list 38.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;span &gt;2.&lt;span style=&quot;font-variant-numeric: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;핸들과 키의 쌍으로&lt;span &gt; IOCP&lt;/span&gt;핸들에 등록을 한다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:38.0pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1;
tab-stops:list 38.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;span &gt;3.&lt;span style=&quot;font-variant-numeric: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;핸들에&lt;span &gt; I/O &lt;/span&gt;작업을 한다&lt;span &gt;.( I/O&lt;/span&gt;작업을 신청한다는 의미가 더 어울릴 것 같다&lt;span &gt;. )&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:38.0pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1;
tab-stops:list 38.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;span &gt;4.&lt;span style=&quot;font-variant-numeric: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;어떤 핸들에 대한&lt;span &gt; I/O&lt;/span&gt;작업이 완료되면&lt;span &gt; IOCP&lt;/span&gt;가 프로그램에게 알려준다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:38.0pt;text-indent:-18.0pt;mso-list:l0 level1 lfo1;
tab-stops:list 38.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;span &gt;5.&lt;span style=&quot;font-variant-numeric: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/span&gt;&lt;/span&gt;&lt;!--[endif]--&gt;완료된 작업에 대해 해야 할 일을 한다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:18.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo2;
tab-stops:list 18.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;b&gt;&lt;span &gt;1.&lt;span style=&quot;font-variant-numeric: normal; font-weight: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b&gt;&lt;span &gt;IOCP &lt;/span&gt;핸들을 생성한다&lt;span &gt;.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;I/O&lt;/span&gt;작업을 대신 해줄&lt;span &gt; IOCP &lt;/span&gt;핸들을
생성해야 한다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;다음은&lt;span &gt; IOCP &lt;/span&gt;핸들을 생성하기 위한 함수의 원형이다&lt;span &gt;. &lt;/span&gt;뒤에 보겠지만&lt;span &gt;, &lt;/span&gt;핸들과 키의 쌍을&lt;span &gt;
IOCP &lt;/span&gt;핸들에 등록하는 것도 이 함수를 사용한다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;b&gt;&lt;span &gt;HANDLE CreateIoCompletionPort (&lt;br /&gt;
&amp;nbsp; HANDLE&lt;/span&gt;&lt;/b&gt;&lt;i&gt;&lt;span &gt;
FileHandle&lt;/span&gt;&lt;/i&gt;&lt;b&gt;&lt;span &gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/b&gt;&lt;span &gt;//
handle to file&lt;br /&gt;
&amp;nbsp; &lt;b&gt;HANDLE&lt;/b&gt; &lt;i&gt;ExistingCompletionPort&lt;/i&gt;&lt;b&gt;,&lt;/b&gt;&amp;nbsp; // handle to I/O completion port&lt;br /&gt;
&lt;b&gt;&amp;nbsp; ULONG_PTR&lt;/b&gt;&lt;i&gt; CompletionKey&lt;/i&gt;&lt;b&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/b&gt;// completion key&lt;br /&gt;
&lt;b&gt;&amp;nbsp; DWORD&lt;/b&gt;&lt;i&gt;
NumberOfConcurrentThreads &lt;/i&gt;// number of threads to execute concurrently&lt;b&gt;);&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;인자를 보면&lt;span &gt;, hFile&lt;/span&gt;은&lt;span &gt; IOCP&lt;/span&gt;에
등록하는&lt;span &gt; I/O &lt;/span&gt;핸들&lt;span &gt;( &lt;/span&gt;소켓&lt;span &gt;, &lt;/span&gt;파일 등&lt;span &gt; )&lt;/span&gt;이다&lt;span &gt;. &lt;/span&gt;이렇게
함으로써&lt;span &gt; IOCP&lt;/span&gt;는&lt;span &gt; hFile&lt;/span&gt;에서 일어나는&lt;span &gt; I/O&lt;/span&gt;를 감시하면서 작업이 끝났을 때&lt;span &gt;, &lt;/span&gt;알려줄 수 있게 되는 것 이다&lt;span &gt;. &lt;/span&gt;다음의&lt;span &gt; hExistingPort&lt;/span&gt;는 새로운 포트를 생성하려면&lt;span &gt; NULL, &lt;/span&gt;기존에 있는&lt;span &gt; IOCP&lt;/span&gt;에 연결을 하려면&lt;span &gt; CreateIoCompletionPort()&lt;/span&gt;함수가 이전에 반환했던&lt;span &gt; IOCP &lt;/span&gt;핸들을
넘겨준다&lt;span &gt;. &lt;/span&gt;세 번째 &lt;span &gt;CompletionKey&lt;/span&gt;는 위에서 말했던
키를 나타낸다&lt;span &gt;. &lt;/span&gt;나중에 핸들에서의 작업이 끝나면&lt;span &gt; IOCP&lt;/span&gt;는
어떤 핸들에서의 작업인지 알려줄 때 핸들 값 자체를 넘겨주는 것이 아니라&lt;span &gt;, &lt;/span&gt;이 키 값을 알려준다&lt;span &gt;. &lt;/span&gt;따라서&lt;span &gt;, &lt;/span&gt;여러 개의 핸들을 등록했다면&lt;span &gt;, &lt;/span&gt;등록할 때 이 키 값을 고유하게 해주므로써 각각을 구분할 수 있도록 한다&lt;span &gt;. &lt;/span&gt;마지막
&lt;span &gt;NumberOfConcurrentThreads&lt;/span&gt;는&lt;span &gt; IOCP&lt;/span&gt;가
입출력 작업을 할 때 얼마나 많은 쓰레드를 사용하여 작업을 할 지 설정하는 것으로 특별히 정확하게 얼마나 설정해야 할 지 모를 때는&lt;span &gt; 0&lt;/span&gt;의 값으로 설정하면 가장 최적화된 방법으로 스레드를 생성하여 사용한다&lt;span &gt;. &lt;/span&gt;생성이
성공하면&lt;span &gt; IOCP&lt;/span&gt;핸들을 반환하고 실패 하면&lt;span &gt; NULL&lt;/span&gt;값을 반환한다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;h1&gt;&lt;span &gt;Tip &lt;/span&gt;&lt;span  style=&quot;font-weight:normal&quot;&gt;dwCompletionKey&lt;/span&gt;&lt;span style=&quot;font-weight:normal&quot;&gt;값은 여러 가지로 사용할 수 있다&lt;span &gt;. &lt;/span&gt;타입이&lt;span &gt; DWORD&lt;/span&gt;이므로 어떤 형식의 포인터로 사용하는 것도 가능하고 정수로써도 사용할 수 있다&lt;span &gt;.&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;HANDLE hIOCP;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;hIOCP = ::CreateIoCompletionPort(
INVALID_HANDLE_VALUE, NULL, NULL, NULL );&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;그저 생성하는 것이므로 다음과 같이 생성을 한다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:18.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo2;
tab-stops:list 18.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;b&gt;&lt;span &gt;2.&lt;span style=&quot;font-variant-numeric: normal; font-weight: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b&gt;핸들과
키의 쌍으로&lt;span &gt; IOCP&lt;/span&gt;핸들에 등록을 한다&lt;span &gt;.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p &gt;위에서 설명한&lt;span &gt; CreateIoCompletionPort&lt;/span&gt;함수를 사용하여
핸들과 키를 등록할 수 있다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;HANDLE hFileHandle;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //IOCP&lt;/span&gt;에 등록하고 싶은 핸들&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;m_hIOCP = ::CreateIoCompletionPort( &lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:40.0pt;text-indent:40.0pt&quot;&gt;&lt;span &gt;hFileHandle, &lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:40.0pt;text-indent:40.0pt&quot;&gt;&lt;span &gt;hIOCP, &lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:40.0pt;text-indent:40.0pt&quot;&gt;&lt;span &gt;dwCompkey, &lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:40.0pt;text-indent:40.0pt&quot;&gt;&lt;span &gt;NumberOfCurrentThread );&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;이와 같이&lt;span &gt; hFileHandle-dwCompkey &lt;/span&gt;쌍으로 등록하면
나중에&lt;span &gt; I/O&lt;/span&gt;출력함수를&lt;span &gt; hFileHandle&lt;/span&gt;을 인자로 호출을
하면&lt;span &gt; I/O&lt;/span&gt;가 끝나면&lt;span &gt; IOCP&lt;/span&gt;가&lt;span &gt; dwCompkey&lt;/span&gt;값을 주면서&lt;span &gt; I/O&lt;/span&gt;작업이 끝났다고 알려준다&lt;span &gt;. &lt;/span&gt;그러므로&lt;span &gt; dwCompkey&lt;/span&gt;값을 어떤 값으로 사용하냐에 따라 프로그램을
작성하는 방법이 많이 달라질 수 있다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;IOCP&lt;/span&gt;의 기법은 어떤 핸들&lt;span &gt;( &lt;/span&gt;파일&lt;span &gt;, &lt;/span&gt;소켓 등등&lt;span &gt; )&lt;/span&gt;과 특정 값을 일치 시켜서 나중에 작업을 알수 있도록
하는 것이다&lt;span &gt;. &lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;사용자는 어떤 핸들에 대한 작업이 완료 되었을 때&lt;span &gt;, &lt;/span&gt;어떤 값을 알려달라고
시스템에 알려준다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;그리고&lt;span &gt;, &lt;/span&gt;핸들에&lt;span &gt; I/O&lt;/span&gt;작업을
실시한다&lt;span &gt;. &lt;/span&gt;다른 작업을 하는 도중 핸들에&lt;span &gt; I/O&lt;/span&gt;작업이 완료
되었으면 시스템은 프로그램에게 처음에 등록했던 값을 알려준다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:18.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo2;
tab-stops:list 18.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;b&gt;&lt;span &gt;3.&lt;span style=&quot;font-variant-numeric: normal; font-weight: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b&gt;핸들에&lt;span &gt; I/O &lt;/span&gt;작업을 한다&lt;span &gt;.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p &gt;윈도우에서는 소켓이나 파일 핸들이나 같이 사용되기 때문에 아무&lt;span &gt; I/O&lt;/span&gt;함수나
사용하여&lt;span &gt; I/O&lt;/span&gt;작업을 신청한다&lt;span &gt;. &lt;/span&gt;&lt;/p&gt;&lt;p &gt;단 여기서 중요한 것은&lt;span &gt; IOCP&lt;/span&gt;는 중첩된&lt;span &gt;(Overlapped) I/O &lt;/span&gt;방식을 사용한다는 것이다&lt;span &gt;. &lt;/span&gt;따라서&lt;span &gt;, WSARecv()/WSASend(), ReadFile()/WriteFile()&lt;/span&gt;을 사용할 것을 권장한다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;OVERLAPPED *pPacket = new OVERLAPPED;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;if( FALSE == ReadFile( (HANDLE)hFileHandle,&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:80.0pt;text-indent:40.0pt&quot;&gt;&lt;span &gt;szBuffer, &lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:80.0pt;text-indent:40.0pt&quot;&gt;&lt;span &gt;MAX_BUFFER, &lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:80.0pt;text-indent:40.0pt&quot;&gt;&lt;span &gt;NULL, &lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:80.0pt;text-indent:40.0pt&quot;&gt;&lt;span &gt;pPacket ) )&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:20.0pt;mso-para-margin-left:2.0gd&quot;&gt;&lt;span &gt;if( GetLastError() != ERROR_IO_PENDING )&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:20.0pt;mso-para-margin-left:2.0gd&quot;&gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:40.0pt;mso-para-margin-left:4.0gd&quot;&gt;&lt;span &gt;printf(&quot;ReadFile() failed with error %d\n&quot;,
GetLastError());&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:40.0pt;mso-para-margin-left:4.0gd&quot;&gt;&lt;span &gt;return 0;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:20.0pt;mso-para-margin-left:2.0gd&quot;&gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;위와 같이 프로그램을 작성하여 입출력을 등록한다&lt;span &gt;. &lt;/span&gt;보통 우리가 알고
있는 것과 차이가 있다면&lt;span &gt; OVERLAPPED &lt;/span&gt;구조체를 생성하여 인자로 넘겨준다는 것이다&lt;span &gt;. &lt;/span&gt;이 구조체에 대한 자세한 정보는 전문서적을 참조하기 바란다&lt;span &gt;. &lt;/span&gt;하지만
이 구조체의 가장 큰 역할은 나중에&lt;span &gt; IOCP&lt;/span&gt;가 작업이 완료되었다고 알려줄 때&lt;span &gt;, &lt;/span&gt;읽기 작업을 끝냈는지 쓰기 작업을 끝냈는지 또는&lt;span &gt; 10&lt;/span&gt;개의 작업을
하라고 했는데 도대체 어떤 작업을 끝냈는지 알려 줄 방법이 없으므로 이 구조체를 사용하여 작업을 신청하기 전에 나중에 끝났을 때 알아볼 수 있도록
흔적을 남기기 위한 것이다&lt;span &gt;. ( &lt;/span&gt;원래는 더 많은 의미를 담고 있지만&lt;span &gt;,
&lt;/span&gt;잘 사용 안 하니까&lt;span  style=&quot;font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;
mso-ascii-font-family:바탕&quot;&gt;…&lt;/span&gt;&lt;span &gt; ) &lt;/span&gt;따라서&lt;span &gt;, OVERLAPPED &lt;/span&gt;구조체를 상속하여 흔적에 사용할 정보를 담을 수 있도록 만들어서 사용한다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:18.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo2;
tab-stops:list 18.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;b&gt;&lt;span &gt;4.&lt;span style=&quot;font-variant-numeric: normal; font-weight: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b&gt;어떤
핸들에 대한&lt;span &gt; I/O&lt;/span&gt;작업이 완료되면&lt;span &gt; IOCP&lt;/span&gt;가 프로그램에게
알려준다&lt;span &gt;.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;IOCP&lt;/span&gt;가 작업의 완료를 알려주는 것을 받는 방법은 여러 가지가 있으나
여기서는&lt;span &gt; GetQueuedCompletionStatus() &lt;/span&gt;함수를 사용하는 법을 알아보도록 한다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;BOOL GetQueuedCompletionStatus(&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-indent:40.0pt&quot;&gt;&lt;span &gt;HANDLE&lt;i&gt;
CompletionPort&lt;/i&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // handle to
completion port&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-indent:40.0pt&quot;&gt;&lt;span &gt;LPDWORD&lt;i&gt;
lpNumberOfBytes&lt;/i&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // bytes
transferred&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-indent:40.0pt&quot;&gt;&lt;span &gt;PULONG_PTR&lt;i&gt;
lpCompletionKey&lt;/i&gt;,&amp;nbsp; // file completion
key&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-indent:40.0pt&quot;&gt;&lt;span &gt;LPOVERLAPPED&lt;i&gt; &lt;/i&gt;*&lt;i&gt;lpOverlapped&lt;/i&gt;,&amp;nbsp; // buffer&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:40.0pt&quot;&gt;&lt;span &gt;DWORD&lt;i&gt;
dwMilliseconds&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/i&gt;// optional
timeout value&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-indent:40.0pt&quot;&gt;&lt;span &gt;);&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;첫 번째&lt;span &gt; CompletionPort&lt;/span&gt;는 이전에 생성했던&lt;span &gt; IOCP &lt;/span&gt;핸들이고&lt;span &gt;, lpNumberOfBytes I/O&lt;/span&gt;작업에서 읽거나
쓴 바이트의 수를 반환해 준다&lt;span &gt;. &lt;/span&gt;세 번째 인자는 핸들을&lt;span &gt; IOCP&lt;/span&gt;에
등록할 때 키로 등록했던 값을 반환해준다&lt;span &gt;. &lt;/span&gt;이 값을 가지고 어떤 핸들로 부터의 작업이 완료가 되었는지
알수 있다&lt;span &gt;. &lt;/span&gt;네 번째 인자는 작업을 등록할 때&lt;span &gt;, &lt;/span&gt;어떤 작업인지
흔적으로 남겼던&lt;span &gt; OVERLAPPED &lt;/span&gt;구조체를 반환해 준다&lt;span &gt;. &lt;/span&gt;이
구조체에 남겨진 정보를 가지고 어떤 작업이 끝난건지 알 수 있도록 수동으로 만들어야 한다&lt;span &gt;. &lt;/span&gt;여섯 번째
인자는&lt;span &gt; IOCP&lt;/span&gt;로부터 오는 완료 메시지를 얼마나 대기 하고 있을 것인지 설정하는 값이다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;if( FALSE == GetQueuedCompletionStatus( &lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:30.0pt;mso-para-margin-left:3.0gd&quot;&gt;&lt;span &gt;hIOCP,&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:30.0pt;mso-para-margin-left:3.0gd&quot;&gt;&lt;span &gt;&amp;amp;dwBytesTransferred,&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:30.0pt;mso-para-margin-left:3.0gd&quot;&gt;&lt;span &gt;&amp;amp;dwCompKey,&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:30.0pt;mso-para-margin-left:3.0gd&quot;&gt;&lt;span &gt;(LPOVERLAPPED *)&amp;amp;pOverlap, &lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:30.0pt;mso-para-margin-left:3.0gd&quot;&gt;&lt;span &gt;INFINITE ) )&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:30.0pt;mso-para-margin-left:3.0gd&quot;&gt;&lt;span &gt;if( pOverlap != NULL )&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:30.0pt;mso-para-margin-left:3.0gd&quot;&gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:50.0pt;mso-para-margin-left:5.0gd&quot;&gt;&lt;span &gt;if( 64 != GetLastError() )&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:50.0pt;mso-para-margin-left:5.0gd&quot;&gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:80.0pt;mso-para-margin-left:8.0gd&quot;&gt;&lt;span &gt;printf( &quot;Error Thread : GetQueueCompletionStatus( %d )\n&quot;,
GetLastError() );&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:80.0pt;mso-para-margin-left:8.0gd&quot;&gt;&lt;span &gt;return 0;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:50.0pt;mso-para-margin-left:5.0gd&quot;&gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:30.0pt;mso-para-margin-left:3.0gd&quot;&gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;위와 같이 사용한다&lt;span &gt;. &lt;/span&gt;주의 해야 할 것은&lt;span &gt; GetQueuedCompletionStatus&lt;/span&gt;함수가 반환하는 값이&lt;span &gt; FALSE&lt;/span&gt;라고
해서 에러가 아니라&lt;span &gt; pOverlap&lt;/span&gt;이&lt;span &gt; NULL&lt;/span&gt;이고&lt;span &gt; FALSE&lt;/span&gt;를 발생했던 에러의 값이&lt;span &gt; 64&lt;/span&gt;가 아닐 때만 진짜로 에러가
발생한 것이라는 것이다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:18.0pt;text-indent:-18.0pt;mso-list:l1 level1 lfo2;
tab-stops:list 18.0pt&quot;&gt;&lt;!--[if !supportLists]--&gt;&lt;b&gt;&lt;span &gt;5.&lt;span style=&quot;font-variant-numeric: normal; font-weight: normal; font-stretch: normal; font-size: 7pt; line-height: normal; font-family: &amp;quot;Times New Roman&amp;quot;;&quot;&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;!--[endif]--&gt;&lt;b&gt;완료된
작업에 대해 해야 할 일을 한다&lt;span &gt;.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p &gt;위에&lt;span &gt; GetQueuedCompletionStatus&lt;/span&gt;함수에서 전달 받은
값들을 가지고&lt;span &gt; 3&lt;/span&gt;번 과정에서&lt;span &gt; I/O&lt;/span&gt;작업을 신청할 때&lt;span &gt;, I/O&lt;/span&gt;작업이 끝나면 하려고 했던 작업을 하면된다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;if( dwBytesTransferred == 0 )&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:20.0pt;mso-para-margin-left:2.0gd&quot;&gt;&lt;span &gt;printf(&quot;Closing socket %d\n&quot;,
g_CClients[dwCompKey].GetSocket() );&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:20.0pt;mso-para-margin-left:2.0gd&quot;&gt;&lt;span &gt;if( SOCKET_ERROR == closesocket( g_CClients[dwCompKey].GetSocket() )
)&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:20.0pt;mso-para-margin-left:2.0gd&quot;&gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:40.0pt;mso-para-margin-left:4.0gd&quot;&gt;&lt;span &gt;if(GetLastError() == 10038)&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:60.0pt;mso-para-margin-left:6.0gd&quot;&gt;&lt;span &gt;continue;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:40.0pt;mso-para-margin-left:4.0gd&quot;&gt;&lt;span &gt;else&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:40.0pt;mso-para-margin-left:4.0gd&quot;&gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:60.0pt;mso-para-margin-left:6.0gd&quot;&gt;&lt;span &gt;printf(&quot;closesocket() failed with error %d\n&quot;,
WSAGetLastError());&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:60.0pt;mso-para-margin-left:6.0gd&quot;&gt;&lt;span &gt;return 0;&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:40.0pt;mso-para-margin-left:4.0gd&quot;&gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:20.0pt;mso-para-margin-left:2.0gd&quot;&gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;margin-left:20.0pt;mso-para-margin-left:2.0gd&quot;&gt;&lt;span &gt;continue;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;//recv&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;if( /* pOverlap&lt;/span&gt;에 읽기 작업이라는 흔적이 있다면&lt;span &gt; */ )&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //
&lt;/span&gt;또 하나 중요한 것은&lt;span &gt; 3&lt;/span&gt;번에서 신청한&lt;span &gt; I/O&lt;/span&gt;작업에
사용한 버퍼의 포인터를&lt;span &gt; &lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //
&lt;/span&gt;여기서 알고있어야 한다는 것이다&lt;span &gt;. &lt;/span&gt;&lt;/p&gt;&lt;p  style=&quot;text-indent:40.0pt&quot;&gt;&lt;span &gt;Printf( &lt;/span&gt;&lt;span  style=&quot;font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:
바탕&quot;&gt;“&lt;/span&gt;&lt;span &gt;%s\n&lt;/span&gt;&lt;span  style=&quot;font-family:
&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:바탕&quot;&gt;”&lt;/span&gt;&lt;span &gt;,
szBuffer );&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;else if( /* pOverlap&lt;/span&gt;에 쓰기 작업이라는 흔적이 있다면&lt;span &gt; */ )&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf(
&lt;/span&gt;&lt;span  style=&quot;font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;
mso-ascii-font-family:바탕&quot;&gt;“&lt;/span&gt;쓰기가 완료되었네요&lt;span  style=&quot;font-family:
&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:바탕&quot;&gt;…&lt;/span&gt;&lt;span &gt;\n&lt;/span&gt;&lt;span  style=&quot;font-family:&amp;quot;Times New Roman&amp;quot;,&amp;quot;serif&amp;quot;;mso-ascii-font-family:
바탕&quot;&gt;”&lt;/span&gt;&lt;span &gt; );&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;else&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;{&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //
&lt;/span&gt;남겼던 흔적이 없거나 에러가 발생한것임&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;}&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;위의&lt;span &gt; GetQueuedCompletionStatus&lt;/span&gt;함수에서 반환해준
&lt;span &gt;dwBytesTransferred&lt;/span&gt;의 값이&lt;span &gt; 0&lt;/span&gt;이란 의미는 해당
핸들이 끊어졌다는 것이다&lt;span &gt;. ( &lt;/span&gt;소켓의 경우&lt;span &gt; ) &lt;/span&gt;따라서&lt;span &gt;, &lt;/span&gt;핸들을 닫아 주면 된다&lt;span &gt;. &lt;/span&gt;그 다음에는 아까 전에 말했던&lt;span &gt; OVERLAPPED&lt;/span&gt;구조체에&lt;span &gt; 3&lt;/span&gt;번에서&lt;span &gt;
I/O&lt;/span&gt;작업 신청할 때 남겼던 흔적에 따라서 나머지를 처리해 주면 된다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p &gt;&lt;b&gt;&lt;span  style=&quot;font-size:14.0pt;&quot;&gt;IOCP&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-size:14.0pt;&quot;&gt;를 사용할 때 주의 할 점&lt;span &gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p &gt;&lt;span &gt;IOCP &lt;/span&gt;기법을 사용할 때의 주의 할 점은&lt;span &gt; I/O&lt;/span&gt;작업에 사용할 버퍼가&lt;span &gt; I/O&lt;/span&gt;작업을 신청한 시점부터&lt;span &gt; IOCP&lt;/span&gt;로부터 완료했다는 메시지를 받기 전까지 변경이 되면 안 된다는 것이다&lt;span &gt;.
&lt;/span&gt;따라서&lt;span &gt;, I/O &lt;/span&gt;작업에 사용하는 버퍼는 전역 변수이거나 동적으로 할당된 메모리 공간이어야
한다&lt;span &gt;. &lt;/span&gt;특히&lt;span &gt; WSASend()&lt;/span&gt;나&lt;span &gt; WriteFile() &lt;/span&gt;작업을 할 때&lt;span &gt;, &lt;/span&gt;함수를 호출하는 시점에 사용했던
공간을 함수이 끝나자 마자 지워버리거나&lt;span &gt;( &lt;/span&gt;지역 변수&lt;span &gt; ), &lt;/span&gt;다른
값으로 변경하게 되면&lt;span &gt;, &lt;/span&gt;나중에&lt;span &gt; IOCP&lt;/span&gt;가 시간이 생겨서 이
작업을 할 때&lt;span &gt;, &lt;/span&gt;엉뚱한 공간을 참조하거나&lt;span &gt;, &lt;/span&gt;원래 쓰려고 했던
데이터가 아닌 다른 데이터를 쓰게 되므로 조심해야 한다&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;















































































































































































































































































&lt;/p&gt;&lt;p &gt;&lt;span &gt;OVERLAPPED&lt;/span&gt;구조체도 마찬가지다&lt;span &gt;. &lt;/span&gt;작업이 끝나기 전에 지워지면 안 된다&lt;span &gt;.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>서버</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/330</guid>
      <comments>https://eltgroup.tistory.com/330#entry330comment</comments>
      <pubDate>Sat, 2 Jun 2018 07:33:14 +0900</pubDate>
    </item>
    <item>
      <title>16비트 컬러의 이펙트 필터 소개와 그 알고리즘</title>
      <link>https://eltgroup.tistory.com/329</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;--------------------------------------------&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;16비트 컬러의 이펙트 필터 소개와 그 알고리즘&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;--------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;전석환 (INGRAM)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;요즘 16비트 게임이 러쉬합니다. 16비트의 구조적/운용적 난점에도 불구하고 많은&lt;/p&gt;&lt;p&gt;개발사들이 16비트를 선택하는데는 나름대로 이유가 있습니다. 그 어쩔 수 없는&lt;/p&gt;&lt;p&gt;이유중에 하나인 &quot;16비트 모드만이 누릴수 있는 이펙트-Alpha Blend, 광원효과-&quot;&lt;/p&gt;&lt;p&gt;에 대해 완벽 분석을 해보겠습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래에 부연되는 모든 연산작업은 각각 RGB별 배열로 작성하여 구현되므로 속도상&lt;/p&gt;&lt;p&gt;에 커다란 영향을 주지 않습니다. 참고로 하나의 효과를 구현 하기에 소요되는 배&lt;/p&gt;&lt;p&gt;열의 크기는 배열1[32][32], 배열2[64][64]로 long 형 선언시 20 K byte입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;약간의 소스도 준비되어 있으니 개념을 이해하시기 어렵지 않을겁니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. Color Dodge&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 응용분야 : 빛 계열(전격계 포함)의 효과 및 마법에 가장 적합한 효과입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 알고리즘 : 표현되는 결과물(Dodge)을 위해 필요한 자재를 바탕색(BG)과 덧색&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(SPR)으로 나누었을때 RGB별 공통되는 연산식은 ...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Dodge=(BG*MAXDAC)/(MAXDAC-SPR)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;입니다. 이는 바탕색의 DAC가 높으면 높을수록 Dodge 본연의 색상&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;이 나와주는 것이며 또한 반대로 바탕색이 어두우면 어두울수록 D&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;odge 효과가 약해진다는 것을 살펴볼 수 있습니다. 또한 Dodge 로&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;강렬한 표현을 하려면 배경과 마찬가지로 SPR 의 전체적인 밝기가&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;높아야만 원래 추구하는 이미지를 전달하게 됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;주의할점은 Dodge 의 표현상 원래 SPR의 섬세한 이미지 전달을 불&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;가능하다는 것입니다. ( SPR 이미지의 심한 왜곡 )&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. Lighten&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 응용분야 : SPRITE, 원래의 색상이 필요한 -색의 왜곡없는- 다중 투명 효과.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 알고리즘 : 일단 알고리즘은 상당히 간단합니다. RGB 별로 BG, SPR 중 큰 DAC&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;값을 취하면 그 값이 바로 Lighten 을 구현하는 값이 됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Lighten = max ( BG, SPR )&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;이 Lighten 효과는 Table을 필요로 하지 않기 때문에 속도상에 약&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;간의 이점을 가지게 됩니다. 다른 효과들과는 달리 색상의 왜곡이&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;전혀 없으므로 원래 SPR 에 가장 근접한 이미지를 전달할 수가 있&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;다는 장점도 있습니다. 하지만 알고리즘상의 문제점으로 BG 의 밝&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;기에 따라 생략되는 부분도 있을 수 있어 실제 SPR 이미지의 크기&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;중 많은 부분이 축소/생략 되는 경향또한 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3. Screen&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 응용분야 : 연기같이 부드럽고-Soft touch- 연한 소재의 효과로 적합합니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(굴뚝에서 피어나는 연기따위...)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 알고리즘 : Lighten의 개량형이라 생각하면 됩니다. 연산식을 살펴보면 ...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TempSum=(MAXDAC-max(BG,SPR))/MAXDAC*min(BG,SPR)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Screen=max(BG,SPR)+TempSum&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;다시 말하면 Lighten은 자신(SPR)의 색상을 과장하지 않지만 Scr&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;een 은 어느정도 (어느정도라지만 일정한 왜곡률을 위한 계산식이&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;있다) 자신의 색상을 높여서 표현하기 때문에 원래 이미지의 축소&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/생략되는 부분이 없어,실제 구현되는 이미지의 영역도 Lighten보&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;다 넓습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4. Dodge-Screen&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 응용분야 : 불 계통의 모든 효과와 화염계 마법 모두.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 알고리즘 : 불을 표현하는 Effect를 위해 Dodge와 Screen 을 보완하여 결합한&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;효과입니다. Dodge로 일단 BG 쪽의 색 왜곡을 심화하고 그뒤에 Do&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;dge 효과로 왜곡된 메인 이미지들을 Screen 방식을 이용해 밝은색&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;위주로 깨끗하게 정렬합니다. 쉽게 설명드리자면 Dodge 로 BG쪽을&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;끌어당긴 다음 Screen으로 한번 더 Effect 를 먹인것과 다를 바가&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;없습니다.(하지만 효과를 재차 반복할 수는 없는 관계로 Table 을&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;작성하여 단 한번에 구현합니다.)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5. Screen-Dodge&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 응용분야 : Dodge의 특성상 BG의 왜곡 심도를 결정함에 있어 BG가 제로에 가까&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;운 수 혹은 제로일때 왜곡이 불가능한 것을 보완한 필터 로써 완벽&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;히 검은색의 BG에서도 Dodge가 구현. (플레이 스테이션에서 사용되&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;는 Dodge 필터 구현과 동일 )&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 알고리즘 : 위 5번항과 마찬가지이나 구현 순서만 바뀌면 됩니다. 일단 Screen&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;효과로 BG를 끌어 올린다음 Dodge로 왜곡을 심화합니다.5번항이 구&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;현됐다면 아주 쉬운 CASE입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;6. Dodge-Burn&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 응용분야 : 불에 타 시커멓게 그을린 듯한 효과, 굴뚝 연기.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 알고리즘 : Color Dodge 효과를 정 반대로 응용한 효과로 Dodge와는 달리 SPR&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;색상이 높을 수록 BG 색상을 어둡게 왜곡합니다. 반대로 SPR 색상&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;이 낮을 수록 BG 본연의 색상이 표현되게 왜곡을 약화합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; DodgeBurn = (BG*(MAXDAC-SPR))/MAXDAC;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;색의 왜곡을 심화하려면 ( MAXDAC-SPR )과 (MAXDAC), 분자 분모부&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;를 제곱 연산합니다.( 경험으로 볼때 3제곱 연산이 적당하다 )&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;7. Different&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 응용분야 : 암흑 마법 발동이나 독, 마비등의 Effect 응용 가능.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 알고리즘 : BG 와 SPR 색상의 편차를 고스란히 대입하는 간단한 알고리즘.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Different=(max(BG,SPR)-min(BG,SPR))&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;이를 이용하여 텍스쳐 형식으로 캐릭터에게 독립적인 표현이 가능&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;하므로 상태 이상시 캐릭터 Status 표현으로도 응용할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;==========================================================================&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;(주1) 위의 모든 공식은 실제 게임에서 쓰일 때에는 사전에 RGB 테이블[*][*]로&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;선연산하여 사용하도록 합니다. ( 그렇지 않고, Pixel 한번 처리할때마다&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;RealTime으로 연산하면서 구현한다면 치명적인 과부하가 발생합니다. )&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;15비트 컬러의 경우, Color Dodge를 예로 든다면 Dodge[32][32]의 배열을&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;준비 한 후,&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;for ( long bg=0 ; bg&amp;lt;32 ; bg++ ) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for ( long spr=0 ; spr&amp;lt;32 ; spr++ ) {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Dodge[bg][spr]=(long)((bg*32)/(32.0-spr));&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; (주) 분모측의 32.0으로 소수점을 표현한 이유는 컴파일적인 문제로 Floating&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;연산을 위한 것입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 실제 구현은,&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; BG와 SPR에 대해 15비트 R,G,B 값을 구해서 사전에 만들어 놓았던 테이블을&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 참조, 구현하도록 합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 아래는 간단한 예문입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; long d,e;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; WORD r,g,b;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; d = dest[0];//배경 버퍼 dest 에서 BG Pixel 을 구해서 d 에 저장.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; e = data[0];//SPR Pixel 을 구해서 e 에 저장.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; r=Dodge[(d&amp;amp;0x7c00)&amp;gt;&amp;gt;10][(e&amp;amp;0x7c00)&amp;gt;&amp;gt;10];//사전에 만들어 놓을 테이블 참조.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; g=Dodge[(d&amp;amp;0x03e0)&amp;gt;&amp;gt;5][(e&amp;amp;0x03e0)&amp;gt;&amp;gt;5];&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; b=Dodge[d&amp;amp;0x001f][e&amp;amp;0x001f];&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; dest[0]=(WORD)((r&amp;lt;&amp;lt;10)|(g&amp;lt;&amp;lt;5)|(b));//완성된 색을 배경 버퍼로 전송.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 이상입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;(주2) 위에 구현된 모든 이펙트 필터를 한마디로 표현한다면 왜곡과 생략이라&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;할 수 있습니다. 즉 Sprite 에 의해서 표현되어지는 것이 아니라 '스프&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;라이트에 의해서 왜곡되어지는 배경'이 이펙트 스프라이트에 대한 정의&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;라 할 수 있습니다. ( 이해가 가시나요? )&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;(주3) 사족을 하나 달겠습니다. 위의 모든 정보들은 인터넷에서 파오거나,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;어디서 보고 들은 것들이 아닙니다. 그야말로 순전히 수많은 시행착오&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;를 겪은 끝에 구현하게 된 것들입니다. 열심히 더 업그레이드 해주십&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;시요. 여러분들이 더 열심히 해 주실수록 우리 게임계의 미래는 밝아&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;집니다. 지켜 보겠습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;(주4) 이 모든것을 가능하게 곁에서 도와준 남영이와 늘 옆에서 날카로운&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;지적으로 날 땀흘리게 했던 응용수학의 달인 경일에게 감사와 영광을...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1997. 12. 27. INGRAM&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;게제동 강좌란&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;제 &amp;nbsp; 목 &amp;nbsp; &amp;nbsp;[PROG] 브렌슨헴 알고리즘 - 1&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;작성자 &amp;nbsp; &amp;nbsp;김학규 (neolith)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;작성일 &amp;nbsp;03-13 &amp;nbsp;조회수 &amp;nbsp;2663 &amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;정영태 &amp;nbsp; (viracoza)&lt;/p&gt;&lt;p&gt;[강좌] 브렌센헴 알고리즘 #1/3 - 직선 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 02/28 17:46 &amp;nbsp; 190 line&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;제가 이번에 안하던 짓을 하는 이유는&lt;/p&gt;&lt;p&gt;어느 분인가가 브렌센헴 알고리즘을 물어왔기&lt;/p&gt;&lt;p&gt;때문입니다. 다른 고수들 놔두고 왜하필&lt;/p&gt;&lt;p&gt;저한테 물었는지는 잘 모르겠으나, 이왕이면&lt;/p&gt;&lt;p&gt;강좌로 하는 것이 낫다고 생각해서 강좌의&lt;/p&gt;&lt;p&gt;형식을 빌어서 쓰는 것입니다.&lt;/p&gt;&lt;p&gt;그러므로 오늘부터 3회에 걸쳐&lt;/p&gt;&lt;p&gt;브렌센헴 알고리즘만을 강좌하기로 하겠습니다.&lt;/p&gt;&lt;p&gt;처음엔 직선, 다음엔 원, 그리고 타원 순으로요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;브렌센헴 알고리즘이 왜 필요한지는 굳이&lt;/p&gt;&lt;p&gt;쓰지 않겠습니다.&lt;/p&gt;&lt;p&gt;하지만 여러 사람들이 이 알고리즘에 손을&lt;/p&gt;&lt;p&gt;대지 않는 이유는 단지 이 알고리즘이&lt;/p&gt;&lt;p&gt;수학적 지식을 필요로 한다는 지레짐작&lt;/p&gt;&lt;p&gt;때문입니다.&lt;/p&gt;&lt;p&gt;사실 이 알고리즘은 아주 기초적인 수학능력&lt;/p&gt;&lt;p&gt;만 있으면 쉽게 이해할 수 있는 알고리즘입니다.&lt;/p&gt;&lt;p&gt;장점은 모두 아시다시피 속도가 빠르다는 것이고,&lt;/p&gt;&lt;p&gt;단점은 선의 질이 그다지 좋지 않다는 것입니다.&lt;/p&gt;&lt;p&gt;특히 이것은 직선보다 곡선에서 더 드러납니다.&lt;/p&gt;&lt;p&gt;이 브렌센헴 알고리즘을 보완한 알고리즘이&lt;/p&gt;&lt;p&gt;몇개 더 있지만 설명을 생략하겠습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;브렌센헴 알고리즘의 가장 핵심이 되는 것은&lt;/p&gt;&lt;p&gt;에러텀이라는 것입니다. 오차이지요.&lt;/p&gt;&lt;p&gt;무한대의 해상도를 갖는 CRT는&lt;/p&gt;&lt;p&gt;존재하지 않으므로 CRT에 선을 그리려면&lt;/p&gt;&lt;p&gt;어쩔 수 없이 오차가 생기기 마련입니다.&lt;/p&gt;&lt;p&gt;이 오차를 이용하는 것입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 오차가 어느 일정 한도 이상이 되면&lt;/p&gt;&lt;p&gt;점을 찍는 위치를 증가시킵니다.&lt;/p&gt;&lt;p&gt;이해를 돕기위해 좌표계는 컴퓨터가 아니라&lt;/p&gt;&lt;p&gt;일반적인 스퀘어 좌표계를 쓰겠습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;│&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 3│ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;???&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 2│ &amp;nbsp; &amp;nbsp; &amp;nbsp;???&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 1│???&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;└───────────&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 0 &amp;nbsp;1 2 3 4 5 6 7 8 9&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;위의 그림은 (1,1)【?(9,3)까지 선을 긋는&lt;/p&gt;&lt;p&gt;모습입니다. 당연히 매끈한 직선이 아니라&lt;/p&gt;&lt;p&gt;정수의 좌표를 갖는 점들의 집합이 되었죠.&lt;/p&gt;&lt;p&gt;설명을 돕기 위해 위의 좌표를 일반화하지&lt;/p&gt;&lt;p&gt;않았습니다. 그냥 가로가 x좌표고 세로가 y좌표&lt;/p&gt;&lt;p&gt;라고 해 두었습니다. 이것을 일반화시키면&lt;/p&gt;&lt;p&gt;설명이 복잡해지거든요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;자~ 이론 설명에 앞서, 선이 그려지는 과정부터&lt;/p&gt;&lt;p&gt;말씀드리죠.&lt;/p&gt;&lt;p&gt;우선 첫번째 점은 1,1에 찍습니다. 그 다음에&lt;/p&gt;&lt;p&gt;x좌표를 증가시킵니다. 그래서 에러텀을 살피고&lt;/p&gt;&lt;p&gt;만약 에러텀이 일정 한도 이하라면 그냥 넘어갑니다.&lt;/p&gt;&lt;p&gt;이렇게 진행하다가 보면 에러텀은 갈수록 커져가고,&lt;/p&gt;&lt;p&gt;나중에는 그 일정 한도라는 값을 넘어서게 됩니다.&lt;/p&gt;&lt;p&gt;그럼 y좌표를 증가시킵니다.&lt;/p&gt;&lt;p&gt;물론 y를 증가시켰으니 에러텀은 어느정도&lt;/p&gt;&lt;p&gt;줄어들겠죠. 에러텀에서 어느 값을 빼면 됩니다.&lt;/p&gt;&lt;p&gt;이 과정을 x좌표가 9가 될 때까지 반복하면 됩니다.&lt;/p&gt;&lt;p&gt;별로 어렵지 않게 이 방법이 실수의 가상좌표상의&lt;/p&gt;&lt;p&gt;점의 정수화와 거의 일치한다는 것을 증명할 수는&lt;/p&gt;&lt;p&gt;있지만 설명하기도 귀찮고, 또 설명한다고 해도&lt;/p&gt;&lt;p&gt;재미가 없어서 생략합니다. (흐-)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;브렌센헴 알고리즘을 개략적으로 예를 들어 설명하자면,&lt;/p&gt;&lt;p&gt;그러니까... 무식한 예를 들죠.&lt;/p&gt;&lt;p&gt;만약 점이 0 아니면 1... 식의 정수값을 갖고,&lt;/p&gt;&lt;p&gt;그 증가율이 0.1이라면 어떻게 하겠습니까?&lt;/p&gt;&lt;p&gt;0.1, 0.2, 0.3, 0.4 까지는 그냥 0이라고 하고,&lt;/p&gt;&lt;p&gt;0.5부터 1이라고 하면 되겠죠?&lt;/p&gt;&lt;p&gt;그럼 이것을 아까의 과정으로 설명하죠.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;우선 증가율이 0.1이므로...&lt;/p&gt;&lt;p&gt;처음 점은 0.&lt;/p&gt;&lt;p&gt;그 다음엔..&lt;/p&gt;&lt;p&gt;거기에 0.1을 더하면 0.1. 이것은 0.5보다 작으므로&lt;/p&gt;&lt;p&gt;오차는 0.1인채로 넘어가죠.&lt;/p&gt;&lt;p&gt;또 0.1을 더하면 0.2, 이것도 0.5보다 작으므로&lt;/p&gt;&lt;p&gt;오차는 0.2 ...&lt;/p&gt;&lt;p&gt;이런식으로 오차는 계속 늘어갑니다.&lt;/p&gt;&lt;p&gt;이러다가 0.5가 되는 순간 점의 값은 1로 뛰게 됩니다.&lt;/p&gt;&lt;p&gt;그럼 이제 오차는 -0.4가 되죠.&lt;/p&gt;&lt;p&gt;즉 에러에서 0.9를 뺀 것입니다.&lt;/p&gt;&lt;p&gt;이제 또 0.1을 더하면 -0.3으로 아직 0.5보다 작습니다.&lt;/p&gt;&lt;p&gt;또 더하고... 이렇게 하다가 보면 다시 에러텀은&lt;/p&gt;&lt;p&gt;0.5보다 커지고 점의 값은 또한번 증가하게 됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그렇다면 이것의 스케일을 좀 넓혀보죠.&lt;/p&gt;&lt;p&gt;왜냐하면 당연한 얘기지만 비록 곱셈 없이 덧셈뺄셈만&lt;/p&gt;&lt;p&gt;썼다지만 위의 것은 실수를 썼잖아요.&lt;/p&gt;&lt;p&gt;이것을 정수화 하기 위해선 약간의 연산을 해야 합니다.&lt;/p&gt;&lt;p&gt;그러기 위해선 아주 기초적인 미분식이 들어가는데...&lt;/p&gt;&lt;p&gt;생략하고 결론을 말하죠.&lt;/p&gt;&lt;p&gt;위의 것을 정수화 하고, 다음에 주어진 인수에 따라&lt;/p&gt;&lt;p&gt;재구성하면,&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;처음의 에러텀은 당연히 0이고,&lt;/p&gt;&lt;p&gt;증가율은 End_X - Start_X ... 즉 X의 변화량,&lt;/p&gt;&lt;p&gt;에러텀의 한계는 X의 변화량을 2로 나눈 값,&lt;/p&gt;&lt;p&gt;에러텀이 한계를 넘었을 때 빼주는 수는 Y의 변화량.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이렇게 됩니다.&lt;/p&gt;&lt;p&gt;그럼 방금 위의 인수를 바탕으로 알고리즘을 설명하면,&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&quot;X의 값을 증가시킨 다음에 에러텀에 Delta_X를 더해준다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;그 결과 에러텀이 Delta_X / 2 의 값보다 크거나 같으면&lt;/p&gt;&lt;p&gt;&amp;nbsp;Y의 값을 증가시키고 에러텀에선 Delta_Y를 빼준다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;이 과정을 X가 선을 긋는 끝 좌표에 도달할 때까지 한다.&quot;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;하나 주의해야 할 것은 위의 경우는 X의 기울기가 Y의&lt;/p&gt;&lt;p&gt;기울기보다 컸을 때의 얘기라는 것입니다.&lt;/p&gt;&lt;p&gt;만약 그 반대라면 진행 과정도 반대가 됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이해가 가시나요? 제딴엔 최대한 자세히 설명한 것입니다.&lt;/p&gt;&lt;p&gt;아래에 실제 소스를 싣죠.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;void line2( int x1, int y1, int x2, int y2, char color )&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; int x, y, temp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; int delta_x, delta_y, half, error = 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; /* 한상 x2 &amp;gt;= x1, y2 &amp;gt; y1 이 되도록 한다. */&lt;/p&gt;&lt;p&gt;&amp;nbsp; if( x1 &amp;gt; x2 ){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; temp = x1;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; x1 = x2;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; x2 = temp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp; if( y1 &amp;gt; y2 ){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; temp = y1;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; y1 = y2;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; y2 = temp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; /* x, y의 변화량을 구한다. */&lt;/p&gt;&lt;p&gt;&amp;nbsp; delta_x = x2 - x1;&lt;/p&gt;&lt;p&gt;&amp;nbsp; delta_y = y2 - y1;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; /* 처음 시작점을 찍는다. */&lt;/p&gt;&lt;p&gt;&amp;nbsp; put_pixel( x1, y1, color );&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; /* 각 좌표의 기울에 따라 선을 긋는다. */&lt;/p&gt;&lt;p&gt;&amp;nbsp; if( delta_x &amp;gt; delta_y ){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; y = y1;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; half = (int)( delta_x / 2 );&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; for( x = x1+1; x &amp;lt;= x2; x ++ ){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; error += delta_y;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if( error &amp;gt; half ){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; y ++;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; error -= delta_x;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; put_pixel( x, y, color );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;} else {&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; x = x1;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; half = (int)( delta_y / 2 );&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; for( y = y1+1; y &amp;lt;= y2; y ++ ){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; error += delta_x;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if( error &amp;gt; half ){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; x ++;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; error -= delta_y;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; put_pixel( x, y, color );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이해가 가셨나 모르겠군요.&lt;/p&gt;&lt;p&gt;위의 예제는 Game13h에서 직접 실행할 수 있도록&lt;/p&gt;&lt;p&gt;만든 것입니다. 함수명을 line2()로 한 것도&lt;/p&gt;&lt;p&gt;Game13h하고 충돌하지 말라고 한 것입니다.&lt;/p&gt;&lt;p&gt;하지만 점찍는 함수를 가진 어떠한 라이브러리에서도&lt;/p&gt;&lt;p&gt;사용하실 수 있습니다.&lt;/p&gt;&lt;p&gt;소스를 보시면 호출한 함수라곤 put_pixel()밖에&lt;/p&gt;&lt;p&gt;없다는 것을 알 수 있을 것입니다.&lt;/p&gt;&lt;p&gt;이 함수의 용도는 지정한 화면상의 위치에 정해진&lt;/p&gt;&lt;p&gt;색으로 점을 찍는 함수입니다.&lt;/p&gt;&lt;p&gt;그러니 이 함수만 만드신다면 어떤 스크린 모드에서도&lt;/p&gt;&lt;p&gt;사용하실 수 있습니다.&lt;/p&gt;&lt;p&gt;만약 기회가 난다면 브렌센헴 알고리즘?보완한&lt;/p&gt;&lt;p&gt;알고리즘을 올리도록 하고, 지금은 이것으로 끝냅니다.&lt;/p&gt;&lt;p&gt;다음엔 원 그리는 부분을 올리도록 하겠습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- ID빌려쓰는 빈대 경민...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;게제동 강좌란&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;제 &amp;nbsp; 목 &amp;nbsp; &amp;nbsp;[PROG] 브렌슨헴 알고리즘 - 2&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;작성자 &amp;nbsp; &amp;nbsp;김학규 (neolith)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;작성일 &amp;nbsp;03-13 &amp;nbsp;조회수 &amp;nbsp;1246 &amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;정영태 &amp;nbsp; (viracoza)&lt;/p&gt;&lt;p&gt;[강좌] 브렌센헴 알고리즘 #2/3 - 원 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 03/01 14:52 &amp;nbsp; 198 line&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;저번 강좌에 이어 이번엔 브렌센헴 알고리즘으로&lt;/p&gt;&lt;p&gt;원을 그리는 방법을 살펴 보겠습니다.&lt;/p&gt;&lt;p&gt;아시는 분은 다 아시다시피 이 브렌센헴 알고리즘은&lt;/p&gt;&lt;p&gt;구현이 쉽고 빠른 대신에 그 질이 좋지 못하다는&lt;/p&gt;&lt;p&gt;단점을 갖고 있습니다.&lt;/p&gt;&lt;p&gt;이것은 직선보다 원이 더 심합니다.&lt;/p&gt;&lt;p&gt;특히 타원의 경우엔 별도의 보완책 없이 쓰면&lt;/p&gt;&lt;p&gt;더욱 엉망이 되고 맙니다.&lt;/p&gt;&lt;p&gt;또한 여기선 화면의 종횡비는 계산에 넣지&lt;/p&gt;&lt;p&gt;않기로 하겠습니다.&lt;/p&gt;&lt;p&gt;모두 아시다시피 그래픽 모드마다 화면의 종횡비는&lt;/p&gt;&lt;p&gt;조금씩 다릅니다. 오직 몇가지 모드만이 정사각형&lt;/p&gt;&lt;p&gt;픽셀을 제공하는데, 모드 12h가 대표적인 예이죠.&lt;/p&gt;&lt;p&gt;그래픽 종횡비 보정을 해야 그래픽 모드에 상관없이&lt;/p&gt;&lt;p&gt;제대로 된 원을 그릴 수 있으나,&lt;/p&gt;&lt;p&gt;이번 강좌에선 그 부분을 빼기로 하겠습니다.&lt;/p&gt;&lt;p&gt;물론 그 부분이 어려워서는 아닙니다.&lt;/p&gt;&lt;p&gt;하지만 이 강좌는 브렌센헴 알고리즘만을 설명하기&lt;/p&gt;&lt;p&gt;위한 강좌이므로 주제에서 벋어난 부분의 설명은&lt;/p&gt;&lt;p&gt;가능한 한 줄일 생각입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;브렌센헴의 알고리즘은 직선이든 원이든&amp;nbsp;&lt;/p&gt;&lt;p&gt;그 전개 과정은 거의 흡사합니다.&lt;/p&gt;&lt;p&gt;어차피 에러텀에 일정 수를 더하고 그것이&lt;/p&gt;&lt;p&gt;일정 한도가 될 때까지 진행하다가 다음 순간&lt;/p&gt;&lt;p&gt;y의 값이 증가하고...&lt;/p&gt;&lt;p&gt;실제 그 과정에 대한 설명은 전 강좌를 봐 주시기&lt;/p&gt;&lt;p&gt;바랍니다.&lt;/p&gt;&lt;p&gt;그럼 직선과 원이 뭐가 달라지느냐...&lt;/p&gt;&lt;p&gt;이제 그것을 설명할까 합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;우선 원은 모든 방향이 대칭이 됩니다.&lt;/p&gt;&lt;p&gt;원을 그릴 때는 기본 4방향 대칭을 이용합니다.&lt;/p&gt;&lt;p&gt;그러나 이럴 경우엔 약간의 문제가 생깁니다.&lt;/p&gt;&lt;p&gt;처음 45도는 제대로 그려지다가 나중엔&lt;/p&gt;&lt;p&gt;X의 좌표 변화율에 비해 Y좌표 변화율이&lt;/p&gt;&lt;p&gt;너무 커져서 점이 떨어지게 됩니다.&lt;/p&gt;&lt;p&gt;그래서 45도씩 그려서 그것을 다시 대칭시킵니다.&lt;/p&gt;&lt;p&gt;이것은 원이 모든 방향으로 대칭된다는&lt;/p&gt;&lt;p&gt;성질로 쉽게 증명이 됩니다.&lt;/p&gt;&lt;p&gt;그러니 실제론 원이라기 보다 곡선으로 이루어진&lt;/p&gt;&lt;p&gt;8각형이라고 하는 것이 낫겠군요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;실제로 원을 그릴 때는 45도 각도만 그리고&lt;/p&gt;&lt;p&gt;그것을 8방향으로 대칭 시킵니다.&lt;/p&gt;&lt;p&gt;그러니 기울기에 따라 그리는 루틴이 갈릴&lt;/p&gt;&lt;p&gt;필요도 없겠죠.&lt;/p&gt;&lt;p&gt;무조건 증가 성분만 있는 부분을 그린 다음에&lt;/p&gt;&lt;p&gt;8방향으로 대칭 시키면 되니까요.&lt;/p&gt;&lt;p&gt;그럼에도 불구하고 원을 그리는 알고리즘은&lt;/p&gt;&lt;p&gt;직선에 비해 신경써줘야 할 부분이 좀 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;우선 대칭이 되는 네 점을 나열해 보겠습니다.&lt;/p&gt;&lt;p&gt;만약 원점이 (0,0)이라면 임의의 원상의 점 (x,y)는&lt;/p&gt;&lt;p&gt;각각 (y,x), (x,-y), (y,-x), (-x,y), (-y,x), (-x,-y),&lt;/p&gt;&lt;p&gt;(-y,-x)와 대칭됩니다.&lt;/p&gt;&lt;p&gt;만약 원점이 (x0, y0)라면, 이것은 알고리즘에 의해&lt;/p&gt;&lt;p&gt;구해진 (x,y)에 대해,&lt;/p&gt;&lt;p&gt;(x0+x, y0+y), (x0+x, y0-y), (x0+y, y0+x),&lt;/p&gt;&lt;p&gt;(x0+y, y0-x), (x0-x, y0+y), (x0-y, y0+x),&lt;/p&gt;&lt;p&gt;(x0-x, y0-y), (x0-y, y0-x) 의 팔방향으로&lt;/p&gt;&lt;p&gt;대칭된 점들이 구해집니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제 원을 그리는 알고리즘을 위해 실제&lt;/p&gt;&lt;p&gt;원의 방정식에서 각 점의 위치를 구하는 식을&lt;/p&gt;&lt;p&gt;분석해 보기로 하겠습니다.&lt;/p&gt;&lt;p&gt;설명을 쉽게 하기 위해 원점을 (0,0)이라고&lt;/p&gt;&lt;p&gt;하겠습니다. 실제로 이렇게 구해진 x,y는&lt;/p&gt;&lt;p&gt;위의 방법을 사용해 실제 점으로 환원할 수&lt;/p&gt;&lt;p&gt;있습니다. 반지름은 ratio라고 합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;우선 원상의 점중에 1/8만을 구합니다.&lt;/p&gt;&lt;p&gt;어느 방향을 하든 상관없지만 이왕이면&lt;/p&gt;&lt;p&gt;x는 증가, y는 감소하는 원의 우상단 부분을&lt;/p&gt;&lt;p&gt;사용합니다. 그럼 x는 0부터 시작해서 y까지&lt;/p&gt;&lt;p&gt;한다고 하면 됩니다.&lt;/p&gt;&lt;p&gt;왜냐하면 x와 y의 반지름에 관한 관계는&lt;/p&gt;&lt;p&gt;서로 동등하므로 만약 이 두값이 같다면 1/8의&lt;/p&gt;&lt;p&gt;지점에 도달한 것이기 때문입니다.&lt;/p&gt;&lt;p&gt;(이런 것까지 증명해줄 필요는 없겠죠?)&lt;/p&gt;&lt;p&gt;물론 y값도 상수가 아닙니다. 그러니 루프의&lt;/p&gt;&lt;p&gt;횟수는 처음부터 정해진 것이 아닙니다.&lt;/p&gt;&lt;p&gt;루프가 진행되어 감에 따라 일정한 규칙에&lt;/p&gt;&lt;p&gt;따라 y좌표도 감소하므로 대체로 처음 정한&lt;/p&gt;&lt;p&gt;y값보다 작은 횟수로 루프가 끝나기 마련입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;출발좌표가 (0, ratio)이므로 다음 점의 좌표는&lt;/p&gt;&lt;p&gt;(1, ratio) 이든가 (1, ratio-1)이 될 것입니다.&lt;/p&gt;&lt;p&gt;이 둘중에 어느것인지 판단하는 것은 전 강좌의&lt;/p&gt;&lt;p&gt;직선의 에러텀을 연상하십시요.&lt;/p&gt;&lt;p&gt;다음 점을 구하면 이것이 무엇이든간에 이론적인&lt;/p&gt;&lt;p&gt;원의 점에서 보면 오차가 있습니다.&lt;/p&gt;&lt;p&gt;이 오차의 절대값을 d라고 놓으면,&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;d = |(x² + y²) - ratio²|&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;라는 식이 성립합니다.&lt;/p&gt;&lt;p&gt;이제 위에서 얘기한 (1, ratio)와 (1, ratio-1)&lt;/p&gt;&lt;p&gt;를 사용해 오차를 각각 구할 수 있습니다.&lt;/p&gt;&lt;p&gt;그럼 이 오차가 작은 경우가 우리가 구하고자&lt;/p&gt;&lt;p&gt;하는 점이겠죠?&lt;/p&gt;&lt;p&gt;편이상 (1, ratio)의 오차를 d(S₁),&lt;/p&gt;&lt;p&gt;(1, ratio-1)의 오차를 d(D₁)라고 놓겠습니다.&lt;/p&gt;&lt;p&gt;그럼 d(D₁) - d(S₁)의 값이 0보다 작으면&lt;/p&gt;&lt;p&gt;점이 감소한 것이고, 그렇지 않으면 점은 감소하지&lt;/p&gt;&lt;p&gt;않은 것입니다. 점이 감소했다면 그 오차에서&lt;/p&gt;&lt;p&gt;일정 값을 빼 줍니다. 이것은 전 강좌에서도&lt;/p&gt;&lt;p&gt;언급한 적이 있으니 설명은 생략합니다.&lt;/p&gt;&lt;p&gt;이런 과정을 x를 증가시켜가며 진행해서 원의&lt;/p&gt;&lt;p&gt;1/8의 정도를 그릴 때까지 반복합니다.&lt;/p&gt;&lt;p&gt;x가 언제 1/8지점까지 왔는가는 곧 설명합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이정도 했으면 원 그리기 알고리즘의 대략적인&lt;/p&gt;&lt;p&gt;설명이 되었다고 생각합니다.&lt;/p&gt;&lt;p&gt;브렌센헴 알고리즘을 설명하기 위해 약간&lt;/p&gt;&lt;p&gt;바람을 잡은 셈이죠.&lt;/p&gt;&lt;p&gt;이제부터가 진짜 브렌센헴 알고리즘입니다.&lt;/p&gt;&lt;p&gt;위의 대략적인 이해가 끝났다면 스스로&lt;/p&gt;&lt;p&gt;브렌센헴 알고리즘의 구조를 머릿속에&lt;/p&gt;&lt;p&gt;떠올릴 수 있을 것입니다.&lt;/p&gt;&lt;p&gt;수학이 골치아프시다는 분은 그냥 아래 설명과&lt;/p&gt;&lt;p&gt;소스를 보십시요.&lt;/p&gt;&lt;p&gt;저도 수학과지만 수학은 무지 골치아픕니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;원의 방정식에서 브렌센헴 알고리즘을&lt;/p&gt;&lt;p&gt;이끌어 내는 과정은 생략합니다.&lt;/p&gt;&lt;p&gt;솔직히 말하면 저도 하라면 헛갈려서&lt;/p&gt;&lt;p&gt;못해요. 유도식을 보고서야 할 수 있죠.&lt;/p&gt;&lt;p&gt;흐흐- 이해는 하지만 하라면 못하는 것...&lt;/p&gt;&lt;p&gt;이것이 우리나라 교육의 문제랄까?&lt;/p&gt;&lt;p&gt;얘기가 잠깐 옆으로 샜는데...&lt;/p&gt;&lt;p&gt;간단히 말씀드리죠.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;우선 초기값으로 x, y, thres를 설정합니다.&lt;/p&gt;&lt;p&gt;여기서 thres는 에러텀 비슷한 것인데&lt;/p&gt;&lt;p&gt;아주 약간 다릅니다. 어떻게 다른가는&lt;/p&gt;&lt;p&gt;설명이 애매하니 생략합니다.(생략 투성이군...)&lt;/p&gt;&lt;p&gt;x의 초기값은 0, y의 초기값은 반지름, thres는&lt;/p&gt;&lt;p&gt;3에서 지름을 뺀 값으로 합니다.&lt;/p&gt;&lt;p&gt;그리고 루프를 시작하는데...&lt;/p&gt;&lt;p&gt;그 종결조건은 x가 y보다 커지는 경우입니다.&lt;/p&gt;&lt;p&gt;만약 thres가 0보다 작으면 thres를&lt;/p&gt;&lt;p&gt;6 + x * 4만큼 증가시킵니다. 그렇지 않다면&lt;/p&gt;&lt;p&gt;thres는 10 + (x - y) * 4만큼 증가시키고&lt;/p&gt;&lt;p&gt;y를 하나 감소시킵니다.&lt;/p&gt;&lt;p&gt;이렇게 하면 x와 y의 값이 모두 구해지므로&lt;/p&gt;&lt;p&gt;원점을 중심으로 8방향으로 점을 모두 찍습니다.&lt;/p&gt;&lt;p&gt;여기까지가 루프이며, 이제 x를 증가시키면 되죠.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;하나 예외적인 상황이 있는데,&lt;/p&gt;&lt;p&gt;반지름이 0인 경우죠. 이럴 경우엔 점 하나만을 찍은&lt;/p&gt;&lt;p&gt;채 함수를 종결합니다.&lt;/p&gt;&lt;p&gt;자, 아래 소스가 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;void circle2( int x0, int y0, word ratio, byte color )&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;int x, y, thres;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;if( ratio == 0 ){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;put_pixel( x0, y0, color );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;return;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;y = ratio;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;thres = 3 - (ratio + ratio);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;for( x = 0; x &amp;lt; y; x ++ ){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;if( thres &amp;lt; 0 )&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;thres += 6 + (x &amp;lt;&amp;lt; 2);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; else{&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;thres += 10 + ((x - y) &amp;lt;&amp;lt; 2);&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;y --;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;put_pixel( x0+x, y0+y, color ); put_pixel( x0+y, y0+x, color );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;put_pixel( x0-x, y0+y, color ); put_pixel( x0-y, y0+x, color );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;put_pixel( x0+x, y0-y, color ); put_pixel( x0+y, y0-x, color );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;put_pixel( x0-x, y0-y, color ); put_pixel( x0-y, y0-x, color );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; }&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;전번 강좌와 마찬가지로 점찍는 함수를 갖춘 다른 모든&lt;/p&gt;&lt;p&gt;프로그램에서 사용이 가능합니다.&lt;/p&gt;&lt;p&gt;이번에도 어제처럼 날림으로 강좌를 끝냈는데,&lt;/p&gt;&lt;p&gt;이유는(핑계는) 전산학도나 수학도를 위한 공식 유도가&lt;/p&gt;&lt;p&gt;아니라 브렌센헴 알고리즘이 이렇다 싶은 정도만&lt;/p&gt;&lt;p&gt;얘기하고 실제로 컴퓨터로 옮기는 것만을 설명하는 것이&lt;/p&gt;&lt;p&gt;이 강좌의 목적이기 때문입니다.&lt;/p&gt;&lt;p&gt;아마 다음 강좌인 타원 그리기 알고리즘은 더욱 날림이&lt;/p&gt;&lt;p&gt;될 것입니다. 원 그리기보다 배는 복잡하니까요.&lt;/p&gt;&lt;p&gt;그리고 제가 브렌센헴 알고리즘을 공부하기 시작한 것도&lt;/p&gt;&lt;p&gt;그렇게 오래되지 않았으니 강좌에서 틀린 부분도 있을&lt;/p&gt;&lt;p&gt;것입니다. 만약 그렇다면 아주 마음 놓고 씹어주세요.&lt;/p&gt;&lt;p&gt;언제든 칼맞을 준비가 되어 있습니다. (헤-)&lt;/p&gt;&lt;p&gt;그럼 조금이라도 도움이 되었기를...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - ID빌려쓰는 빈대 경민...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;게제동 강좌란&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;제 &amp;nbsp; 목 &amp;nbsp; &amp;nbsp;[PROG] 브렌슨헴 알고리즘 - 3&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;작성자 &amp;nbsp; &amp;nbsp;김학규 (neolith)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;작성일 &amp;nbsp;03-13 &amp;nbsp;조회수 &amp;nbsp;1233 &amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;정영태 &amp;nbsp; (viracoza)&lt;/p&gt;&lt;p&gt;[강좌] 브렌센헴 알고리즘 #3/3 - 타원 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 03/02 21:39 &amp;nbsp; 184 line&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;안녕하세요?&lt;/p&gt;&lt;p&gt;제가 개강 때문에 좀 바빠서 강좌가&lt;/p&gt;&lt;p&gt;늦어졌습니다. 원래 계획으론 하루에&lt;/p&gt;&lt;p&gt;하나씩 3일에 다 끝낼려고 했는데...&lt;/p&gt;&lt;p&gt;이번엔 브리슨헴 알고리즘 강좌&lt;/p&gt;&lt;p&gt;마지막인 타원 그리기입니다.&lt;/p&gt;&lt;p&gt;하나 미리 얘기해 둘 것은,&lt;/p&gt;&lt;p&gt;비록 여기에 브렌센헴 알고리즘의&lt;/p&gt;&lt;p&gt;강좌라지만 이 타원 그리기 알고리즘은&lt;/p&gt;&lt;p&gt;브렌센헴 알고리즘이 아닙니다.&lt;/p&gt;&lt;p&gt;실제 그 구현을 보면 브렌센헴 알고리즘과&lt;/p&gt;&lt;p&gt;유사하지만 어느 참고서적에서도 이것을&lt;/p&gt;&lt;p&gt;브렌센헴 알고리즘이라고 하지 않습니다.&lt;/p&gt;&lt;p&gt;하지만 연관관계도 있고, 그 구현면에서도&lt;/p&gt;&lt;p&gt;유사하니까 이 강좌에선 같은 계열에서&lt;/p&gt;&lt;p&gt;취급하는 것입니다.&lt;/p&gt;&lt;p&gt;이점 착오 없으시기 바랍니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;척 보기에도 알 수 있듯이, 타원의 방정식은&lt;/p&gt;&lt;p&gt;원의 방정식보다 어렵습니다.&lt;/p&gt;&lt;p&gt;그리고 속도도 더 늦고요.&lt;/p&gt;&lt;p&gt;하지만 약간 변형을 하면 상당히 빠른 속도를&lt;/p&gt;&lt;p&gt;낼 수도 있습니다. 이 알고리즘의 이름은&lt;/p&gt;&lt;p&gt;모르겠지만 구현 방법면에선 할 하드베르그의&lt;/p&gt;&lt;p&gt;알고리즘과 유사하므로 그쪽 계통이 아닌가&lt;/p&gt;&lt;p&gt;생각됩니다. 속도는 무척 빠르지만&lt;/p&gt;&lt;p&gt;여기서는 다루지 않겠습니다.&lt;/p&gt;&lt;p&gt;만약 얘기를 하자면 원그리기까지&lt;/p&gt;&lt;p&gt;또다시 거슬러 올라가야 하기 때문입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;타원은 원의 경우와는 달리 4방향이 대칭됩니다.&lt;/p&gt;&lt;p&gt;그리고 단순 증가방식만을 쓰지 않습니다.&lt;/p&gt;&lt;p&gt;타원의 경우엔 선그리기처럼 45도를&lt;/p&gt;&lt;p&gt;기점으로 그 기울기(?)가 다르므로 구현할 때도&lt;/p&gt;&lt;p&gt;이 두경우를 나누어서 해 주어야 합니다.&lt;/p&gt;&lt;p&gt;그러니 실제론 4분의 1만을 그리고 나머지는&lt;/p&gt;&lt;p&gt;대칭으로 찍으면 되고, 또 이 1/4도 두가지로&lt;/p&gt;&lt;p&gt;나누어서 그려야 합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 알고리즘을 위한 설명은 따로 존재하지 않고&lt;/p&gt;&lt;p&gt;앞에서 한 설명을 바탕으로 유도식만을&lt;/p&gt;&lt;p&gt;보입니다. 실력이 있는 분들은 이해하실 수 있을&lt;/p&gt;&lt;p&gt;것입니다. 만약 이해가 안된다면 다른 참고서적들을&lt;/p&gt;&lt;p&gt;참고하세요. 아마 많은 그래픽 서적에서 이것을&lt;/p&gt;&lt;p&gt;다루고 있을 것입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;유도식이 긴 관계로 초기항과 결과만을 쓰기로&lt;/p&gt;&lt;p&gt;하겠습니다.&lt;/p&gt;&lt;p&gt;우선 타운의 방정식이&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; (x0 - x)? &amp;nbsp;(y0 - y)?&lt;/p&gt;&lt;p&gt;&amp;nbsp; ──── &amp;nbsp;- ──── &amp;nbsp;= 1&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;a? &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; b?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이라는 것은 후진 중학교 안나온 이상 다 아는&lt;/p&gt;&lt;p&gt;사실. 이것을 약간 변형시켜서,&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; b?x? + a?y?- a?b? = 0&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;이라고 놓고 이것을 앞의 방법을 통해 d를 구하면&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; d = b?(x+1)?+a?(y-1/2)?-a?b?&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;이고, 각각 d₁,d₂, d₃... 에 대해&amp;nbsp;&lt;/p&gt;&lt;p&gt;d₂- d₁, d₃- d₂... 등을 구하면&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;d₂- d₁= -2a²y₁&lt;/p&gt;&lt;p&gt;&amp;nbsp;d₃- d₂= -2a²y₂&lt;/p&gt;&lt;p&gt;&amp;nbsp;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;이다. 이것은 기울기, 즉 dy/dx가 -1 이상일&lt;/p&gt;&lt;p&gt;때이고, 만약 기 이하라면&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;d₂- d₁= -2a²y₁+ a²&lt;/p&gt;&lt;p&gt;&amp;nbsp;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;으로 바뀝니다.&lt;/p&gt;&lt;p&gt;또한 생각해 줘야 할 것이 한두개 더 있지만&lt;/p&gt;&lt;p&gt;설명을 생략하기로 합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이렇게 생각해 줘야 할 경우가 두가지인데다가&lt;/p&gt;&lt;p&gt;그 성격이 다르기 때문에 타원을 그리는 데엔&lt;/p&gt;&lt;p&gt;크게 나누어 두개의 다른 루프를 돌려야 합니다.&lt;/p&gt;&lt;p&gt;게다가 루프 내에서 당연히 판단 루프가&lt;/p&gt;&lt;p&gt;들어가죠. 총 4가지의 다른 상황을 처리하는&lt;/p&gt;&lt;p&gt;함수로 타원 그리는 함수는 구성되어 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;대략적으로 설명한대다가 알고리즘을 구현하기&lt;/p&gt;&lt;p&gt;위해 충분한 자료를 다 제시하지 못했습니다.&lt;/p&gt;&lt;p&gt;이유는 앞서 말했듯이 알고리즘 자체에&lt;/p&gt;&lt;p&gt;대한 강좌라기 보다는 소개와 실제 그 소스를&lt;/p&gt;&lt;p&gt;공개하는 데에 그 목적을 두기 때문입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;void ellipse2( int x0, int y0, word a0, word b0, byte color )&lt;/p&gt;&lt;p&gt;{&lt;/p&gt;&lt;p&gt;&amp;nbsp; int x = 0, y = b0;&lt;/p&gt;&lt;p&gt;&amp;nbsp; long a = a0, b = b0;&lt;/p&gt;&lt;p&gt;&amp;nbsp; long a_squ = a * a;&lt;/p&gt;&lt;p&gt;&amp;nbsp; long two_a_squ = a_squ &amp;lt;&amp;lt; 1;&lt;/p&gt;&lt;p&gt;&amp;nbsp; long b_squ = b * b;&lt;/p&gt;&lt;p&gt;&amp;nbsp; long two_b_squ = b_squ &amp;lt;&amp;lt; 1;&lt;/p&gt;&lt;p&gt;&amp;nbsp; long d, dx, dy;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; d = b_squ - a_squ*b + (a_squ &amp;gt;&amp;gt; 2);&lt;/p&gt;&lt;p&gt;&amp;nbsp; dx = 0;&lt;/p&gt;&lt;p&gt;&amp;nbsp; dy = two_a_squ * b;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; while( dx &amp;lt; dy ){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; put_pixel( x0+x, y0+y, color );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; put_pixel( x0-x, y0+y, color );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; put_pixel( x0+x, y0-y, color );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; put_pixel( x0-x, y0-y, color );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if( d &amp;gt; 0 ){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; y --;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dy -= two_a_squ;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; d -= dy;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; x ++;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; dx += two_b_squ;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; d += b_squ + dx;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; d += ( 3*(a_squ - b_squ)/2 - (dx+dy)/2 );&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; while( y &amp;gt;= 0 ){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; put_pixel( x0+x, y0+y, color );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; put_pixel( x0-x, y0+y, color );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; put_pixel( x0+x, y0-y, color );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; put_pixel( x0-x, y0-y, color );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; if( d &amp;lt; 0 ){&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; x ++;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; dx += two_b_squ;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; d += dx;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; y --;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; dy -= two_a_squ;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; d += a_squ - dy;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;}&lt;/p&gt;&lt;p&gt;}&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;앞의 두 강좌와 마찬가지로 점찍는 기능을 가진 다른&lt;/p&gt;&lt;p&gt;모든 프로그램에서 실행이 됩니다.&lt;/p&gt;&lt;p&gt;아마 설명이 그다지 잘 되지 못했을테고,&lt;/p&gt;&lt;p&gt;게다가 알고리즘 구현에 필요한 것을 전부&lt;/p&gt;&lt;p&gt;설명하지 못했기 때문에 설명 자체만으로 프로그램을&lt;/p&gt;&lt;p&gt;짤 수는 없을 것입니다. 설명이 미흡하다고 생각하면&lt;/p&gt;&lt;p&gt;다른 참고서적을 살피고, 실력이 있으시다면&lt;/p&gt;&lt;p&gt;소스와 앞에서 설명한 몇가지 자료만으로 직접 분석해&lt;/p&gt;&lt;p&gt;보시기 바랍니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;미흡한 강좌, 끝까지 봐 주신 여러분께 감사드립니다.&lt;/p&gt;&lt;p&gt;한번 그래픽 이론을 알고 싶다고 생각하고 보신&lt;/p&gt;&lt;p&gt;분들은 실망이 크시겠지만 그냥 한번 어떤 것인가&lt;/p&gt;&lt;p&gt;맛만 보겠다고 생각하시고 강좌를 보신 분들은&lt;/p&gt;&lt;p&gt;약간 도음이 되셨을 것입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;요즘 게임들이 테크닉 위주로 많이 나가는데,&lt;/p&gt;&lt;p&gt;이제는 테크닉보다 탄탄한 자료 구조와 이론을&lt;/p&gt;&lt;p&gt;바탕으로 그곳의 위에 화려한 테크닉의 옷을&lt;/p&gt;&lt;p&gt;입힌 알찬 게임이 많이 나왔으면 좋겠습니다.&lt;/p&gt;&lt;p&gt;특히 3차원 게임에 관한 관심이 높아지는데&lt;/p&gt;&lt;p&gt;조금 아는 듯 싶다 하는 분들이 자신의 소스를&lt;/p&gt;&lt;p&gt;공개하길 꺼리는 것 같군요.&lt;/p&gt;&lt;p&gt;저도 좀 많이 배우고 싶은데...&lt;/p&gt;&lt;p&gt;아무쪼록 혹시나 3차원 그래픽 쪽으로 지식이&lt;/p&gt;&lt;p&gt;조금 있는 분께서 이 글을 읽으신다면&lt;/p&gt;&lt;p&gt;우리나라 게임의 발전을 위해서도&lt;/p&gt;&lt;p&gt;소스를 팍팍 공개하시고, 강좌도 하시면서&lt;/p&gt;&lt;p&gt;자신의 지식을 아낌없이 나누어 주시길 바랍니다.&lt;/p&gt;&lt;p&gt;그럼...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- ID빌려쓰는 빈대 경민...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;덧붙이는 말 : 앞 강좌에서 '브렌센헴'이라는 발음을 썼는데,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;실은 '브리슨헴'이라는 발음이 맞습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;그리고 강좌에 의문이 있으신 분은 메일 주세요.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;강좌와 직접 관계없는 질문도 상관 없습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;게제동 강좌란&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;제 &amp;nbsp; 목 &amp;nbsp; &amp;nbsp;[PROG] 신기한 벡터의 내적과 외적&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;작성자 &amp;nbsp; &amp;nbsp;이태경 (수퍼유저)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;작성일 &amp;nbsp;08-23 &amp;nbsp;조회수 &amp;nbsp;1013 &amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;벡터의 내적과 외적, 법선벡터를 알자.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;먼저 벡터의 내적과 외적을 알기전에 벡터에 대해 조금만 얘기하겠습니다.&lt;/p&gt;&lt;p&gt;당연히 수학적인 부분이지만 초등학생도 알수 있도록 쉽게....&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;1. 벡터&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 2차원 좌표상에 점을 표시할때 일반적으로 x,y 두개의 좌표를 가지고&lt;/p&gt;&lt;p&gt;&amp;nbsp; 화면의 점을 그린다. 이때 수학적으로 점이란 눈에 안보이는 것이지만&lt;/p&gt;&lt;p&gt;&amp;nbsp; 점을 구성하는 좌표 성분으로 P(x,y)라고 지정한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 벡터란 원점을 기준으로한 점이라고 생각하면 쉽게 설명할 수 있을 것&lt;/p&gt;&lt;p&gt;&amp;nbsp; 이다. V(x,y)를 표시할때 결국 (0,0)에서 (x,y)의 방향을 가르키는&lt;/p&gt;&lt;p&gt;&amp;nbsp; 말이며 v(2,2)와 v(3,3)은 결국 크기만 다르지 같은 방향을 가르키고&lt;/p&gt;&lt;p&gt;&amp;nbsp; 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2. 단위 벡터의 특성&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 단위 벡터란 크기가 1인 벡터를 얘기한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 0 에서 1까지의 실수는 아무리 곱해서 절대로 1을 넘지 않는다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; 이 특성이 단위 벡터에서도 나타난다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; 단위 벡터끼리 곱하는 연산은 1000만번을 한다하더라도 단위 벡터다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; 사실 위의 예기는 아주 중요한 얘기이며 이 간단한 사실만으로&lt;/p&gt;&lt;p&gt;&amp;nbsp; 연산을 아주 간소화 할수 있다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 그럼, 단위 벡터는 어떻게 만드는가?&lt;/p&gt;&lt;p&gt;&amp;nbsp; v(1,1)와 v(2,2)는 크기가 다르지만 방향을 같다고 했다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; 두 벡터를 크기는 무시하고 오직 방향만 계산하고 싶다고 할때&lt;/p&gt;&lt;p&gt;&amp;nbsp; 단위 벡터를 만든다. 결국 크기는 1이니까..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 같은수에다 같은수를 나누어 보라..&lt;/p&gt;&lt;p&gt;&amp;nbsp; 예를 들어 8 / 8 = 1, 7676 / 7676 = 1&lt;/p&gt;&lt;p&gt;&amp;nbsp; 역시 1이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 단위 벡터도 이렇게 구한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 벡터 v(x,y)가 있을때 벡터의 크기는 sqrt(x*x + y*y)이다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; 그럼, 이걸로 나누면 땡이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; v = sqrt(x*x + y*y);&lt;/p&gt;&lt;p&gt;&amp;nbsp; vx /= v ;&lt;/p&gt;&lt;p&gt;&amp;nbsp; vy /= v ;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 이제 벡터의 크기를 구해보자..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 크기 = sqrt(x*x + y*y)는 1이 나와야 한다.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 이것은 영어로 Normalize라고 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;3. 벡터의 내적&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 이제 좀 어려운 부분을 얘기 하겠습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; 벡터의 내적은 꼴도보기 싫은 수학정석에 나와 있습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; 영어로 DotProduct 혹은 inner-Product, Scalar-Product라고 하더군요..&lt;/p&gt;&lt;p&gt;&amp;nbsp;벡터의 내적 공식은 두 벡터가 있을때 두 벡터 사이의 각도를&lt;/p&gt;&lt;p&gt;&amp;nbsp; 구하는 공식이죠..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 그럼.. &amp;nbsp;꼴도보기 싫은 수학정석에&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; cos(theta) = a*b / |a|*|b| 라고 되어 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; (참고) *는 곱셈이 아니고 . 이지만... 표기할게 없어서..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 공식이 어떻게 나왔나고 묻지는 마세요.. 책에 그렇게 되어 있기에..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 위 공식에서 만일 a와 b가 단위 벡터라면 |a|*|b|는 1이겠지요..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 그럼.. cos(theta)= a*b로 간략화 營윱求?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; a*b 벡터의 연산은 성분끼리 곱하면 됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; cos(theta) = a_x*b_x + a_y*b_y ;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; (예)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; float a_x, a_y, b_x, b_y;&lt;/p&gt;&lt;p&gt;&amp;nbsp; float v, costheta, theta;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; a_x = 1.0; &amp;nbsp; &amp;nbsp;a_y = 3.0;&lt;/p&gt;&lt;p&gt;&amp;nbsp; b_x = 3.0; &amp;nbsp; &amp;nbsp;b_y = 1.0;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; // 먼저 단위 벡터로 만든다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; v = sqrt(a_x * a_x + a_y * a_y);&lt;/p&gt;&lt;p&gt;&amp;nbsp; a_x /= v;&lt;/p&gt;&lt;p&gt;&amp;nbsp; a_y /= v;&lt;/p&gt;&lt;p&gt;&amp;nbsp; v = sqrt(b_x * b_x + b_y * b_y);&lt;/p&gt;&lt;p&gt;&amp;nbsp; b_x /= v;&lt;/p&gt;&lt;p&gt;&amp;nbsp; b_y /= v;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; theta = a_x*b_x + a_y*b_y ;&lt;/p&gt;&lt;p&gt;&amp;nbsp; costheta = cos(theta);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 음.. 이제 costheta를 구했다면 황당한 값이 나옵니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 이걸가지고 어떻게 하란 말야..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; cos(theta) = rad 라고 했을때&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; theta = acos(rad) 이렇게 역으로 구할수 笭윱求?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 그럼 위의 프로그램에 더 첨가합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; theta = acos(costheta);&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 결국 우리가 바라는 벡터 사이의 각이 나왔습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 신기하져?&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; (참고) 라디안 값&lt;/p&gt;&lt;p&gt;&amp;nbsp; 일반적으로 sin, cos, tan 함수에서 sin(theta) = rad 일&lt;/p&gt;&lt;p&gt;&amp;nbsp; theta = asin(rad) 이렇게 역함수가 존재 합니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; tan는 atan 흔히들 아크 함수라고 하져..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 그리고 각도를 얘기할때 0~360도 얘기하는 것은 Degrees 값이라고&lt;/p&gt;&lt;p&gt;&amp;nbsp; 하며 수학에서는 보통 Radian 값을 씁니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 0에서 180까지의 Degree 값을 얘기할때 라디안 값은&lt;/p&gt;&lt;p&gt;&amp;nbsp; 0에서 3.141592(즉 PI) 값까지 나오지요..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 180 : 3.141592 = degree : rad &amp;nbsp;이렇게 되지요..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; rad = degree * 3.141592654f / 180 ;&lt;/p&gt;&lt;p&gt;&amp;nbsp; degree = rad * 180 / 3.141592654f ;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 그럼. 다시 벡터를 얘기합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; theta = acos(costheta); 에서 나온 값은 라디안 값이므로&lt;/p&gt;&lt;p&gt;&amp;nbsp; degree = theta* 180 / 3.141592654f ;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; 해보면 일반적인 각도가 나옵니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;4. 벡터의 외적&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;벡터의 외적이 꼴도 보기 싫은 고등학교 수학 정석에 있었는지는&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;잘 모르겠네요.. 뒷장까지 본적이 없어서..&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;벡터의 외적은 그럼 무엇일까요? 벡터 사이의 각이 아닌&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;반대 방향 각을 구하는 공식일까요? 아닙니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;벡터의 내적과는 성격이 좀 다릅니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;벡터의 내적은 결국 라디안 실수 값이 나오지만&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;외적을 구하는 공식은 그냥 벡터가 하나 더 생깁니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;두개의 벡터가 있을 기준점에 수직으로 못을 하나 꽂으면&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;못 방향으로 벡터가 하나 생깁니다. 두 벡터에 수직인 벡터&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;가 하나 더 생기는 셈이지요..&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;영어로 CrossProduct라고 하져..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;그림으로 설명하면 더 쉬운데... 쩝..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;v1(x,y,z)와 v2(x,y,z)가 있을 (0,0,0)을 출발점으로 한 위로&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;우뚝선 벡터 n(x,y,z)가 하나 더 생긴단 말이져..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;두벡터에 수직인 벡터는 사실 두게 있습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;위아래...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;보통 시계 방향이냐 반시계 방향이나 따라서 한가지만 뽑아냅니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;다음은 내적을 구하는 연산입니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;외우지는 마세요.. 그냥 베껴 쓰면 되니깐...^^;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;n_x = v1_y * v2_z - v1_z * v2_y;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;n_y = v1_z * v2_x - v1_x * v2_z;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;n_z = v1_x * v2_y - v1_y * v2_x;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;주의 하실점은 반드시 벡터를 단위벡터로 만들고 하세용..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;5. 법선 벡터&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;법선 벡터는 3D 그래픽 프로그래밍에서 흔히 노말 벡터라고 합니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;3차원 상에 점(vertex)가 3개가 있다고 합시다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;그럼.. 3개의 버텍스 사이에 면이 생깁니다. 일종의 평면이지요..&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;이 노말 벡터는 의 앞뒤를 가르키는 벡터입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;면을 앞 뒤를 구분하는 이유는 바로 연산량과 관계 있습니다. 구와 같은&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;물체를 안쪽면까지 그린다면 엄청 느려지겠지요.. 그래서 뒷쪽 면은&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;연산에서 제외 시켜 버립니다. 이것은 Cull_face 혹은 Cull_mode라고 하져..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;또한 노말 벡터는 라이트와 밀접한 관련이 있습니다. 무슨 말인가 하면&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;당구를 생각합시다. 공을 한쪽 벽에 튀길때 들어 오는 각하고 나오는 각하고&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;같습니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;(그림) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 법선n&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;i &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp; .o&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;. &amp;nbsp; | &amp;nbsp; .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;. | .&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -------------------------당구벽&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 당구공이 벽과 부딪혀서 들어갈때 각은 법선과 당구공 방향 벡터와 내적으로&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 구할수 있습니다. 결국 이 내적의 두배의 각도로 튕켜져 나옵니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 들어가는 공의 방향 벡터가 i라고 하고&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 법선을 n, 튕겨져 나올 방향 벡터가 o라고 했을때&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; o = 2(i*n)n - i; 란 벡터 공식이 나옵니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; (이것도 어떻게 나왔나고 뭍지 마세요..그냥 책에 있음)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 식이 좀 어렵죠..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; c/c++로 풀이하면..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // &amp;nbsp;여기서 쓰인 벡터는 노말 벡터로 미리 만들어 줘야 합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; // &amp;nbsp;일단 i 벡터의 방향을 뒤 집고..&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; i_x = -i_x;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; i_y = -i_y;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; rad = 2 * ( n_x * i_x + n_y * i_y );&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; o_x = rad * n_x - i_x;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; o_y = rad * n_y - i_y;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 이것도 신기하져.. 이걸 잘 응용하면 당구 겜도 만들어요..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; (공하고 부딪힐때는 공끼리 부짖히는 점을 법선 벡터로 두면..)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 잠시 삼천포로 빠졌군요..&lt;/p&gt;&lt;p&gt;&amp;nbsp; 결국 빛을 표면에 뿌릴때 반사되는 각도를 계산하기 위해서 필요한거져..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 위의 예제는 2개의 벡터를 가지고 예기 했지만 3D 그래픽에서는&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 버텍스가 3개입니다. 그럼.. 점 하나를 기준으로 (0,0,0)으로&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 이동 시켜 버려면 2개만 가지고 위의 외적으로 노말을 구할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 다음은 노말벡터을 구하는 예제입니다.&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 물론 연산에 들어가지전 단위 벡터로 만드는 건 잊지 마세요&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; v1[0] = v0[0] - v1[0];&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; v1[1] = v0[1] - v1[1];&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; v1[2] = v0[2] - v1[2];&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; v2[0] = v1[0] - v2[0];&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; v2[1] = v1[1] - v2[1];&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; v2[2] = v1[2] - v2[2];&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; result[0] = v1[1] * v2[2] - v1[2] * v2[1];&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; result[1] = v1[2] * v2[0] - v1[0] * v2[2];&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; result[2] = v1[0] * v2[1] - v1[1] * v2[0];&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 대충 아시겟져...&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 이것만 알면 3D 그래픽에 꼭 핵심적인 벡터 연산은 아신겁니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; 추신: 벡터는 참 신기하져? 도강이라도 하세요..&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; iMusicSoft 주임 연구원 이태경 ( 저 대전 살아요..)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;게제동 강좌란&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;제 &amp;nbsp; 목 &amp;nbsp; &amp;nbsp;[PROG/초보] WAV CHUNK에 대한 이야기... ^^;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;작성자 &amp;nbsp; &amp;nbsp;박한규 (어셈블리)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;작성일 &amp;nbsp;12-22 &amp;nbsp;조회수 &amp;nbsp;291 &amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;강좌 (3)에서 WAV에대한 이야기를 하였다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;제가 미처 빼먹은 부분이 있어 추가하고자 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;바로 청크라는 부분인데... 본 강좌는 여러가지의 WAV파일이 아닌&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Window PCM포맷을 사용한다는 전제하여 강좌를 하여 청크라는 것을&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;빼먹게 되어 사과의 문을 쓰겠습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;보통 흔히 사용하는 WAV파일 포맷들이 Window PCM을 많이 사용하고 있습니다.&lt;/p&gt;&lt;p&gt;(필자 역시 그 포맷을 즐겨 사용합니다.)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;보통 MP3화일을 WAV파일로 Decoding을 하여 얻는 파일 포맷이 바로&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Window PCM포맷입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;현재 강좌를 꾸준히 보셨던 독자들께서는 이런 포맷들에 대해서는&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그렇게 신경을 안쓰시고, 44바이트 건너뛰면 곧바로 data청크를 만날수가 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;하지만, 제게 청크에 대한 질문을 하셨던 내용은 다음 사항이 많았습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&quot;어떤 WAV파일은 읽어지고, 어떤 WAV는 읽어 지지 않습니다.&quot;&lt;/p&gt;&lt;p&gt;&quot;이건 확실히 mmio를 이용한 청크 검색별로 읽어 가야하지 않을까요?&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;오호...이런 질문 메일이 음청나게 많더군여...T_T;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;네에 제게 질문을 주셨던 분들의 말이 맞습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;WAV파일의 포맷 종류가 매우 다양하기 때문입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&quot;참고로 COOL EDITOR라는 사운드 프로그램을 사용해보시길...&quot;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;제가 알고 있는 사운드 파이 포맷은 한 5가지 정도입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그 중에서 일반적으로 널리 쓰이는 Window PCM 포맷을 초점을 맞추어&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;강좌를 써나간 겁니다. 다시 한번 이점에 대해서 양해를...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;[WAV FILE FORMAT]&lt;/p&gt;&lt;p&gt;1. Window PCM&lt;/p&gt;&lt;p&gt;2. Window ADPCM&lt;/p&gt;&lt;p&gt;3. IMA ADPCM&lt;/p&gt;&lt;p&gt;4. ACM Wave&lt;/p&gt;&lt;p&gt;5. Mu/Law Wave&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이렇게 다섯가지 입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;여기서 위 5가지의 포맷은 그렇게 크기 바뀌지 않습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Window PCM에서 보았던 청크들중에서 한가지가 더 추가 한 것뿐입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;바로 &quot;fact&quot;라는 청크인데여...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 청크에 대한 의미는 정확히 저도 잘 모르겠습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그런데 한가지 저 청크를 조심스럽게 간단히 스킵을 하구...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;읽게 되니까...사운드는 제대로 나오더군여... ^^;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그리고, ADPCM같은 경우의 포맷은 주로, 동영상 제작에 사용되는&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;사운드 포맷으로 널리 알려져 있는 포맷이기도 합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;압축된 포맷이죠...그래서 이 포맷은 일반 WAV포맷과 별다른 내용은&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;없지만, 그냥 데이터 필터링을 하지않구 그냥 출력하게되면,&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;치지익 하는 굉음이 나오게됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그리고, WAV파일을 재생하기 위한 필수 기본조건은 정확한 헤더를 얻는&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;방법을 아는것이라고 생각됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;사운드를 재생하기에 앞서 재생하기 위한 충분한 정보가 제공되어야&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;하니깐여...^^;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ADPCM포맷의 WAV파일의 데이터 청크 내용은 저도 잘 모르겠습니다. ^^;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아~~~ 강좌 (3)에서는 조회수가 떨어질거라구 예상했었는데..흑흑...&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;역시나...너무 내용이 빈약 했던것 같군여...^^;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ADPCM이외의 포맷은 강좌 (4)에서 다루도록 하겠습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그리고, 이쁘장한 재생기 프로그램 소스를 제공 해드리겠습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;좀 강좌 (4)의 내용은 음청나게 길어질듯...^^;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;즐거운 시간 되십시여...^^;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/329</guid>
      <comments>https://eltgroup.tistory.com/329#entry329comment</comments>
      <pubDate>Sat, 2 Jun 2018 07:19:32 +0900</pubDate>
    </item>
    <item>
      <title>유니티 UI 버튼 다운, 업 이벤트 처리하기</title>
      <link>https://eltgroup.tistory.com/327</link>
      <description>&lt;p&gt;NGUI같은경우 버튼의 눌림, 눌림 해제를 받을 수 있는데 반해서 유니티의 버튼은 클릭 이벤트만 등록이 가능한것 같습니다.&lt;/p&gt;&lt;p&gt;게임을 만들다 보면, 버튼이 눌려있는 동안 어떤 액션을 계속 수행하다가 눌림이 해제될때 액션을 중지 하는것과 같은 기능이 필요할때가 많은데&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래는 유니티의 버튼을 통해서 해당 기능을 구현하는 방법의 예입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #e5e5e5&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;11&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;12&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;13&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;14&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;15&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;16&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;17&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;18&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;19&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;20&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;21&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;22&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;23&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;24&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;25&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;26&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;27&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;28&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;29&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;30&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;31&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;32&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;33&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;using&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;System&lt;/span&gt;.Collections;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;using&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;System&lt;/span&gt;.Collections.Generic;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;using&lt;/span&gt;&amp;nbsp;UnityEngine;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;using&lt;/span&gt;&amp;nbsp;UnityEngine.EventSystems;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;class&lt;/span&gt;&amp;nbsp;PointerListener&amp;nbsp;:&amp;nbsp;MonoBehaviour,&amp;nbsp;IPointerDownHandler,&amp;nbsp;IPointerUpHandler&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;bool&lt;/span&gt;&amp;nbsp;_pressed&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;false&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;OnPointerDown(PointerEventData&amp;nbsp;eventData)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Debug.Log(&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;버튼이&amp;nbsp;눌려지고&amp;nbsp;있음&quot;&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_pressed&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;true&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;OnPointerUp(PointerEventData&amp;nbsp;eventData)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Debug.Log(&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;버튼&amp;nbsp;눌림이&amp;nbsp;해제됨&quot;&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_pressed&amp;nbsp;&lt;span style=&quot;color:#0086b3&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;false&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//&amp;nbsp;Use&amp;nbsp;this&amp;nbsp;for&amp;nbsp;initialization&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;Start&amp;nbsp;()&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//&amp;nbsp;Update&amp;nbsp;is&amp;nbsp;called&amp;nbsp;once&amp;nbsp;per&amp;nbsp;frame&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;Update&amp;nbsp;()&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;&amp;nbsp;(_pressed)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//버튼이&amp;nbsp;눌려진동안&amp;nbsp;액션&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(229, 229, 229);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; background-color: rgb(229, 229, 229); border-radius: 10px; padding: 1px;&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;해당 스크립트를 버튼에 부착하고 사용하면됩니다.&lt;/p&gt;</description>
      <category>Unity</category>
      <category>button</category>
      <category>UI Button</category>
      <category>유니티</category>
      <category>유니티버튼</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/327</guid>
      <comments>https://eltgroup.tistory.com/327#entry327comment</comments>
      <pubDate>Mon, 18 Dec 2017 13:11:59 +0900</pubDate>
    </item>
    <item>
      <title>Node mcu 와이파이 속도 테스트</title>
      <link>https://eltgroup.tistory.com/326</link>
      <description>&lt;p&gt;노드 mcu 라는 재미있는 녀석을 발견해서 가지고 놀다가&amp;nbsp;&lt;/p&gt;&lt;p&gt;와이 파이 전송속도가 얼마정도 나올지 테스트 해보고 싶어졌습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;대충 서버를 만들고, 노드 mcu쪽은 와이파이 클라이언트 예제를 좀 수정했는데&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;테스트 방법은 다음과 같습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;서버측에서는 tcp서버소켓을 열고 특정포트를 리슨하고 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;클라이언트쪽에서는 와이파이연결을 초기화 하고, 서버의 ip와 포트에 WIFIClient를 통해서 접속합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;접속이 이루어지면 노드쪽에서는 특정한 값으로 초기화된 1024바이트 길이의 배열을 전송을 하고&lt;/p&gt;&lt;p&gt;서버에서는 클라이언트의 내용을 수신해서 내용물을 검사해서 오류가 있는지 확인하고&lt;/p&gt;&lt;p&gt;수신된 바이트 수를 기록해뒀다가&amp;nbsp;&lt;/p&gt;&lt;p&gt;매1초 경과시 마다 수신받은 바이트수를 출력하는 형태입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;클라이언트(노드mcu)는 일단 서버에 패킷을 보내고 나서 서버로 부터 다음 패킷을 보내라는 응답을&amp;nbsp;&lt;/p&gt;&lt;p&gt;받기전까지는 다음 패킷을 보내지 않습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래는 테스트 영상입니다.&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;해외어떤사이트에서 노드mcu전송속도가 형편없다고 들었는데&lt;/p&gt;&lt;p&gt;비록 내부 네트워크간의 전송이지만 생각보다 속도가 잘나오는거 같습니다.&lt;/p&gt;&lt;p&gt;70kb ~ 200kb정도 나오는거 같습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;한가지 문제점은 노드mcu에 달린 안테나가 부실해서 그런지 전력소모가 많아서 그런지 모르겠는데&amp;nbsp;&lt;/p&gt;&lt;p&gt;매우 불안정해서 연결이 매우 쉽게 끊어지는거 같습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>node</category>
      <category>node mcu</category>
      <category>NodeMCU</category>
      <category>노드</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/326</guid>
      <comments>https://eltgroup.tistory.com/326#entry326comment</comments>
      <pubDate>Sun, 26 Nov 2017 00:12:57 +0900</pubDate>
    </item>
    <item>
      <title>nodemcu v3 핀맵</title>
      <link>https://eltgroup.tistory.com/325</link>
      <description>&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 816px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/99B752335A071F131D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F99B752335A071F131D&quot; width=&quot;816&quot; height=&quot;629&quot; filename=&quot;esp8266-nodemcu-dev-kit-v3-pins.jpg&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/325</guid>
      <comments>https://eltgroup.tistory.com/325#entry325comment</comments>
      <pubDate>Sun, 12 Nov 2017 01:02:37 +0900</pubDate>
    </item>
    <item>
      <title>윈도우 조이스틱 사용</title>
      <link>https://eltgroup.tistory.com/323</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd797987(v=vs.85).aspx&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd797987(v=vs.85).aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;윈도우 api를 통해 조이스틱 사용하는 법&lt;/p&gt;&lt;h1 class=&quot;title&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; color: rgb(69, 69, 69); font-weight: normal; font-stretch: normal; font-size: 3em; line-height: 1.2em; margin: 0px 0px 0px -3px; padding: 0px 0px 84px; clear: both;&quot;&gt;Getting the Driver Capabilities(드라이버 능력확인)&lt;/h1&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(69, 69, 69); font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20.006px;&quot;&gt;The following example uses&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd757106(v=vs.85).aspx&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20.006px; color: rgb(0, 24, 143);&quot;&gt;&lt;strong xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;joyGetNumDevs&lt;/strong&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(69, 69, 69); font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20.006px;&quot;&gt;&amp;nbsp;and&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd757107(v=vs.85).aspx&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20.006px; color: rgb(0, 24, 143);&quot;&gt;&lt;strong xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;joyGetPos&lt;/strong&gt;&lt;/a&gt;&lt;span style=&quot;color: rgb(69, 69, 69); font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20.006px;&quot;&gt;&amp;nbsp;to determine whether the joystick services are available and if a joystick is attached to one of the ports.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(69, 69, 69); font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20.006px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(69, 69, 69); font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20.006px;&quot;&gt;다음은 조이스틱 서비스를 이용할 수 있고 포트에 연결되었는지 결정하기위해&amp;nbsp;&lt;/span&gt;&lt;strong xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;color: rgb(0, 24, 143); font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20.006px;&quot;&gt;&lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd757106(v=vs.85).aspx&quot; style=&quot;color: rgb(0, 24, 143); font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20.006px;&quot;&gt;joyGetNumDevs&lt;/a&gt;&lt;/strong&gt;&lt;span style=&quot;color: rgb(69, 69, 69); font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 14px;&quot;&gt;와 &amp;nbsp;&lt;/span&gt;&lt;strong xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;color: rgb(0, 24, 143); font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20.006px;&quot;&gt;&lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd757107(v=vs.85).aspx&quot; style=&quot;color: rgb(0, 24, 143); font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20.006px;&quot;&gt;joyGetPos&lt;/a&gt;&lt;/strong&gt;&lt;span style=&quot;color: rgb(69, 69, 69); font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 14px;&quot;&gt;를 사용하는 예이다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: rgb(69, 69, 69); font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 14px;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;codeSnippetContainerTabs&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; vertical-align: middle; height: 23px; position: relative; z-index: 1; color: rgb(69, 69, 69); font-size: 14px; line-height: 20.006px;&quot;&gt;&lt;div class=&quot;codeSnippetContainerTabSingle&quot; dir=&quot;ltr&quot; style=&quot;font-size: 13px; line-height: 17px; height: 23px; float: left; width: auto; vertical-align: baseline; color: rgb(112, 112, 112); position: relative; border-width: 1px; border-style: solid; border-color: rgb(147, 147, 147) rgb(147, 147, 147) rgb(255, 255, 255); border-top-left-radius: 4px; border-top-right-radius: 4px; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important;&quot;&gt;&lt;a style=&quot;font-family: &amp;quot;Segoe UI Semibold&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 1em; line-height: 1.429em; color: rgb(30, 117, 187); padding: 0px 8px; display: inline-block; font-weight: bold; position: relative; top: 2px;&quot;&gt;C++&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;codeSnippetContainerCodeContainer&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; border: 1px solid rgb(147, 147, 147); clear: both; margin-bottom: 12px; position: relative; top: -1px; color: rgb(69, 69, 69); font-size: 14px; line-height: 20.006px;&quot;&gt;&lt;div class=&quot;codeSnippetToolBar&quot; style=&quot;width: auto; height: auto;&quot;&gt;&lt;div class=&quot;codeSnippetToolBarText&quot; style=&quot;float: right; top: -8px; position: relative; width: auto; padding-left: 0px; padding-right: 0px; height: 0px; vertical-align: top;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=&quot;CodeSnippetContainerCode_9e12a620-2b0c-441a-815e-082c45f3d1ff&quot; class=&quot;codeSnippetContainerCode&quot; dir=&quot;ltr&quot; style=&quot;width: auto; margin: 0px; padding: 10px 21px;&quot;&gt;&lt;div style=&quot;padding: 0px; margin: 0px; color: black;&quot;&gt;&lt;pre style=&quot;padding: 5px; margin-top: 0px; margin-bottom: 0px; overflow: auto; word-wrap: break-word; word-break: break-word; white-space: pre-wrap; font-family: Consolas, Courier, monospace !important;&quot;&gt;JOYINFO joyinfo; 
UINT wNumDevs, wDeviceID; 
BOOL bDev1Attached, bDev2Attached; 
 &lt;/pre&gt;&lt;pre style=&quot;padding: 5px; margin-top: 0px; margin-bottom: 0px; overflow: auto; word-wrap: break-word; word-break: break-word; white-space: pre-wrap; font-family: Consolas, Courier, monospace !important;&quot;&gt;&lt;p&gt;    //조이스틱 디바이스 개수가 0이면
    &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;if&lt;/span&gt;((wNumDevs = joyGetNumDevs()) == 0) 
        &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;return&lt;/span&gt; ERR_NODRIVER; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;    //조이스틱1이 연결되었는가?
    bDev1Attached = joyGetPos(JOYSTICKID1,&amp;amp;joyinfo) != JOYERR_UNPLUGGED; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;    //조이스틱2가 연결되었는가?
    bDev2Attached = wNumDevs == 2 &amp;amp;&amp;amp; joyGetPos(JOYSTICKID2,&amp;amp;joyinfo) != 
        JOYERR_UNPLUGGED; &lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;    //조이스틱1, 2중하나라도 연결되었다면 
    &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;if&lt;/span&gt;(bDev1Attached || bDev2Attached)   &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: green;&quot;&gt;// decide which joystick to use 어떤조이스틱을 사용할지결정&lt;/span&gt;
        wDeviceID = bDev1Attached ? JOYSTICKID1 : JOYSTICKID2; 
    &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;else&lt;/span&gt; 
        &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;return&lt;/span&gt; ERR_NODEVICE; 
&lt;/p&gt;&lt;/pre&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div id=&quot;mainSection&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; clear: both;&quot;&gt;&lt;div class=&quot;clsServerSDKContent&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; color: rgb(69, 69, 69); font-size: 14px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; line-height: 20.006px; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;h1 class=&quot;title&quot; style=&quot;font-family: &amp;quot;Segoe UI Light&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; color: rgb(69, 69, 69); font-style: normal; font-variant: normal; font-weight: normal; font-stretch: normal; font-size: 3em; line-height: 1.2em; margin: 0px 0px 0px -3px; padding: 0px 0px 84px; clear: both;&quot;&gt;Capturing Joystick Input(조이스틱 입력 획득)&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; color: rgb(69, 69, 69); margin-right: 0px; margin-left: 0px; padding-bottom: 15px; font-size: 14px; line-height: 1.429em !important;&quot;&gt;Most of the code controlling the joystick is in the main window function. In the following portion of the message handler, the application calls&amp;nbsp;&lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd757114(v=vs.85).aspx&quot; style=&quot;font-family: &amp;quot;Segoe UI Semibold&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 1em; line-height: 1.429em; color: rgb(0, 24, 143);&quot;&gt;&lt;strong xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important;&quot;&gt;joySetCapture&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;to capture input from the joystick JOYSTICKID1.&lt;/p&gt;&lt;p style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; color: rgb(69, 69, 69); margin-right: 0px; margin-left: 0px; padding-bottom: 15px; font-size: 14px; line-height: 1.429em !important;&quot;&gt;조이스틱을 제어하기위한 코드의 대부분은 메인 윈도우 함수안에 있다. 다음의 메시지 핸들러의 일부에서 어플리케이션은 JOYSTICKID1조이스틱에서 입력을 획득하기 위해&amp;nbsp;&lt;strong xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;font-size: 1em; color: rgb(0, 24, 143); font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; line-height: 1.429em;&quot;&gt;&lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd757114(v=vs.85).aspx&quot; style=&quot;font-size: 1em; color: rgb(0, 24, 143); font-family: &amp;quot;Segoe UI Semibold&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; line-height: 1.429em;&quot;&gt;joySetCapture&lt;/a&gt;를 호출한다.&lt;/strong&gt;&lt;/p&gt;&lt;div id=&quot;code-snippet-1&quot; class=&quot;codeSnippetContainer&quot; xmlns=&quot;&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; min-width: 260px; clear: both; color: rgb(69, 69, 69); font-size: 14px; line-height: 20.006px;&quot;&gt;&lt;div class=&quot;codeSnippetContainerTabs&quot; style=&quot;vertical-align: middle; height: 23px; position: relative; z-index: 1;&quot;&gt;&lt;div class=&quot;codeSnippetContainerTabSingle&quot; dir=&quot;ltr&quot; style=&quot;font-size: 13px; line-height: 17px; height: 23px; float: left; width: auto; vertical-align: baseline; color: rgb(112, 112, 112); position: relative; border-width: 1px; border-style: solid; border-color: rgb(147, 147, 147) rgb(147, 147, 147) rgb(255, 255, 255); border-top-left-radius: 4px; border-top-right-radius: 4px; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important;&quot;&gt;&lt;a style=&quot;font-family: &amp;quot;Segoe UI Semibold&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 1em; line-height: 1.429em; color: rgb(30, 117, 187); padding: 0px 8px; display: inline-block; font-weight: bold; position: relative; top: 2px;&quot;&gt;C++&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;codeSnippetContainerCodeContainer&quot; style=&quot;border: 1px solid rgb(147, 147, 147); clear: both; margin-bottom: 12px; position: relative; top: -1px;&quot;&gt;&lt;div class=&quot;codeSnippetToolBar&quot; style=&quot;width: auto; height: auto;&quot;&gt;&lt;div class=&quot;codeSnippetToolBarText&quot; style=&quot;float: right; top: -8px; position: relative; width: auto; padding-left: 0px; padding-right: 0px; height: 0px; vertical-align: top;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=&quot;CodeSnippetContainerCode_a3e3837c-b744-4224-89e8-881b8f873b13&quot; class=&quot;codeSnippetContainerCode&quot; dir=&quot;ltr&quot; style=&quot;width: auto; margin: 0px; padding: 10px 21px;&quot;&gt;&lt;div style=&quot;padding: 0px; margin: 0px; color: black;&quot;&gt;&lt;pre style=&quot;padding: 5px; margin-top: 0px; margin-bottom: 0px; overflow: auto; word-wrap: break-word; word-break: break-word; white-space: pre-wrap; font-family: Consolas, Courier, monospace !important;&quot;&gt;&lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;case&lt;/span&gt; WM_CREATE: &lt;/pre&gt;&lt;pre style=&quot;padding: 5px; margin-top: 0px; margin-bottom: 0px; overflow: auto; word-wrap: break-word; word-break: break-word; white-space: pre-wrap; font-family: Consolas, Courier, monospace !important;&quot;&gt;    //리턴값이 0이 아닌경우 요청이 실패한것이다.
    &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;if&lt;/span&gt;(joySetCapture(hWnd, JOYSTICKID1, NULL, FALSE)) 
    { &lt;/pre&gt;&lt;pre style=&quot;padding: 5px; margin-top: 0px; margin-bottom: 0px; overflow: auto; word-wrap: break-word; word-break: break-word; white-space: pre-wrap; font-family: Consolas, Courier, monospace !important;&quot;&gt;&lt;p&gt;        //비프음을 출력하고 메시지 박스로 안내 후 프로그램 종료
        MessageBeep(MB_ICONEXCLAMATION); 
        MessageBox(hWnd, &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: rgb(163, 21, 21);&quot;&gt;&quot;Couldn't capture the joystick.&quot;&lt;/span&gt;, NULL, 
            MB_OK | MB_ICONEXCLAMATION); 
        PostMessage(hWnd,WM_CLOSE,0,0L); 
    } 
    &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;break&lt;/span&gt;; 
 

&lt;/p&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h1 class=&quot;title&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; color: rgb(69, 69, 69); font-weight: normal; font-stretch: normal; font-size: 3em; line-height: 1.2em; margin: 0px 0px 0px -3px; padding: 0px 0px 84px; clear: both;&quot;&gt;Processing Joystick Messages(조이스틱메시지처리)&lt;/h1&gt;&lt;div id=&quot;mainSection&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; clear: both; color: rgb(69, 69, 69); font-size: 14px; line-height: 20.006px;&quot;&gt;&lt;div class=&quot;clsServerSDKContent&quot;&gt;&lt;/div&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding-bottom: 15px; line-height: 1.429em !important;&quot;&gt;The following example illustrates how an application could respond to joystick movements and changes in the button states. When the joystick changes position, the application moves the cursor and, if either button is pressed, draws a bullet hole on the desktop. When a joystick button is pressed, the application draws a hole on the desktop and plays a sound continuously until a button is released. The messages to watch are&amp;nbsp;&lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd757352(v=vs.85).aspx&quot; style=&quot;font-family: &amp;quot;Segoe UI Semibold&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 1em; line-height: 1.429em; color: rgb(0, 24, 143);&quot;&gt;&lt;strong xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important;&quot;&gt;MM_JOY1MOVE&lt;/strong&gt;&lt;/a&gt;,&lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd757350(v=vs.85).aspx&quot; style=&quot;font-family: &amp;quot;Segoe UI Semibold&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 1em; line-height: 1.429em; color: rgb(0, 24, 143);&quot;&gt;&lt;strong xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important;&quot;&gt;MM_JOY1BUTTONDOWN&lt;/strong&gt;&lt;/a&gt;, and&amp;nbsp;&lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd757351(v=vs.85).aspx&quot; style=&quot;font-family: &amp;quot;Segoe UI Semibold&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 1em; line-height: 1.429em; color: rgb(0, 24, 143);&quot;&gt;&lt;strong xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important;&quot;&gt;MM_JOY1BUTTONUP&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding-bottom: 15px; line-height: 1.429em !important;&quot;&gt;다음의 예는 어플리케이션이 어떻게 조이스틱의 이동과 버튼의 상태변화에 응답할 수 있는지 예를 보여준다. 조이스틱의 위치가 변할때 어플리케이션에서 커서를 이동시키고, 버튼이 눌릴경우, 데스크탑에 총알구멍을 그린다. 조이스틱 버튼이 눌리는경우, 어플리케이션은 구멍을 그리고 동시에 버튼 눌림이 해제될때까지 사운드를 플레이 한다. 해당 메시지 들은&amp;nbsp;&lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd757352(v=vs.85).aspx&quot; style=&quot;font-size: 1em; color: rgb(0, 24, 143); font-family: &amp;quot;Segoe UI Semibold&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; line-height: 1.429em;&quot;&gt;&lt;strong xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important;&quot;&gt;MM_JOY1MOVE&lt;/strong&gt;&lt;/a&gt;,&amp;nbsp;&lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd757350(v=vs.85).aspx&quot; style=&quot;font-size: 1em; color: rgb(0, 24, 143); font-family: &amp;quot;Segoe UI Semibold&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; line-height: 1.429em;&quot;&gt;&lt;strong xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important;&quot;&gt;MM_JOY1BUTTONDOWN&lt;/strong&gt;&lt;/a&gt;, &lt;a href=&quot;https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd757351(v=vs.85).aspx&quot; style=&quot;font-size: 1em; color: rgb(0, 24, 143); font-family: &amp;quot;Segoe UI Semibold&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; line-height: 1.429em;&quot;&gt;&lt;strong xmlns=&quot;http://www.w3.org/1999/xhtml&quot; style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important;&quot;&gt;MM_JOY1BUTTONUP&lt;/strong&gt;&lt;/a&gt;&amp;nbsp;으로 관찰된다.&lt;/p&gt;&lt;p style=&quot;margin-right: 0px; margin-left: 0px; padding-bottom: 15px; line-height: 1.429em !important;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;div id=&quot;code-snippet-1&quot; class=&quot;codeSnippetContainer&quot; xmlns=&quot;&quot; style=&quot;min-width: 260px; clear: both;&quot;&gt;&lt;div class=&quot;codeSnippetContainerTabs&quot; style=&quot;vertical-align: middle; height: 23px; position: relative; z-index: 1;&quot;&gt;&lt;div class=&quot;codeSnippetContainerTabSingle&quot; dir=&quot;ltr&quot; style=&quot;font-size: 13px; line-height: 17px; height: 23px; float: left; width: auto; vertical-align: baseline; color: rgb(112, 112, 112); position: relative; border-width: 1px; border-style: solid; border-color: rgb(147, 147, 147) rgb(147, 147, 147) rgb(255, 255, 255); border-top-left-radius: 4px; border-top-right-radius: 4px; font-family: &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important;&quot;&gt;&lt;a style=&quot;font-family: &amp;quot;Segoe UI Semibold&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif; font-size: 1em; line-height: 1.429em; color: rgb(30, 117, 187); padding: 0px 8px; display: inline-block; font-weight: bold; position: relative; top: 2px;&quot;&gt;C++&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;codeSnippetContainerCodeContainer&quot; style=&quot;border: 1px solid rgb(147, 147, 147); clear: both; margin-bottom: 12px; position: relative; top: -1px;&quot;&gt;&lt;div class=&quot;codeSnippetToolBar&quot; style=&quot;width: auto; height: auto;&quot;&gt;&lt;div class=&quot;codeSnippetToolBarText&quot; style=&quot;float: right; top: -8px; position: relative; width: auto; padding-left: 0px; padding-right: 0px; height: 0px; vertical-align: top;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div id=&quot;CodeSnippetContainerCode_be049e23-3d5f-4d92-a854-392926adc048&quot; class=&quot;codeSnippetContainerCode&quot; dir=&quot;ltr&quot; style=&quot;width: auto; margin: 0px; padding: 10px 21px;&quot;&gt;&lt;div style=&quot;padding: 0px; margin: 0px; color: black;&quot;&gt;&lt;pre style=&quot;padding: 5px; margin-top: 0px; margin-bottom: 0px; overflow: auto; word-wrap: break-word; word-break: break-word; white-space: pre-wrap; font-family: Consolas, Courier, monospace !important;&quot;&gt;&lt;p&gt;
&lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;case&lt;/span&gt; MM_JOY1MOVE :                     &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: green;&quot;&gt;// changed position  위치이동됨&lt;/span&gt;
    &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;if&lt;/span&gt;((UINT) wParam &amp;amp; (JOY_BUTTON1 | JOY_BUTTON2)) //wParam에는 버튼 눌림상태가 포함되있다.
        DrawFire(hWnd); 
    DrawSight(lParam);                 &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: green;&quot;&gt;// calculates new cursor position &lt;/span&gt;
    &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;break&lt;/span&gt;; 
&lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;case&lt;/span&gt; MM_JOY1BUTTONDOWN :               &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: green;&quot;&gt;// button is down  조이스틱1 버튼눌림&lt;/span&gt;
    &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;if&lt;/span&gt;((UINT) wParam &amp;amp; JOY_BUTTON1)     //1번 버튼이 눌린경우
    { 
        PlaySound(lpButton1, SND_LOOP | SND_ASYNC | SND_MEMORY); 
        DrawFire(hWnd); 
    } 
    &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;if&lt;/span&gt;((UINT) wParam &amp;amp; JOY_BUTTON2)  //2번 버튼이 눌린경우
    { 
        PlaySound(lpButton2, SND_ASYNC | SND_MEMORY |  SND_LOOP); 
        DrawFire(hWnd); 
    } 
    &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;break&lt;/span&gt;; 
&lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;case&lt;/span&gt; MM_JOY1BUTTONUP :                 &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: green;&quot;&gt;// button is up , 조이스틱1 버튼 눌림해제&lt;/span&gt;
    sndPlaySound(NULL, 0);             &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: green;&quot;&gt;// stops the sound &lt;/span&gt;
    &lt;span style=&quot;font-family: &amp;quot;Malgun Gothic&amp;quot;, Gulim, &amp;quot;Segoe UI&amp;quot;, &amp;quot;Lucida Grande&amp;quot;, Verdana, Arial, Helvetica, sans-serif !important; color: blue;&quot;&gt;break&lt;/span&gt;; &lt;/p&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>C/C++</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/323</guid>
      <comments>https://eltgroup.tistory.com/323#entry323comment</comments>
      <pubDate>Tue, 18 Apr 2017 12:21:00 +0900</pubDate>
    </item>
    <item>
      <title>유니티 애셋스토어 구입애셋 다운로드되는 경로</title>
      <link>https://eltgroup.tistory.com/321</link>
      <description>&lt;p&gt;C:\Users\사용자이름\AppData\Roaming\Unity\Asset Store-5.x\&lt;/p&gt;&lt;p&gt;에 다운받은 애셋이 있다.&lt;/p&gt;</description>
      <category>Unity</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/321</guid>
      <comments>https://eltgroup.tistory.com/321#entry321comment</comments>
      <pubDate>Wed, 1 Mar 2017 17:02:05 +0900</pubDate>
    </item>
    <item>
      <title>유니티 텍스쳐 직접조작</title>
      <link>https://eltgroup.tistory.com/318</link>
      <description>&lt;h1 class=&quot;heading inherit&quot; style=&quot;margin: 0px 15px 5px 0px; padding: 0px; line-height: 1em; color: rgb(27, 34, 41); word-wrap: break-word; font-family: &amp;quot;Open Sans&amp;quot;, sans-serif;&quot;&gt;&lt;a href=&quot;https://docs.unity3d.com/540/Documentation/ScriptReference/Texture2D.html&quot; style=&quot;color: rgb(27, 34, 41); text-decoration: underline; outline: none; cursor: pointer;&quot;&gt;Texture2D&lt;/a&gt;.GetPixels&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;https://docs.unity3d.com/540/Documentation/ScriptReference/Texture2D.GetPixels.html&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1 class=&quot;heading inherit&quot; style=&quot;margin: 0px 15px 5px 0px; padding: 0px; line-height: 1em; color: rgb(27, 34, 41); word-wrap: break-word; font-family: &amp;quot;Open Sans&amp;quot;, sans-serif;&quot;&gt;&lt;a href=&quot;https://docs.unity3d.com/540/Documentation/ScriptReference/Texture2D.html&quot; style=&quot;color: rgb(27, 34, 41); text-decoration: underline; outline: none; cursor: pointer;&quot;&gt;Texture2D&lt;/a&gt;.GetPixels32&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;https://docs.unity3d.com/540/Documentation/ScriptReference/Texture2D.GetPixels32.html&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;해당 텍스쳐의 내용을 Color 또는 Color32형태로 얻어온다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이 기능을 사용하기 위해서는 반드시 텍스쳐에 읽기/쓰기 가능 플래그를 임포트 셋팅에서 설정해야 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1 class=&quot;heading inherit&quot; style=&quot;margin: 0px 15px 5px 0px; padding: 0px; line-height: 1em; color: rgb(27, 34, 41); word-wrap: break-word; font-family: &amp;quot;Open Sans&amp;quot;, sans-serif;&quot;&gt;&lt;a href=&quot;https://docs.unity3d.com/540/Documentation/ScriptReference/Texture2D.html&quot; style=&quot;color: rgb(27, 34, 41); text-decoration: underline; outline: none; cursor: pointer;&quot;&gt;Texture2D&lt;/a&gt;.SetPixels&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;https://docs.unity3d.com/540/Documentation/ScriptReference/Texture2D.SetPixels.html&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1 class=&quot;heading inherit&quot; style=&quot;margin: 0px 15px 5px 0px; padding: 0px; line-height: 1em; color: rgb(27, 34, 41); word-wrap: break-word; font-family: &amp;quot;Open Sans&amp;quot;, sans-serif;&quot;&gt;&lt;a href=&quot;https://docs.unity3d.com/540/Documentation/ScriptReference/Texture2D.html&quot; style=&quot;color: rgb(27, 34, 41); text-decoration: underline; outline: none; cursor: pointer;&quot;&gt;Texture2D&lt;/a&gt;.SetPixels32&lt;/h1&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;https://docs.unity3d.com/540/Documentation/ScriptReference/Texture2D.SetPixels32.html&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이함수들은 오직 ARGB32, RGB24, Alpha8포맷의 텍스쳐들에만 작동한다. 또한 텍스쳐들은 읽기 가능 플래그가 설정되어 있어야한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Unity</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/318</guid>
      <comments>https://eltgroup.tistory.com/318#entry318comment</comments>
      <pubDate>Tue, 14 Feb 2017 17:33:17 +0900</pubDate>
    </item>
    <item>
      <title>유니티 Editor 폴더내에 있는 Resources폴더</title>
      <link>https://eltgroup.tistory.com/317</link>
      <description>&lt;p&gt;Editor폴더내에 Resources폴더를 만들경우 유니티의 Resources.Load함수를 통해서 리소스 로드가 가능하다.&lt;/p&gt;&lt;p&gt;단, 빌드시에는 Editor/Resources 폴더의 &amp;nbsp;리소스 들은 제외된다.&lt;/p&gt;</description>
      <category>Unity</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/317</guid>
      <comments>https://eltgroup.tistory.com/317#entry317comment</comments>
      <pubDate>Sun, 29 Jan 2017 09:28:34 +0900</pubDate>
    </item>
    <item>
      <title>MMORPG 입니다.</title>
      <link>https://eltgroup.tistory.com/315</link>
      <description>&lt;p&gt;5년경 지나서 이젠 기억도 가물가물합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;MMORPG제작시의 자료입니다.&lt;/p&gt;&lt;p&gt;기억을 더듬어 서버를 셋팅하고 플레이 가능한 상태로 만들어 봤습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래는 게임영상입니다.&lt;/p&gt;&lt;p&gt;해당 게임은 베타테스트까지만 진행하고 회사가 없어지는 바람에 출시는 못했습니다.&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래는 그때당시 제작했던 툴중하나입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;MFC로 만들었고 자체엔진이었습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;밤새며 셰이더 프로그래밍 하던 기억이 나네요.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제는 유니티나 언리얼같은 훌륭한 게임엔진들을 쉽게 사용가능하다보니&lt;/p&gt;&lt;p&gt;이런것들이 별 의미가 없지만, 그래도 밑바닦 부터의 경험이 많은 도움이 되었던것 같습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이프로젝트 당시 제가 맡았던 파트는 서버, 엔진, 클라이언트 전체 파트였지만, 주로 서버와 엔진쪽 작업을 했던것 같습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래는 툴의 작동영상입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이툴은 게임 배경을 편집하거나 지형내에 몬스터배치를 한다거나 하는 역할입니다.&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래영상은 바로위 게임 개발전에 작업했던 MMORPG아더스의 플레이 영상입니다.&lt;/p&gt;&lt;p&gt;당시에 저는 프로그램파트 전체를(서버, 엔진, 클라이언트, 각종툴작업) 맡아 작업을 했었습니다.&lt;/p&gt;&lt;p&gt;아더스의 경우 게임아지트를 통해서 일차로 출시를 했고 후에 FDISK를통해서도 서비스를 진행했었습니다.&lt;/p&gt;&lt;p&gt;기획1, 프로그래밍1, 그래픽1해서 3인으로 작업을했었습니다.&lt;/p&gt;&lt;p&gt;그래픽이 구려보이긴합니다만, SSAO, 캐스케이드셰도우맵 등 그당시 나름 최신의 기술들을 심혈을 기울여 구현했었습니다.&lt;/p&gt;&lt;p&gt;최신의 스피드트리 엔진도 도입했습니다.&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>포트폴리오</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/315</guid>
      <comments>https://eltgroup.tistory.com/315#entry315comment</comments>
      <pubDate>Thu, 29 Dec 2016 06:32:15 +0900</pubDate>
    </item>
    <item>
      <title>버스터마스터 for Kakao입니다.</title>
      <link>https://eltgroup.tistory.com/314</link>
      <description>&lt;p&gt;첫 모바일 게임 버스트 마스터 for Kakao입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;2013년도 경에 출시 했습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;프로그램 파트 전체를 맡아 진행했습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;게임서버는 c# 비동기 소켓 기반으로 제작했고&lt;/p&gt;&lt;p&gt;JSP 기반으로 운영툴 및 일부 기능을 제작했습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;클라이언트는 유니티 4버전대로 제작했습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;유클라우드의 클라우드서버를 이용해 서비스 했습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;현재는 서비스 중지 상태입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래는 게임영상중 일부입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/xwByAID6SvA&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/c9PLCwTkSiw&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>포트폴리오</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/314</guid>
      <comments>https://eltgroup.tistory.com/314#entry314comment</comments>
      <pubDate>Thu, 29 Dec 2016 06:11:07 +0900</pubDate>
    </item>
    <item>
      <title>소셜카지노 게임</title>
      <link>https://eltgroup.tistory.com/313</link>
      <description>&lt;p&gt;가장 최근의 프로젝트로&lt;/p&gt;&lt;p&gt;페이스북 소셜 카지노 게임입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;서버파트에서&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;게임서버 제작,&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;각종 시뮬레이터 및 게임로직 구현,&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;각종 운영툴 제작(통계생성, 통계조회, 메일 발송서비스, 페이스북 알림메시지 발송서비스),&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;페이스북 연동(회원연동, 결제시스템연동, 웹백엔드 기반작업)&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아마존 웹서비스 구성(ec2, elb, s3, cloud front, 각종 서버 셋팅(웹, db등등))&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;등을 맡았습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;클라이언트 파트에서는&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;액션스크립트3 기반의 tcp 통신 네트워크 모듈개발&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;각 게임별 서버 연동 API개발&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;기타 웹백엔드와 통신 및 데이터 구축 모듈 개발&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;클라이언트 파트 결제모듈 개발&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;등을 맡았습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;게임서버는 c#비동기 tcp소켓 서버입니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;윈폼, 윈도우 서비스, 콘솔, 리눅스 데몬등(모노4.5기반에서)으로 작동가능합니다.,&lt;/p&gt;&lt;p&gt;DB는 MSSQL을 사용했습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;버스터마스터 게임 제작시 만들었던 c# 비동기 네트워크 모듈을 사용했는데, 다년간 개선하여 더욱 견고하게 작동하도록 했습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;웹의 경우 JSP(스프링)기반으로 아파치 + 톰캣 구성으로 현재도 서비스 중입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래는 게임 영상입니다.&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래는 제작한 시뮬레이터 중 하나의 영상입니다.&lt;/p&gt;&lt;p&gt;시뮬레이터의 경우 게임마다 존재하는데 게임의 특성에 따라서 구성에 차이가 있습니다.&lt;/p&gt;&lt;p&gt;역할은 게임데이터를 생성, 편집, 서버에 업로드, 게임해보기, 데이터추출, 게임시뮬레이션해보기&lt;/p&gt;&lt;p&gt;시뮬레이션 통계확인 등입니다.&lt;/p&gt;&lt;p&gt;윈폼(c#)으로 제작했습니다.&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;CMS웹페이지를 통해서 전반적인 운영이 가능하지만 일부툴의 경우 어플리케이션으로 만들기도 했습니다.&lt;/p&gt;&lt;p&gt;아래는 통계 추출용툴입니다.&lt;/p&gt;&lt;p&gt;서버에 누적된 로그를 조회해서 보여주거나 엑셀 파일로 저장하는 기능을 제공합니다.&lt;/p&gt;&lt;p&gt;윈폼으로 제작했고 서버의 경우 Node.js를 이용했습니다.&lt;/p&gt;&lt;p&gt;목적에 적합한 다양한 기술을 활용하는 재미가 있는것 같습니다.&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>포트폴리오</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/313</guid>
      <comments>https://eltgroup.tistory.com/313#entry313comment</comments>
      <pubDate>Thu, 29 Dec 2016 06:02:02 +0900</pubDate>
    </item>
    <item>
      <title>구글플레이 유저 토큰 서버 인증</title>
      <link>https://eltgroup.tistory.com/312</link>
      <description>&lt;p&gt;원문 :&amp;nbsp;&lt;a href=&quot;https://developers.google.com/identity/sign-in/web/backend-auth&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://developers.google.com/identity/sign-in/web/backend-auth&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;구글플레이 서비스 SDK를 통해서 클라이언트측에서 로그인하고 인증 정보를 서버로 넘겨서 서버측에서 클라이언트의 인증 정보를 검증하는 방법은 아래와 같다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;box-sizing: inherit; background: rgb(247, 247, 247); color: rgb(55, 71, 79); font-stretch: normal; font-size: 14px; line-height: 20px; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; padding: 8px; margin-top: 16px; margin-bottom: 16px; overflow-x: auto;&quot;&gt;https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=XYZ123&lt;/pre&gt;&lt;pre style=&quot;box-sizing: inherit; background: rgb(247, 247, 247); color: rgb(55, 71, 79); font-stretch: normal; font-size: 14px; line-height: 20px; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; padding: 8px; margin-top: 16px; margin-bottom: 16px; overflow-x: auto;&quot;&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style=&quot;box-sizing: inherit; background: rgb(247, 247, 247); color: rgb(55, 71, 79); font-stretch: normal; font-size: 14px; line-height: 20px; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; padding: 8px; margin-top: 16px; margin-bottom: 16px; overflow-x: auto;&quot;&gt;&lt;p&gt;위주소의 XYZ123부분에 클라이언트가 보내온 액세스 토큰을 넣고 Post또는 Get요청을 보내면 응답을 받을 수 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;HTTP 200응답이 수신될경우 JSON포맷의 결과 값을 받게 되고, 대략 아래와 같은 형태이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre style=&quot;box-sizing: inherit; background: rgb(247, 247, 247); font-stretch: normal; line-height: 20px; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; padding: 8px; margin-top: 16px; margin-bottom: 16px; overflow-x: auto;&quot;&gt;{
 // These six fields are included in all Google ID Tokens.
 &quot;iss&quot;: &quot;https://accounts.google.com&quot;,
 &quot;sub&quot;: &quot;110169484474386276334&quot;,
 &quot;azp&quot;: &quot;1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com&quot;,
 &quot;aud&quot;: &quot;1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com&quot;,
 &quot;iat&quot;: &quot;1433978353&quot;,
 &quot;exp&quot;: &quot;1433981953&quot;,

 // These seven fields are only included when the user has granted the &quot;profile&quot; and
 // &quot;email&quot; OAuth scopes to the application.
 &quot;email&quot;: &quot;testuser@gmail.com&quot;,
 &quot;email_verified&quot;: &quot;true&quot;,
 &quot;name&quot; : &quot;Test User&quot;,
 &quot;picture&quot;: &quot;https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg&quot;,
 &quot;given_name&quot;: &quot;Test&quot;,
 &quot;family_name&quot;: &quot;User&quot;,
 &quot;locale&quot;: &quot;en&quot;
}&lt;/pre&gt;&lt;pre style=&quot;box-sizing: inherit; background: rgb(247, 247, 247); font-stretch: normal; line-height: 20px; font-family: &amp;quot;Roboto Mono&amp;quot;, monospace; padding: 8px; margin-top: 16px; margin-bottom: 16px; overflow-x: auto;&quot;&gt;&lt;p&gt;이중에서 aud값에 앱의 클라이언트 ID를 담고 있는데 일치 하는지 확인하고 일치한다면,&lt;/p&gt;&lt;p&gt;sub 항목을 유저의 ID로 사용하면된다. sub항목은 구글에서 개인을 식별할 수 있는 유니크 ID이다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>안드로이드</category>
      <category>oauth2.0</category>
      <category>구글 서비스</category>
      <category>구글 토큰인증</category>
      <category>구글플레이</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/312</guid>
      <comments>https://eltgroup.tistory.com/312#entry312comment</comments>
      <pubDate>Fri, 28 Oct 2016 14:02:29 +0900</pubDate>
    </item>
    <item>
      <title>이클립스 c++ 환경구축</title>
      <link>https://eltgroup.tistory.com/311</link>
      <description>&lt;p&gt;이클립스 사이트에서 c++용 이클립스 다운로드 : &lt;b&gt;Eclipse IDE for C/C++ Developers&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.eclipse.org/downloads/eclipse-packages/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://www.eclipse.org/downloads/eclipse-packages/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;현재 최신 버전은 이클립스 네온&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이클립스 실행 후 &amp;nbsp;메뉴중&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Help -&amp;gt; Install New Software를 선택해서 몇가지 소프트웨어 설치가 필요하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;해당 메뉴를 선택하면 Install이라는 창이 나온다.&lt;/p&gt;&lt;p&gt;창에서 Work with부분의 콤보박스를 선택해보면 다음과 같은 항목이 있다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;CDT - http://download.eclipse.org/tools/cdt/releases/9.0&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위주소는 이클립스 버전에 따라서 다를 수 있음&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;해당 주소를 선택하면 아래쪽에 체크가 가능한 몇개의 항목이 나온다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;CDT Main Features 및 CDT Optional Features를 선택하고 설치를 해준다.&lt;/p&gt;&lt;p&gt;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제 MinGW를 설치해준다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://sourceforge.net/projects/mingw/files/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://sourceforge.net/projects/mingw/files/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위주소로 가서 설치 파일을 다운로드 후 설치를 진행한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;설치 프로그램을 실행하면 몇가지 초기설치 단계가 진행되고 이후에 몇개의 설치 가능한 패키지를 선택하는 창이 출력된다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;여기에서 최소 C++컴파일러와 툴킷은 선택하고 설치하도록 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;설치 버튼이 따로 있는건 아니고, 메뉴항목중 Installation-&amp;gt;Apply Changes를 눌러서 패키지 설치/제거가 가능하다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;시스템 환경변수의 Path에 &amp;nbsp;MinGW의 bin폴더를 추가해준다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;윈도우 컴맨드를 실행해서 gcc를 입력했을때 컴파일러가 실행되면 성공&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;이제 이클립스에서 컴파일러를 설정해줘야 한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이클립스의 메뉴에서&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Window -&amp;gt; preferences -&amp;gt; C/C++ -&amp;gt; Build -&amp;gt; Settings -&amp;gt; Discovery항목을 선택한다.&lt;/p&gt;&lt;p&gt;출력되는 창에서 CDT GCC Built-in Compiler Setting[Shcred]를 눌러 COMMAND항목에&lt;/p&gt;&lt;p&gt;-std=c+11 옵션을 뒤쪽에 추가해준다.&lt;/p&gt;&lt;p&gt;------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제 이클립스에서 C++프로젝트를 만들고 프로젝트에 C++컴파일러관련 정보를 설정해야한다,.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;프로젝트의 프로퍼티창을 오픈한다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;C/C++ Build항목의 Setting를 선택하고 창의 오른쪽에 출력되는 정보중&lt;/p&gt;&lt;p&gt;GCC C++ Compiler-&amp;gt; Dialect 항목을 선택하고 그오른쪽에 다시&lt;/p&gt;&lt;p&gt;Language standard 콤복박스에서 ISO C++11(-std=C++0X)를 선택해준다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>C/C++</category>
      <category>C/C++</category>
      <category>이클립스</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/311</guid>
      <comments>https://eltgroup.tistory.com/311#entry311comment</comments>
      <pubDate>Thu, 27 Oct 2016 11:42:19 +0900</pubDate>
    </item>
    <item>
      <title>jQuery Event Methods(JQuery 이벤트 메소드들)</title>
      <link>https://eltgroup.tistory.com/306</link>
      <description>&lt;h1 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 36px; font-weight: 400; margin: 10px 0px;&quot;&gt;jQuery&amp;nbsp;&lt;span class=&quot;color_h1&quot; style=&quot;box-sizing: border-box;&quot;&gt;Event Methods(JQuery 이벤트 메소드들)&lt;/span&gt;&lt;/h1&gt;&lt;div class=&quot;chapter&quot; style=&quot;box-sizing: border-box; font-size: 20px; margin: 0px; padding: 0px; width: auto; overflow: hidden; font-family: Verdana, sans-serif; visibility: visible;&quot;&gt;&lt;div class=&quot;prev&quot; style=&quot;box-sizing: border-box; width: 519.344px; float: left; overflow: hidden; white-space: nowrap;&quot;&gt;&lt;a class=&quot;chapter&quot; href=&quot;http://www.w3schools.com/jquery/jquery_selectors.asp&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(61, 139, 64); visibility: visible; background-color: transparent;&quot;&gt;« Previous&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;next&quot; style=&quot;box-sizing: border-box; width: 623.203px; float: right; text-align: right; white-space: nowrap; overflow: hidden;&quot;&gt;&lt;a class=&quot;chapter&quot; href=&quot;http://www.w3schools.com/jquery/jquery_hide_show.asp&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(61, 139, 64); visibility: visible; background-color: transparent;&quot;&gt;Next Chapter »&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;p class=&quot;intro&quot; style=&quot;box-sizing: border-box; font-size: 16px; font-family: Verdana, sans-serif;&quot;&gt;jQuery is tailor-made to respond to events in an HTML page.&lt;/p&gt;&lt;p class=&quot;intro&quot; style=&quot;box-sizing: border-box; font-size: 16px; font-family: Verdana, sans-serif;&quot;&gt;&lt;b&gt;JQuery는 HTML페이지의 이벤트들을 수신하는형태로 디지인되었다.&lt;/b&gt;&lt;/p&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;What are Events?(이벤트는 무엇인가?)&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;All the different visitor's actions that a web page can respond to are called events.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;An event represents the precise moment when something happens.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;Examples:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;웹페이지가 응답할&amp;nbsp;수 있는 모든 다른 방문자들의 행동들이 이벤트라 불려진다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;이벤트는 특정한 순간에 무언가 일어났다는것을 나타낸다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;예제 :&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;moving a mouse over an element&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;selecting a radio button&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;clicking on an element&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;b&gt;요소위에 마우스가 움직임&lt;/b&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;b&gt;라디오 버튼이 선택됨&lt;/b&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;b&gt;요소가 클릭됨&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The term&amp;nbsp;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;&quot;fires/fired&quot;&lt;/b&gt;&amp;nbsp;is often used with events. Example: &quot;The keypress event is fired, the moment you press a key&quot;.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;Here are some common DOM events:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;조건 &quot;fires/fired&quot;는 종종이벤트오 함께 사용된다. 예 : &quot;당신이 키를 누를때 키눌림 이벤트가 발생했다&quot;.&lt;/b&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;다음은 몇가지의 공통적인 DOM이벤트들이다.&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;table-responsive&quot; style=&quot;box-sizing: border-box; overflow-x: auto; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;table class=&quot;w3-table-all notranslate&quot; style=&quot;box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; width: 1298px; border: 1px solid rgb(204, 204, 204); margin: 16px 0px;&quot;&gt;&lt;tbody style=&quot;box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221);&quot;&gt;&lt;th style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top; width: 298px;&quot;&gt;Mouse Events&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top; width: 324px;&quot;&gt;Keyboard Events&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top; width: 285px;&quot;&gt;Form Events&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;Document/Window Events&lt;/th&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221); background-color: rgb(241, 241, 241);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;click&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;keypress&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;submit&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;load&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;dblclick&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;keydown&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;change&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;resize&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221); background-color: rgb(241, 241, 241);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;mouseenter&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;keyup&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;focus&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;scroll&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;mouseleave&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&amp;nbsp;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;blur&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;unload&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;jQuery Syntax For Event Methods(이벤트 메소드들을 위한 JQuery문법)&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;In jQuery, most DOM events have an equivalent jQuery method.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;To assign a click event to all paragraphs on a page, you can do this:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;JQuery에서, 대부분의 DOM이벤트들은 동일한 JQuery메소드들을 가진다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;클릭이벤트를 페이지내의 모든 절에 할당하기 위해, 다음과 같이 할 수 있다:&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-code w3-border notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; word-wrap: break-word; margin: 20px 0px; border-width: 1px 1px 1px 4px !important; border-style: solid !important; border-color: rgb(204, 204, 204) rgb(204, 204, 204) rgb(204, 204, 204) rgb(76, 175, 80) !important;&quot;&gt;&lt;div style=&quot;box-sizing: border-box;&quot;&gt;$(&quot;p&quot;).click();&lt;/div&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The next step is to define what should happen when the event fires. You must pass a function to the event:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;다&lt;b&gt;음단계는 이벤트가 발생할때 무슨일이 생기는지 정의하는것이다. 당신은 이벤트에 함수를 전달 할 수 있다 :&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-code w3-border notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; word-wrap: break-word; margin: 20px 0px; border-width: 1px 1px 1px 4px !important; border-style: solid !important; border-color: rgb(204, 204, 204) rgb(204, 204, 204) rgb(204, 204, 204) rgb(76, 175, 80) !important;&quot;&gt;&lt;div style=&quot;box-sizing: border-box;&quot;&gt;$(&quot;p&quot;).click(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp; // action goes here!!&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;Commonly Used jQuery Event Methods(공통적으로 사용된 JQuery이벤트 메소드들)&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;$(document).ready()&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The $(document).ready() method allows us to execute a function when the document is fully loaded. This event is already explained in the&amp;nbsp;&lt;a href=&quot;http://www.w3schools.com/jquery/jquery_syntax.asp&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: inherit; background-color: transparent;&quot;&gt;jQuery Syntax&lt;/a&gt;&amp;nbsp;chapter.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;$(document).ready() 메소드는 우리에게 문서가 완전히 로드될때 함수가 실행될 수 있게한다. 이 이벤트는 JQuery문법 장에서 이미 설명했다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;click()&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The click() method attaches an event handler function to an HTML element.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The function is executed when the user clicks on the HTML element.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The following example says: When a click event fires on a &amp;lt;p&amp;gt; element; hide the current &amp;lt;p&amp;gt; element:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;click()메소드는 HTML요소에 이벤트 핸들러 함수를 결합한다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;함수는 사용자가 HTML요소를 클릭할때 실행된다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;다음 예제는 :&amp;nbsp; &amp;lt;p&amp;gt;요소에 클릭이벤트가 발생할때, 현재의 &amp;lt;p&amp;gt;요소를 숨긴다 :&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Example&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;$(&quot;p&quot;).click(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(this).hide();&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn w3-margin-bottom&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_click&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;dblclick()&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The dblclick() method attaches an event handler function to an HTML element.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The function is executed when the user double-clicks on the HTML element:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;dblclick() 메소드는 HTML요소에 이벤트 핸들러를 결합한다. 이함수는 HTML요소가 더블클릭될때 실행된다.&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Example&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;$(&quot;p&quot;).dblclick(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(this).hide();&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn w3-margin-bottom&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_dblclick&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;mouseenter()&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The mouseenter() method attaches an event handler function to an HTML element.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The function is executed when the mouse pointer enters the HTML element:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;mouseenter() 메소드는 HTML요소에이벤트 핸들러 함수를 결합한다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;함수는 HTML요소에 마우스 포인터가 위치할때 실행된다.&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Example&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;$(&quot;#p1&quot;).mouseenter(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&quot;You entered p1!&quot;);&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn w3-margin-bottom&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_mouseenter&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;mouseleave()&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The mouseleave() method attaches an event handler function to an HTML element.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The function is executed when the mouse pointer leaves the HTML element:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;mouseleave()메소드는 HTML요소에 이벤트 핸들러를 결합한다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;함수는 HTML요소에 마우스 포인터가 떠날때 실행된다.&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Example&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;$(&quot;#p1&quot;).mouseleave(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&quot;Bye! You now leave p1!&quot;);&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn w3-margin-bottom&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_mouseleave&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;mousedown()&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The mousedown() method attaches an event handler function to an HTML element.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The function is executed, when the left, middle or right mouse button is pressed down, while the mouse is over the HTML element:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;mousedown() 메소드는 HTML요소에 이벤트 핸들러를 결합한다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;함수는 왼쪽, 중앙, 오른쪽 마우스 버튼이 눌려진상태에서 HTML요소위에 있을때 발생한다.&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Example&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;$(&quot;#p1&quot;).mousedown(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&quot;Mouse down over p1!&quot;);&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn w3-margin-bottom&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_mousedown&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;mouseup()&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The mouseup() method attaches an event handler function to an HTML element.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The function is executed, when the left, middle or right mouse button is released, while the mouse is over the HTML element:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;mouseup()는 HTML요소에 이벤트 핸들러를 결합한다. 함수는 마우스의 커서가 HTML요소 위에 있는상태에서&amp;nbsp;왼쪽, 중앙, 오른쪽 버튼이 눌림해제될때 실행된다.&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Example&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;$(&quot;#p1&quot;).mouseup(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&quot;Mouse up over p1!&quot;);&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn w3-margin-bottom&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_mouseup&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;hover()&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The hover() method takes two functions and is a combination of the mouseenter() and mouseleave() methods.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The first function is executed when the mouse enters the HTML element, and the second function is executed when the mouse leaves the HTML element:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;hover() 메소드는 두개의 함수 mouseenter()와&amp;nbsp;mouseleave()메소드들의 결합형이다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;첫번째 함수는 HTML요소에 마우스가 위치할때 실행되고, 두번째는 마우스가 요소 위에서 떠날때 실행된다:&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Example&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;$(&quot;#p1&quot;).hover(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&quot;You entered p1!&quot;);&lt;br style=&quot;box-sizing: border-box;&quot;&gt;},&lt;br style=&quot;box-sizing: border-box;&quot;&gt;function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert(&quot;Bye! You now leave p1!&quot;);&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn w3-margin-bottom&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_hover&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;focus()&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The focus() method attaches an event handler function to an HTML form field.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The function is executed when the form field gets focus:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;focus()메소드는 HTML폼 필드에 이벤트 핸들러를 결합한다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;함수는 폼필드가 포커스를 얻을때 실행된다.&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Example&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;$(&quot;input&quot;).focus(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(this).css(&quot;background-color&quot;, &quot;#cccccc&quot;);&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn w3-margin-bottom&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_focus_blur&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;blur()&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The blur() method attaches an event handler function to an HTML form field.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The function is executed when the form field loses focus:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;blur() 메소드는 HTML폼필드에 이벤트 핸들러를 결합한다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;함수는 폴필드가 포커스를 잃을때 실행된다.&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Example&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;$(&quot;input&quot;).blur(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(this).css(&quot;background-color&quot;, &quot;#ffffff&quot;);&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn w3-margin-bottom&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_focus_blur&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;The on() Method&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The on() method attaches one or more event handlers for the selected elements.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;Attach a click event to a &amp;lt;p&amp;gt; element:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;on()메소드는 선택된 요소들에 하나또는 그이상의 이벤트 핸드러를 결합시킨다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;&amp;lt;p&amp;gt;요소에 클릭이벤트를 결합시키기 :&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Example&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;$(&quot;p&quot;).on(&quot;click&quot;, function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(this).hide();&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn w3-margin-bottom&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_on_click&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;Attach multiple event handlers to a &amp;lt;p&amp;gt; element:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;&amp;lt;p&amp;gt;요소에 다중 이벤트 핸들러 결합하기:&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Example&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;$(&quot;p&quot;).on({&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseenter: function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(this).css(&quot;background-color&quot;, &quot;lightgray&quot;);&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mouseleave: function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(this).css(&quot;background-color&quot;, &quot;lightblue&quot;);&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; click: function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(this).css(&quot;background-color&quot;, &quot;yellow&quot;);&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn w3-margin-bottom&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_on_multiple&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;Test Yourself with Exercises!&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;a class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/exercise.asp?filename=exercise_events1&quot; target=&quot;_blank&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin: 10px 5px 0px 0px; background-color: rgb(76, 175, 80);&quot;&gt;Exercise 1 »&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;a class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/exercise.asp?filename=exercise_events2&quot; target=&quot;_blank&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin: 10px 5px 0px 0px; background-color: rgb(76, 175, 80);&quot;&gt;Exercise 2 »&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;a class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/exercise.asp?filename=exercise_events3&quot; target=&quot;_blank&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin: 10px 5px 0px 0px; background-color: rgb(76, 175, 80);&quot;&gt;Exercise 3 »&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;a class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/exercise.asp?filename=exercise_events4&quot; target=&quot;_blank&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin: 10px 5px 0px 0px; background-color: rgb(76, 175, 80);&quot;&gt;Exercise 4 »&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;a class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/exercise.asp?filename=exercise_events5&quot; target=&quot;_blank&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin: 10px 5px 0px 0px; background-color: rgb(76, 175, 80);&quot;&gt;Exercise 5 »&lt;/a&gt;&lt;/p&gt;</description>
      <category>JQuery</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/306</guid>
      <comments>https://eltgroup.tistory.com/306#entry306comment</comments>
      <pubDate>Mon, 14 Mar 2016 15:26:34 +0900</pubDate>
    </item>
    <item>
      <title>jQuery Selectors(JQuery선택자)</title>
      <link>https://eltgroup.tistory.com/305</link>
      <description>&lt;h1 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 36px; font-weight: 400; margin: 10px 0px;&quot;&gt;jQuery&amp;nbsp;&lt;span class=&quot;color_h1&quot; style=&quot;box-sizing: border-box;&quot;&gt;Selectors(JQuery 선택자)&lt;/span&gt;&lt;/h1&gt;&lt;div class=&quot;chapter&quot; style=&quot;box-sizing: border-box; font-size: 20px; margin: 0px; padding: 0px; width: auto; overflow: hidden; font-family: Verdana, sans-serif; visibility: visible;&quot;&gt;&lt;div class=&quot;prev&quot; style=&quot;box-sizing: border-box; width: 519.344px; float: left; overflow: hidden; white-space: nowrap;&quot;&gt;&lt;a class=&quot;chapter&quot; href=&quot;http://www.w3schools.com/jquery/jquery_syntax.asp&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(61, 139, 64); visibility: visible; background-color: transparent;&quot;&gt;« Previous&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;next&quot; style=&quot;box-sizing: border-box; width: 623.203px; float: right; text-align: right; white-space: nowrap; overflow: hidden;&quot;&gt;&lt;a class=&quot;chapter&quot; href=&quot;http://www.w3schools.com/jquery/jquery_events.asp&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(61, 139, 64); visibility: visible; background-color: transparent;&quot;&gt;Next Chapter »&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;p class=&quot;intro&quot; style=&quot;box-sizing: border-box; font-size: 16px; font-family: Verdana, sans-serif;&quot;&gt;jQuery selectors are one of the most important parts of the jQuery library.&lt;/p&gt;&lt;p class=&quot;intro&quot; style=&quot;box-sizing: border-box; font-size: 16px; font-family: Verdana, sans-serif;&quot;&gt;&lt;b&gt;JQuery 선택자들은 JQuery라이브러리의 가장 중요한 부분중 하나이다.&lt;/b&gt;&lt;/p&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;jQuery Selectors&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;jQuery selectors allow you to select and manipulate HTML element(s).&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;jQuery selectors are used to &quot;find&quot; (or select) HTML elements based on their id, classes, types, attributes, values of attributes and much more. It's based on the existing&amp;nbsp;&lt;a href=&quot;http://www.w3schools.com/cssref/css_selectors.asp&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: inherit; background-color: transparent;&quot;&gt;CSS Selectors&lt;/a&gt;, and in addition, it has some own custom selectors.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;All selectors in jQuery start with the dollar sign and parentheses: $().&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;JQuery선택자들은 당신에게 HTML요소들을 선택하고 조작할 수 있게 한다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;JQuery선택자들은 id, 클래스, 속성, 속성의 값이나 더많은 항목들로부터 HTML요소들을 찾는(또는 선택하는)데 사용된다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;이것은 기존의 CSS 선택자를 기반으로 하며, 추가적으로, 약간의 자체적인 선택자를 가지고 있다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;JQuery의 모든 선택자들은 달러 신호와 괄호로 시작된다 : $()&lt;/b&gt;&lt;/p&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;The element Selector(요소 선택자)&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The jQuery element selector selects elements based on the element name.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;You can select all &amp;lt;p&amp;gt; elements on a page like this:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;JQuery요소 선택자는 요소의 이름에 기반하여 요소를 선택한다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;당신은 페이지모든 &amp;lt;P&amp;gt;요소들을 다음과 같이 선택할 수 있다 :&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-code w3-border notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; word-wrap: break-word; margin: 20px 0px; border-width: 1px 1px 1px 4px !important; border-style: solid !important; border-color: rgb(204, 204, 204) rgb(204, 204, 204) rgb(204, 204, 204) rgb(76, 175, 80) !important;&quot;&gt;&lt;div style=&quot;box-sizing: border-box;&quot;&gt;$(&quot;p&quot;)&lt;/div&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;Example(예)&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;When a user clicks on a button, all &amp;lt;p&amp;gt; elements will be hidden:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;유저가 버튼을 클릭할때, 모든 &amp;lt;P&amp;gt;요소들이 숨겨질것이다 :&amp;nbsp;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Example&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;$(document).ready(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&quot;button&quot;).click(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $(&quot;p&quot;).hide();&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn w3-margin-bottom&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_hide_p&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;The #id Selector(#id 선택자)&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The jQuery #id selector uses the id attribute of an HTML tag to find the specific element.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;An id should be unique within a page, so you should use the #id selector when you want to find a single, unique element.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;JQuery의 #id선택자는 특정한 요소를 찾기 위해 HTML태그의 id속성을 사용한다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;id는 대개 페이지안에서 유일한것이므로, &amp;nbsp;당신은 #id선택자를 페이지내에서 유일한 단일요소를 찾기 원할때 사용할 수 있을것이다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;To find an element with a specific id, write a hash character, followed by the id of the HTML element:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;특정 ID와 함께 요소를 찾기 위해, 해시문자를 쓰고, 이어서 HTML요소의 ID를 쓴다.&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-code w3-border notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; word-wrap: break-word; margin: 20px 0px; border-width: 1px 1px 1px 4px !important; border-style: solid !important; border-color: rgb(204, 204, 204) rgb(204, 204, 204) rgb(204, 204, 204) rgb(76, 175, 80) !important;&quot;&gt;&lt;div style=&quot;box-sizing: border-box;&quot;&gt;$(&quot;#test&quot;)&lt;/div&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;Example(예)&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;When a user clicks on a button, the element with id=&quot;test&quot; will be hidden:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;유저가 버튼을 클릭할때, 요소의 id가 &quot;test&quot;인것이 숨겨질것이다.&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Example&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;$(document).ready(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&quot;button&quot;).click(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $(&quot;#test&quot;).hide();&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn w3-margin-bottom&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_hide_id&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;The .class Selector(.class 선택자)&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The jQuery class selector finds elements with a specific class.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;To find elements with a specific class, write a period character, followed by the name of the class:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;JQuery 클래스 선택자는 특정 클래스이름을 갖는 요소들을 찾는다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;특정클래스를 찾기 위해, 마침표를 쓰고, 이어서 클래스 이름을 적는다.&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-code w3-border notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; word-wrap: break-word; margin: 20px 0px; border-width: 1px 1px 1px 4px !important; border-style: solid !important; border-color: rgb(204, 204, 204) rgb(204, 204, 204) rgb(204, 204, 204) rgb(76, 175, 80) !important;&quot;&gt;&lt;div style=&quot;box-sizing: border-box;&quot;&gt;$(&quot;.test&quot;)&lt;/div&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;Example(예)&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;When a user clicks on a button, the elements with class=&quot;test&quot; will be hidden:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;유저가 버튼을 클릭ㅎㄹ때, 클래스 이름이 &quot;test&quot;인 요소들을 숨긴다 :&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Example&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;$(document).ready(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(&quot;button&quot;).click(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; $(&quot;.test&quot;).hide();&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn w3-margin-bottom&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_hide_class&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;More Examples of jQuery Selectors(JQuery선택자들에 대한 더많은 예제)&lt;/h2&gt;&lt;div class=&quot;table-responsive&quot; style=&quot;box-sizing: border-box; overflow-x: auto; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;table class=&quot;w3-table-all notranslate&quot; style=&quot;box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; width: 1298px; border: 1px solid rgb(204, 204, 204); margin: 16px 0px;&quot;&gt;&lt;tbody style=&quot;box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221);&quot;&gt;&lt;th style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top; width: 324px;&quot;&gt;Syntax&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top; width: 843px;&quot;&gt;Description&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;Example&lt;/th&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221); background-color: rgb(241, 241, 241);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;$(&quot;*&quot;)&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;Selects all elements(&lt;b&gt;모든요소선택&lt;/b&gt;)&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_sel_all2&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; background-color: rgb(76, 175, 80);&quot;&gt;Try it&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;$(this)&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;p&gt;Selects the current HTML element(&lt;b&gt;현재 HTML요소를 선택&lt;/b&gt;)&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_sel_this&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; background-color: rgb(76, 175, 80);&quot;&gt;Try it&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221); background-color: rgb(241, 241, 241);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;$(&quot;p.intro&quot;)&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;p&gt;Selects all &amp;lt;p&amp;gt; elements with class=&quot;intro&quot;(&lt;b&gt;모든 p요소들중 클래스가 intro인것들 선택&lt;/b&gt;)&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_sel_pclass&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; background-color: rgb(76, 175, 80);&quot;&gt;Try it&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;$(&quot;p:first&quot;)&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;p&gt;Selects the first &amp;lt;p&amp;gt; element(&lt;b&gt;첫번째 &amp;lt;p&amp;gt;요소 선택&lt;/b&gt;)&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_sel_pfirst&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; background-color: rgb(76, 175, 80);&quot;&gt;Try it&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221); background-color: rgb(241, 241, 241);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;$(&quot;ul li:first&quot;)&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;p&gt;Selects the first &amp;lt;li&amp;gt; element of the first &amp;lt;ul&amp;gt;(&lt;b&gt;첫번째 &amp;lt;ul&amp;gt;요소의 첫번째 &amp;lt;li&amp;gt;선택&lt;/b&gt;)&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_sel_ullifirst&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; background-color: rgb(76, 175, 80);&quot;&gt;Try it&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;$(&quot;ul li:first-child&quot;)&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;p&gt;Selects the first &amp;lt;li&amp;gt; element of every &amp;lt;ul&amp;gt;(&lt;b&gt;모든 &amp;lt;ul&amp;gt;요소들의 첫번째 &amp;lt;li&amp;gt;선택&lt;/b&gt;)&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_sel_ullifirstchild&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; background-color: rgb(76, 175, 80);&quot;&gt;Try it&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221); background-color: rgb(241, 241, 241);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;$(&quot;[href]&quot;)&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;Selects all elements with an href attribute(&lt;b&gt;href속성의 요소들 선택&lt;/b&gt;)&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_sel_hrefattr&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; background-color: rgb(76, 175, 80);&quot;&gt;Try it&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;$(&quot;a[target='_blank']&quot;)&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;p&gt;Selects all &amp;lt;a&amp;gt; elements with a target attribute value equal to &quot;_blank&quot;(타겟속성이 &quot;_blank&quot;인모든 &amp;lt;a&amp;gt;요소들 선택&lt;/p&gt;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_sel_hrefattrblank&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; background-color: rgb(76, 175, 80);&quot;&gt;Try it&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221); background-color: rgb(241, 241, 241);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;$(&quot;a[target!='_blank']&quot;)&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;Selects all &amp;lt;a&amp;gt; elements with a target attribute value NOT equal to &quot;_blank&quot;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_sel_hrefattrnotblank&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; background-color: rgb(76, 175, 80);&quot;&gt;Try it&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;$(&quot;:button&quot;)&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;Selects all &amp;lt;button&amp;gt; elements and &amp;lt;input&amp;gt; elements of type=&quot;button&quot;&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_sel_button2&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; background-color: rgb(76, 175, 80);&quot;&gt;Try it&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221); background-color: rgb(241, 241, 241);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;$(&quot;tr:even&quot;)&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;Selects all even &amp;lt;tr&amp;gt; elements&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_sel_even&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; background-color: rgb(76, 175, 80);&quot;&gt;Try it&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(221, 221, 221);&quot;&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;$(&quot;tr:odd&quot;)&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;Selects all odd &amp;lt;tr&amp;gt; elements&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; border: none; padding: 8px; vertical-align: top;&quot;&gt;&lt;a target=&quot;_blank&quot; class=&quot;w3-btn&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_sel_odd&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; background-color: rgb(76, 175, 80);&quot;&gt;Try it&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;Use our&amp;nbsp;&lt;a target=&quot;_blank&quot; href=&quot;http://www.w3schools.com/jquery/trysel.asp&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: inherit; background-color: transparent;&quot;&gt;jQuery Selector Tester&lt;/a&gt;&amp;nbsp;to demonstrate the different selectors.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;For a complete reference of all the jQuery selectors, please go to our&amp;nbsp;&lt;a href=&quot;http://www.w3schools.com/jquery/jquery_ref_selectors.asp&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: inherit; background-color: transparent;&quot;&gt;jQuery Selectors Reference&lt;/a&gt;.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;다른 선택자들의 차이점들에 대해 실습해보기 위해 우리의 JQuery선택자 테스터를 사용해라.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;JQuery선택자들의 완전한 참조를 위해 우리의 JQuery선택자 참조로 이동하라.&lt;/b&gt;&lt;/p&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;Functions In a Separate File(분리된 파일에서의 함수들)&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;If your website contains a lot of pages, and you want your jQuery functions to be easy to maintain, you can put your jQuery functions in a separate .js file.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;When we demonstrate jQuery in this tutorial, the functions are added directly into the &amp;lt;head&amp;gt; section. However, sometimes it is preferable to place them in a separate file, like this (use the src attribute to refer to the .js file):&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;만일 당신의 사이트가 많은 페이지들을 담고 있고, 당신이 JQuery 함수들이 쉽게 관리되기를 원한다면, 당신은 JQuery 함수들을 분리된 .js파일에 놓을 수 있다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;우리는 이튜토리얼에서 JQuery실습을 할때, 함수들을 &amp;lt;head&amp;gt;섹션 내부에 추가했었다. 하지만, 때로는 다음과 같이 그것을 분리된 위치에 놓는것이 유용할때가 있다(.js 파일을 참조하기위해 src속성을 사용한다):&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Example&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;&amp;lt;head&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js&quot;&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;lt;/script&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;span class=&quot;marked&quot; style=&quot;box-sizing: border-box; color: rgb(232, 0, 0); background-color: transparent;&quot;&gt;&amp;lt;script src=&quot;my_jquery_functions.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;lt;/head&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>JQuery</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/305</guid>
      <comments>https://eltgroup.tistory.com/305#entry305comment</comments>
      <pubDate>Mon, 14 Mar 2016 14:55:32 +0900</pubDate>
    </item>
    <item>
      <title>jQuery Syntax(Jquery 문법)</title>
      <link>https://eltgroup.tistory.com/304</link>
      <description>&lt;h1 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 36px; font-weight: 400; margin: 10px 0px;&quot;&gt;jQuery&amp;nbsp;&lt;span class=&quot;color_h1&quot; style=&quot;box-sizing: border-box;&quot;&gt;Syntax(JQuery 문법)&lt;/span&gt;&lt;/h1&gt;&lt;div class=&quot;chapter&quot; style=&quot;box-sizing: border-box; font-size: 20px; margin: 0px; padding: 0px; width: auto; overflow: hidden; font-family: Verdana, sans-serif; visibility: visible;&quot;&gt;&lt;div class=&quot;prev&quot; style=&quot;box-sizing: border-box; width: 519.344px; float: left; overflow: hidden; white-space: nowrap;&quot;&gt;&lt;a class=&quot;chapter&quot; href=&quot;http://www.w3schools.com/jquery/jquery_get_started.asp&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(61, 139, 64); visibility: visible; background-color: transparent;&quot;&gt;« Previous&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;next&quot; style=&quot;box-sizing: border-box; width: 623.203px; float: right; text-align: right; white-space: nowrap; overflow: hidden;&quot;&gt;&lt;a class=&quot;chapter&quot; href=&quot;http://www.w3schools.com/jquery/jquery_selectors.asp&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(61, 139, 64); visibility: visible; background-color: transparent;&quot;&gt;Next Chapter »&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;p class=&quot;intro&quot; style=&quot;box-sizing: border-box; font-size: 16px; font-family: Verdana, sans-serif;&quot;&gt;With jQuery you select (query) HTML elements and perform &quot;actions&quot; on them.&lt;/p&gt;&lt;p class=&quot;intro&quot; style=&quot;box-sizing: border-box; font-size: 16px; font-family: Verdana, sans-serif;&quot;&gt;&lt;b&gt;JQuery에서 당신은 HTML요소들을 선택하고 그들에게 액션을 수행한다.&lt;/b&gt;&lt;/p&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;jQuery Syntax&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The jQuery syntax is tailor-made for&amp;nbsp;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;selecting&lt;/b&gt;&amp;nbsp;HTML elements and performing some&amp;nbsp;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;action&lt;/b&gt;&amp;nbsp;on the element(s).&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;Basic syntax is:&amp;nbsp;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;$(&lt;i style=&quot;box-sizing: border-box;&quot;&gt;selector&lt;/i&gt;).&lt;i style=&quot;box-sizing: border-box;&quot;&gt;action&lt;/i&gt;()&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;JQuery의 문법은 HTML의 요소를 선택하고 요소로부터 무언가 액션을 수행하는데 맞춰진 형태이다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;기본문법은 다음과 같다 : $(선택자).action()&lt;/b&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;A $ sign to define/access jQuery&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;A (&lt;i style=&quot;box-sizing: border-box;&quot;&gt;selector&lt;/i&gt;) to &quot;query (or find)&quot; HTML elements&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;A jQuery&amp;nbsp;&lt;i style=&quot;box-sizing: border-box;&quot;&gt;action&lt;/i&gt;() to be performed on the element(s)&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;b&gt;$는 JQuery에 대한 선언/접근을 위한 신호이다.&lt;/b&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;b&gt;(선택자)는 HTML요소를 조회(찾기)위한것이다.&lt;/b&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;b&gt;JQuery Action()은 요소에 대한 실행이 될것이다.&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;Examples(&lt;b&gt;예&lt;/b&gt;):&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;$(this).hide() - hides the current element.(&lt;b&gt;현재 요소를 숨김&lt;/b&gt;)&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;$(&quot;p&quot;).hide() - hides all &amp;lt;p&amp;gt; elements.(&lt;b&gt;모든 P요소를 숨김&lt;/b&gt;)&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;$(&quot;.test&quot;).hide() - hides all elements with class=&quot;test&quot;.(&lt;b&gt;클래스가 &quot;test&quot;인 모든 요소를 숨김&lt;/b&gt;)&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;$(&quot;#test&quot;).hide() - hides the element with id=&quot;test&quot;.(&lt;b&gt;id가 &quot;test&quot;인 요소를 숨김&lt;/b&gt;)&lt;/p&gt;&lt;table class=&quot;lamp&quot; style=&quot;box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; width: 1298px; border: 1px solid rgb(221, 221, 221); margin: 16px 0px; color: rgb(0, 0, 0); font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;tbody style=&quot;box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;box-sizing: border-box;&quot;&gt;&lt;th style=&quot;box-sizing: content-box; border: none; padding: 10px; width: 34px;&quot;&gt;&lt;img src=&quot;http://www.w3schools.com/images/lamp.jpg&quot; alt=&quot;Note&quot; style=&quot;box-sizing: border-box; border: 0px; margin-bottom: -5px; height: 32px; width: 32px;&quot;&gt;&lt;/th&gt;&lt;td style=&quot;box-sizing: border-box; border: none;&quot;&gt;&lt;p&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;Are you familiar with CSS selectors?(CSS 선택자와 유사하다 생각되지 않는가?)&lt;/b&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;jQuery uses CSS syntax to select elements. You will learn more about the selector syntax in the next chapter of this tutorial.&lt;/p&gt;&lt;p&gt;&lt;b&gt;JQuery는 요소 선택에 CSS 문법을 사용한다. 튜토리얼의 다음장에서 선택자의 문법에 대해서 배우게 될것이다.&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;The Document Ready Event(문서 준비됨 이벤트)&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;You might have noticed that all jQuery methods in our examples, are inside a document ready event:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;당신은 우리 예제들의 모든 JQuery메소드들이 document ready 이벤트 내부에 있는것을 볼수 있다.&lt;/p&gt;&lt;div class=&quot;w3-code w3-border notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; word-wrap: break-word; margin: 20px 0px; border-width: 1px 1px 1px 4px !important; border-style: solid !important; border-color: rgb(204, 204, 204) rgb(204, 204, 204) rgb(204, 204, 204) rgb(76, 175, 80) !important;&quot;&gt;&lt;div style=&quot;box-sizing: border-box;&quot;&gt;$(document).ready(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;i style=&quot;box-sizing: border-box;&quot;&gt;// jQuery methods go here...&lt;/i&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;This is to prevent any jQuery code from running before the document is finished loading (is ready).&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;이것은 어떤 JQuery코드가 문서의 로딩이 끝나기(준비되기전) 전에 실행되는것을 피한다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;It is good practice to wait for the document to be fully loaded and ready before working with it. This also allows you to have your JavaScript code before the body of your document, in the head section.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;문서가 완전히 로드될떄까지 기다렸다가 무언가 작업을 하는것이 좋다. 이것은 또한 당신의 자바스크립트 코드가 문서의 바디전 헤드부분에 있을수 있게 허용한다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;Here are some examples of actions that can fail if methods are run before the document is fully loaded:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;아래에 문서가 완전히 로드되기전에 메소드가 실행될경우 실패하게 되는 액션의 예들이 있다 :&lt;/b&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;Trying to hide an element that is not created yet&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;Trying to get the size of an image that is not loaded yet&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;b&gt;아직 만들어지지 않은 요소를 숨기려고 시도할경우&lt;/b&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;b&gt;아직 로드되지 않은 이미지의 크기를 조회할경우&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;Tip:&lt;/b&gt;&amp;nbsp;The jQuery team has also created an even shorter method for the document ready event:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;JQuery팀은 문서 준비됨 이벤트를 위한 더짧은&amp;nbsp;생성됨 이벤트를 만들어 두었다.&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-code w3-border notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; word-wrap: break-word; margin: 20px 0px; border-width: 1px 1px 1px 4px !important; border-style: solid !important; border-color: rgb(204, 204, 204) rgb(204, 204, 204) rgb(204, 204, 204) rgb(76, 175, 80) !important;&quot;&gt;&lt;div style=&quot;box-sizing: border-box;&quot;&gt;$(function(){&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;i style=&quot;box-sizing: border-box;&quot;&gt;// jQuery methods go here...&lt;/i&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;});&lt;/div&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;Use the syntax you prefer. We think that the document ready event is easier to understand when reading the code.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;당신의 마음에 드는 문법을 사용해라. 우리가 생각하기에 문서 준비됨 이벤트를 사용하는게&amp;nbsp;코드를 읽을때 더이해하기 쉬운것같다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>JQuery</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/304</guid>
      <comments>https://eltgroup.tistory.com/304#entry304comment</comments>
      <pubDate>Mon, 14 Mar 2016 14:32:00 +0900</pubDate>
    </item>
    <item>
      <title>JQuery 시작하기</title>
      <link>https://eltgroup.tistory.com/303</link>
      <description>&lt;h1 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 36px; font-weight: 400; margin: 10px 0px;&quot;&gt;jQuery&amp;nbsp;&lt;span class=&quot;color_h1&quot; style=&quot;box-sizing: border-box;&quot;&gt;Get Started(JQuery 시작하기)&lt;/span&gt;&lt;/h1&gt;&lt;div class=&quot;chapter&quot; style=&quot;box-sizing: border-box; font-size: 20px; margin: 0px; padding: 0px; width: auto; overflow: hidden; font-family: Verdana, sans-serif; visibility: visible;&quot;&gt;&lt;div class=&quot;prev&quot; style=&quot;box-sizing: border-box; width: 519.344px; float: left; overflow: hidden; white-space: nowrap;&quot;&gt;&lt;a class=&quot;chapter&quot; href=&quot;http://www.w3schools.com/jquery/jquery_intro.asp&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(61, 139, 64); visibility: visible; background-color: transparent;&quot;&gt;« Previous&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;next&quot; style=&quot;box-sizing: border-box; width: 623.203px; float: right; text-align: right; white-space: nowrap; overflow: hidden;&quot;&gt;&lt;a class=&quot;chapter&quot; href=&quot;http://www.w3schools.com/jquery/jquery_syntax.asp&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(61, 139, 64); visibility: visible; background-color: transparent;&quot;&gt;Next Chapter »&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;Adding jQuery to Your Web Pages(JQuery를 당신의 웹사이트에추가하기)&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;There are several ways to start using jQuery on your web site. You can:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;당신의 웹사이트에서 JQuery를 사용하기위한 다음의 몇가지 방법들이 있다:&lt;/b&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;Download the jQuery library from jQuery.com(&lt;b&gt;JQuery.com으로부터 JQuery라이브러리 다운로드하기&lt;/b&gt;)&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;Include jQuery from a CDN, like Google(&lt;b&gt;구글의 CDN 같은곳을 통해 JQuery를 포함시키기&lt;/b&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;Downloading jQuery(JQuery다운로드하기)&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;There are two versions of jQuery available for downloading:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;다운로드 가능한 두가지 버전의 JQuery라이브러리가 있다:&lt;/b&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;Production version - this is for your live website because it has been minified and compressed&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;b&gt;상용버전 - 이버전은 축소되고 압축되었기 때문에 당신의 라이브 웹사이트를 위한것이다.&lt;/b&gt;&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;Development version - this is for testing and development (uncompressed and readable code)&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;&lt;b&gt;개발버전 - 이것은 테스트 및 개발을 위한 버전이다(압축되지 않았고 읽기 가능한 코드이다)&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;Both versions can be downloaded from&amp;nbsp;&lt;a target=&quot;_blank&quot; href=&quot;http://jquery.com/download/&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: inherit; background-color: transparent;&quot;&gt;jQuery.com&lt;/a&gt;.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;두 버전들은 JQuery.com으로부터 다운로드 할 수 있다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The jQuery library is a single JavaScript file, and you reference it with the HTML &amp;lt;script&amp;gt; tag (notice that the &amp;lt;script&amp;gt; tag should be inside the &amp;lt;head&amp;gt; section):&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;JQuery라이브러리는 단일의 자바스크립트 파일이며, HTML &amp;lt;script&amp;gt; 태그를 통해서 참조할 수 있다(주의할것은 &amp;lt;script&amp;gt;태그는 &amp;lt;head&amp;gt; 섹션내부에 포함되어야 할것이다)&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-code w3-border notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; word-wrap: break-word; margin: 20px 0px; border-width: 1px 1px 1px 4px !important; border-style: solid !important; border-color: rgb(204, 204, 204) rgb(204, 204, 204) rgb(204, 204, 204) rgb(76, 175, 80) !important;&quot;&gt;&lt;div style=&quot;box-sizing: border-box;&quot;&gt;&amp;lt;head&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;lt;script src=&quot;jquery-1.12.0.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;lt;/head&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;Tip:&lt;/b&gt;&amp;nbsp;Place the downloaded file in the same directory as the pages where you wish to use it.&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;팁 : 당신이 사용할 장소와 같은 디렉토리에 다운로드될 파일을 위치시켜라&lt;/p&gt;&lt;table class=&quot;lamp&quot; id=&quot;table1&quot; style=&quot;box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; width: 1298px; border: 1px solid rgb(221, 221, 221); margin: 16px 0px; color: rgb(0, 0, 0); font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;tbody style=&quot;box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;box-sizing: border-box;&quot;&gt;&lt;th style=&quot;box-sizing: content-box; border: none; padding: 10px; width: 34px;&quot;&gt;&lt;img src=&quot;http://www.w3schools.com/images/lamp.jpg&quot; alt=&quot;Note&quot; style=&quot;box-sizing: border-box; border: 0px; margin-bottom: -5px; height: 32px; width: 32px;&quot;&gt;&lt;/th&gt;&lt;td style=&quot;box-sizing: border-box; border: none;&quot;&gt;&lt;p&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;Do you wonder why we do not have type=&quot;text/javascript&quot; inside the &amp;lt;script&amp;gt; tag?&lt;br /&gt;&lt;/b&gt;&lt;b&gt;type=&quot;text/javascript&quot;속성을 &amp;lt;script&amp;gt;태그 내부에&amp;nbsp;&lt;/b&gt;&lt;b style=&quot;line-height: 1.5;&quot;&gt;왜&lt;/b&gt;&lt;b style=&quot;line-height: 1.5;&quot;&gt;가지고 있지 않은지 놀랍지 않은가?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;This is not required in HTML5. JavaScript is the default scripting language in HTML5 and in all modern browsers!&lt;/p&gt;&lt;p&gt;&lt;b&gt;이것은 HTML5에서 요구되지 않기 때문이다. 자바스크립트는 HTML5와&amp;nbsp;현대의 모든 브라우저들에서 기본스크립트 언어이다.&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;jQuery CDN&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;If you don't want to download and host jQuery yourself, you can include it from a CDN (Content Delivery Network).&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;Both Google and Microsoft host jQuery.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;만일 자체적으로 JQuery를 호스트하는 형태로&amp;nbsp;다운로드되기를 원하지 않는다면, 그것을 구글이나 마이크로소프트가 호스트하는 JQuery의 CDN으로 부터 포함시킬 수 있다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;To use jQuery from Google or Microsoft, use one of the following:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;구글이나 마이크로소프트로부터 JQuery를 이용하기위해 다음의 하나를 사용한다:&lt;/b&gt;&lt;/p&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Google CDN:&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;&amp;lt;head&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;lt;/head&amp;gt;&lt;/div&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_lib_google&quot; class=&quot;w3-btn w3-margin-bottom&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;w3-example&quot; style=&quot;box-sizing: border-box; padding: 0.01em 16px; margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px; box-shadow: rgba(0, 0, 0, 0.156863) 0px 2px 4px 0px, rgba(0, 0, 0, 0.117647) 0px 2px 10px 0px !important; background-color: rgb(241, 241, 241);&quot;&gt;&lt;h3 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 24px; font-weight: 400; margin: 10px 0px;&quot;&gt;Microsoft CDN:&lt;/h3&gt;&lt;div class=&quot;w3-code notranslate&quot; style=&quot;box-sizing: border-box; font-family: Consolas, 'courier new'; font-size: 16px; line-height: 1.4; width: auto; padding: 8px 12px; border-left-width: 4px !important; border-left-style: solid !important; border-left-color: rgb(76, 175, 80) !important; word-wrap: break-word; margin: 20px 0px; background-color: rgb(255, 255, 255);&quot;&gt;&amp;lt;head&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;lt;script src=&quot;http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.12.0.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&amp;lt;/head&amp;gt;&lt;/div&gt;&lt;a target=&quot;_blank&quot; href=&quot;http://www.w3schools.com/jquery/tryit.asp?filename=tryjquery_lib_microsoft&quot; class=&quot;w3-btn w3-margin-bottom&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(255, 255, 255); border: none; display: inline-block; outline: 0px; padding: 6px 16px; vertical-align: middle; overflow: hidden; text-align: center; cursor: pointer; white-space: nowrap; -webkit-user-select: none; transition: all 0.3s ease; box-shadow: rgba(0, 0, 0, 0.117647) 0px 1px 3px, rgba(0, 0, 0, 0.239216) 0px 1px 2px; margin-bottom: 16px !important; background-color: rgb(76, 175, 80);&quot;&gt;Try it yourself »&lt;/a&gt;&lt;/div&gt;&lt;table class=&quot;lamp&quot; style=&quot;box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; width: 1298px; border: 1px solid rgb(221, 221, 221); margin: 16px 0px; color: rgb(0, 0, 0); font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;tbody style=&quot;box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;box-sizing: border-box;&quot;&gt;&lt;th style=&quot;box-sizing: content-box; border: none; padding: 10px; width: 34px;&quot;&gt;&lt;img src=&quot;http://www.w3schools.com/images/lamp.jpg&quot; alt=&quot;Note&quot; style=&quot;box-sizing: border-box; border: 0px; margin-bottom: -5px; height: 32px; width: 32px;&quot;&gt;&lt;/th&gt;&lt;td style=&quot;box-sizing: border-box; border: none;&quot;&gt;&lt;p&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;One big advantage of using the hosted jQuery from Google or Microsoft:&lt;br /&gt;&lt;/b&gt;&lt;b&gt;구글 또는 마이크로소프트의 호스트를 이용하는것에 대한 하나의 큰 장점:&lt;/b&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;Many users already have downloaded jQuery from Google or Microsoft when visiting another site. As a result, it will be loaded from cache when they visit your site, which leads to faster loading time. Also, most CDN's will make sure that once a user requests a file from it, it will be served from the server closest to them, which also leads to faster loading time.&lt;br /&gt;많은 사용자들은 다른 하나의 사이트를 방문할때 구글이나 마이크로소프트로부터 다운로드된 JQuery를 이미 가지고 있게된다. 결과적으로, 그들이 당신의 사이트를 방문할때 그것은 캐시로부터 로드되고,&amp;nbsp;&lt;/p&gt;&lt;p&gt;이것은 로딩 시간을 빠르게한다. 또한, 대부분의 CDN들은 일단 유저들로부터 파일이 요청되면, 그들로부터 가장가까운 서버로 부터 그것을 제공할것이고, 이것은 로딩시간을 빠르게 하게된다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>JQuery</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/303</guid>
      <comments>https://eltgroup.tistory.com/303#entry303comment</comments>
      <pubDate>Fri, 11 Mar 2016 12:28:29 +0900</pubDate>
    </item>
    <item>
      <title>JQuery 소개</title>
      <link>https://eltgroup.tistory.com/302</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: 'Segoe UI', Arial, sans-serif; font-size: 36px; line-height: 1.5;&quot;&gt;JQuery&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;color_h1&quot; style=&quot;font-family: 'Segoe UI', Arial, sans-serif; font-size: 36px; line-height: 1.5; box-sizing: border-box;&quot;&gt;Introduction(JQuery소개)&lt;/span&gt;&lt;/p&gt;&lt;div class=&quot;chapter&quot; style=&quot;box-sizing: border-box; font-size: 20px; margin: 0px; padding: 0px; width: auto; overflow: hidden; font-family: Verdana, sans-serif; visibility: visible;&quot;&gt;&lt;div class=&quot;prev&quot; style=&quot;box-sizing: border-box; width: 519.344px; float: left; overflow: hidden; white-space: nowrap;&quot;&gt;&lt;a class=&quot;chapter&quot; href=&quot;http://www.w3schools.com/jquery/default.asp&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(61, 139, 64); visibility: visible; background-color: transparent;&quot;&gt;« Previous&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;next&quot; style=&quot;box-sizing: border-box; width: 623.203px; float: right; text-align: right; white-space: nowrap; overflow: hidden;&quot;&gt;&lt;a class=&quot;chapter&quot; href=&quot;http://www.w3schools.com/jquery/jquery_get_started.asp&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: rgb(61, 139, 64); visibility: visible; background-color: transparent;&quot;&gt;Next Chapter »&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;p class=&quot;intro&quot; style=&quot;box-sizing: border-box; font-size: 16px; font-family: Verdana, sans-serif;&quot;&gt;The purpose of jQuery is to make it much easier to use JavaScript on your website.&lt;/p&gt;&lt;p class=&quot;intro&quot; style=&quot;box-sizing: border-box; font-size: 16px; font-family: Verdana, sans-serif;&quot;&gt;&lt;span style=&quot;font-family: 돋움; font-size: 12px; line-height: 18px;&quot;&gt;&lt;b&gt;JQuery의 목적은 당신의 웹사이트에서 자바스크립트를 매우 쉽게 사용하도록 만드는것이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;What You Should Already Know(&lt;b style=&quot;font-family: 돋움; font-size: 12px; line-height: 1.5;&quot;&gt;당신은 먼저 어떤것들에 대해서 알아야 하는가?)&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;Before you start studying jQuery, you should have a basic knowledge of:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;span style=&quot;font-family: 돋움; font-size: 12px; line-height: 18px;&quot;&gt;&lt;b&gt;JQuery를 배우기전에, 당신은 다음에 대한 기본지식이 필요할것이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;HTML&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;CSS&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;JavaScript&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;-HTML&lt;/p&gt;&lt;p&gt;-CSS&lt;/p&gt;&lt;p&gt;-JavaScript&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;If you want to study these subjects first, find the tutorials on our&amp;nbsp;&lt;a href=&quot;http://www.w3schools.com/default.asp&quot; style=&quot;box-sizing: border-box; -webkit-tap-highlight-color: transparent; color: inherit; background-color: transparent;&quot;&gt;Home page&lt;/a&gt;.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;span style=&quot;font-family: 돋움; font-size: 12px; line-height: 18px;&quot;&gt;&lt;b&gt;만일 당신이 이 주제들을 먼저 배우기 원한다면 우리의 웹사이트에서 튜토리얼을찾을 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;What is jQuery?(&lt;b style=&quot;font-family: 돋움; font-size: 12px; line-height: 1.5;&quot;&gt;JQuery는 무엇인가?)&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;jQuery is a lightweight, &quot;write less, do more&quot;, JavaScript library.&lt;/p&gt;&lt;p&gt;&lt;b&gt;JQuery는 가볍고, &quot;적게 쓰고, 많은것을 하는&quot; 자바스크립트 라이브러리다.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The purpose of jQuery is to make it much easier to use JavaScript on your website.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Jqeury의 목적은 당신의 웹사이트에서 자비스크립트 사용을 쉽게 만드는 것이다.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;jQuery takes a lot of common tasks that require many lines of JavaScript code to accomplish, and wraps them into methods that you can call with a single line of code.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;JQuery는 구현을 위해 매우 많은 자바스크립트 코드 라인을 요구하는 공통적인 작업을 처리하며, 이러한 방법들을 단일라인의 코드호출로 수행할 수 있게 감싸고 있다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;jQuery also simplifies a lot of the complicated things from JavaScript, like AJAX calls and DOM manipulation.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;JQuery는 또한 ASAX나 DOM조작과 같이 자바스크립트에 매우 복잡하게 얽힌것들을 단순화 시킨다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;The jQuery library contains the following features:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;JQuery라이브러리는 다음의 기능들을 담고 있다:&lt;/b&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;HTML/DOM manipulation(&lt;b&gt;HTML/DOM 조작&lt;/b&gt;)&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;CSS manipulation(&lt;b&gt;CSS 조작&lt;/b&gt;)&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;HTML event methods(&lt;b&gt;HTML 이벤트 메소드들&lt;/b&gt;)&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;Effects and animations(&lt;b&gt;이팩트와 애니메이션들&lt;/b&gt;)&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;AJAX&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;Utilities(&lt;b&gt;유틸리티들&lt;/b&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;Tip:&lt;/b&gt;&amp;nbsp;In addition, jQuery has plugins for almost any task out there.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;추가적으로, JQuery는 그것 외에 임의의 작업을 위한 거의 모든 플러그인들을 가지고 있다.&lt;/b&gt;&lt;/p&gt;&lt;hr style=&quot;box-sizing: content-box; height: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-top-style: solid; border-top-color: rgb(238, 238, 238); margin: 20px 0px; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;h2 style=&quot;box-sizing: border-box; font-family: 'Segoe UI', Arial, sans-serif; font-size: 30px; font-weight: 400; margin: 10px 0px;&quot;&gt;Why jQuery?(&lt;b style=&quot;font-family: 돋움; font-size: 12px; line-height: 1.5;&quot;&gt;왜 JQuery인가?)&lt;/b&gt;&lt;/h2&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;There are lots of other JavaScript frameworks out there, but jQuery seems to be the most popular, and also the most extendable.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;세상에는 수많은 자바스크립트 프레임워크들이 있다, 그러나 JQuery는 가장 대중적이며, 가장 확장성있는것으로 보여진다.&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;Many of the biggest companies on the Web use jQuery, such as:&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;b&gt;다음과 같은 많은 거대 회사들이 웹사이트에서 JQuery를 사용하고 있다:&lt;/b&gt;&lt;/p&gt;&lt;ul style=&quot;box-sizing: border-box; font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;Google&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;Microsoft&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;IBM&lt;/li&gt;&lt;li style=&quot;box-sizing: border-box;&quot;&gt;Netflix&lt;/li&gt;&lt;/ul&gt;&lt;table class=&quot;lamp&quot; id=&quot;table1&quot; style=&quot;box-sizing: border-box; border-collapse: collapse; border-spacing: 0px; width: 1298px; border: 1px solid rgb(221, 221, 221); margin: 16px 0px; color: rgb(0, 0, 0); font-family: Verdana, sans-serif; font-size: 15px; line-height: 22.5px;&quot;&gt;&lt;tbody style=&quot;box-sizing: border-box;&quot;&gt;&lt;tr style=&quot;box-sizing: border-box;&quot;&gt;&lt;th style=&quot;box-sizing: content-box; border: none; padding: 10px; width: 34px;&quot;&gt;&lt;img src=&quot;http://www.w3schools.com/images/lamp.jpg&quot; alt=&quot;Note&quot; style=&quot;box-sizing: border-box; border: 0px; margin-bottom: -5px; height: 32px; width: 32px;&quot;&gt;&lt;/th&gt;&lt;td style=&quot;box-sizing: border-box; border: none;&quot;&gt;&lt;p&gt;&lt;b style=&quot;box-sizing: border-box;&quot;&gt;Will jQuery work in all browsers?(JQuery는 모든 브러우저들에서 작동하는가?)&lt;br style=&quot;box-sizing: border-box;&quot;&gt;&lt;/b&gt;&lt;br style=&quot;box-sizing: border-box;&quot;&gt;The jQuery team knows all about cross-browser issues, and they have written this knowledge into the jQuery library. jQuery will run exactly the same in all major browsers, including Internet Explorer 6!&lt;br /&gt;&lt;b&gt;JQuery팀은 크로스 브라우저 이슈들에 대한 모든것들을 알 고 있고, 이러한 지식들은 JQuery라이브러리에 쓰여졌다. JQuery는 인터넷 익스플러러 6를 포함하여 모든 메이저 브라우저들에서 완벽히 동일하게 실행될것이다!&lt;/b&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>JQuery</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/302</guid>
      <comments>https://eltgroup.tistory.com/302#entry302comment</comments>
      <pubDate>Fri, 11 Mar 2016 12:06:19 +0900</pubDate>
    </item>
    <item>
      <title>골드 스푼 메이커 게임 소개</title>
      <link>https://eltgroup.tistory.com/301</link>
      <description>&lt;p&gt;모바일 게임 골드스푼메이커입니다.&lt;/p&gt;
&lt;p&gt;유니티5 버전으로 제작했으며, 현재도 서비스중입니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;원래 구글, 애플, 네이버등에도 서비스 했지만 현재는 앱스토어, 원스토어에만 출시된상태입니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;서버없는 게임이며, 쿠폰사용 기능과 관련해서 JSP기반 웹서버를 이용중입니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;전체 프로그램 파트를 맡았습니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;아래는 WEBGL버전으로 컨버팅한것입니다.&lt;/p&gt;

&lt;div&gt;아무것도 표시되지 않는다면 브라우저에 의해서&amp;nbsp; 클라이언트가 차단된경우일 수 있습니다.&lt;/div&gt;&lt;div&gt;안전하지 않은 스크립트소스 로드 허용하시면 플레이 가능합니다.&lt;/div&gt;&lt;iframe width=&quot;700&quot; height=&quot;650&quot; src=&quot;https://choi98772.github.io/Games/GoldSpoon/&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;a href=&quot;https://itunes.apple.com/us/app/goldeu-seupun-meikeo-geumsujeomandeulgi/id1065319408?l=ko&amp;amp;ls=1&amp;amp;mt=8&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;애플 스토어에서 다운로드&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;a href=&quot;https://www.onestore.co.kr/userpoc/game/view?pid=0000706367&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;원스토어에서 다운로드&lt;/a&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://imgur.com/5wDL7Pu&quot;&gt;&lt;img src=&quot;http://i.imgur.com/5wDL7Pu.png&quot; title=&quot;source: imgur.com&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://imgur.com/dQNDX3p&quot;&gt;&lt;img src=&quot;http://i.imgur.com/dQNDX3p.png&quot; title=&quot;source: imgur.com&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://imgur.com/GQASwbw&quot;&gt;&lt;img src=&quot;http://i.imgur.com/GQASwbw.png&quot; title=&quot;source: imgur.com&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://imgur.com/73jQU72&quot;&gt;&lt;img src=&quot;http://i.imgur.com/73jQU72.png&quot; title=&quot;source: imgur.com&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://imgur.com/98vB2wR&quot;&gt;&lt;img src=&quot;http://i.imgur.com/98vB2wR.png&quot; title=&quot;source: imgur.com&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>포트폴리오</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/301</guid>
      <comments>https://eltgroup.tistory.com/301#entry301comment</comments>
      <pubDate>Thu, 7 Jan 2016 23:20:42 +0900</pubDate>
    </item>
    <item>
      <title>밸런싱로봇 종합사항</title>
      <link>https://eltgroup.tistory.com/300</link>
      <description>&lt;p&gt;일단 아래 소스를 다운로드 해주세요. 라이브러리 없이 밸런싱 로봇 소스만 포함한 소스입니다. pid쪽으로 약간의 수정이 된 버전입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block;   height: auto; max-width: 100%;&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/24418146567776012A&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://i1.daumcdn.net/cfs.tistory/v/0/blog/image/extension/zip.gif&quot; style=&quot;vertical-align: middle;&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;아두이노스케치용소스.zip&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;가장처음으로 모터드라이버와 아두이노의 회로배선상태되도 소스를 수정합니다.&lt;/p&gt;&lt;p&gt;아래 사진에 보이는 부분입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 752px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/243F1733567774BD04&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F243F1733567774BD04&quot; width=&quot;752&quot; height=&quot;362&quot; filename=&quot;1.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;두번째는 센서와 차체의 방향에 따라서 각도를 읽어 오는 부분을 수정합니다. 바퀴축과 나란한 축이 X축이면 아래와 같이&amp;nbsp;m_Gyro.GetKalAngleX()를통해서 x축 각도를 읽도록하고 Y축이라면&amp;nbsp;m_Gyro.GetKalAngleY()를 통해서 Y축각도를 읽도록 합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 651px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/217BE338567775140C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F217BE338567775140C&quot; width=&quot;651&quot; height=&quot;540&quot; filename=&quot;밸런싱로봇센서3.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;소스를 업로드 하고 밸런싱로봇 작동상태를 확인합니다.&lt;/p&gt;&lt;p&gt;만일 바퀴가 움직이지 않으면, 아두이노와 모터드라이버의 핀연결 상태가 소스에서 설정한 핀과 일치하는지 확인합니다.&lt;/p&gt;&lt;p&gt;배선상태와 핀설정이 일치한다면, 테스터기 같은것으로 모터드라이버의 출력측을 측정해서 출력이 있는지 확인합니다. 출력이 있고, 차체의 기울어짐에 따라서 출력전압 극성에 변동이 있다면 일단 소스와 회로 구성은 올바르지만, 모터를 구동시킬만큼 출력전류가 충분하지 않아서 그러것입니다.&lt;/p&gt;&lt;p&gt;이때는 아래소스에 보이는 것처럼 PID_SCALE을 높여 보시기 바랍니다. &lt;b&gt;모터가 움직일때까지 해당값을 조금씩 높여가면서 테스트 해봅니다.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;저부분은 원래 소스에는 없던 부분입니다. 새로 추가한 부분인데,&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 661px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2211803D567776F431&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2211803D567776F431&quot; width=&quot;661&quot; height=&quot;367&quot; filename=&quot;8.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;소스상에도 설명되어 있지만, 제공된 소스는 제가 만든 밸런싱 로봇에 맞게 PID설정이 되어 있습니다. 밸런싱로봇의 무게나, 무게중심, 모터특성등에 따라서 적절한 PID값을 조정해야 합니다. 최적의 PID값을 찾아내지 못하면 밸런싱 로봇의 중심잡기는 실패 하게 됩니다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;PID_SCALE조정으로 바퀴가 움직이고, 기울어짐에 따라 회전 방향이 정상적으로 바뀐다면 30%정도는 성공한것입니다.&lt;/p&gt;&lt;p&gt;만일 기울어진 방향과 반대 방향으로 모터가 움직인다면 반대로 움직이는 쪽 부분만 &lt;a href=&quot;http://eltgroup.tistory.com/299&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://eltgroup.tistory.com/299&lt;/a&gt; 글을 참고해서 코드를 수정합니다&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제남은 일은 최적의 PID값을 찾는 일입니다. 밸런싱로봇을만들때 가장 힘든부분입니다. 운이좋아 PID_SCALE값 조정만으로 밸런스가 유지된다면 따로 PID값 조정할 필요는 없습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 675px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2750283356777B1C17&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2750283356777B1C17&quot; width=&quot;675&quot; height=&quot;238&quot; filename=&quot;9.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위소스에 보이는것처럼, PID_KP, PID_KI, PID_KD 값을 자신의 차체에 맞는 값으로 찾아서 수정해야 합니다.&lt;/p&gt;&lt;p&gt;동역학이론을 동원해서 실험과 특성을 추출해서 계산해내지 않는이상은, 3가지 값을 조금씩 바꿔가면서 차체가 밸런스를 잡을때까지 무한 수정 노가다를 할 수 밖에 없습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/300</guid>
      <comments>https://eltgroup.tistory.com/300#entry300comment</comments>
      <pubDate>Mon, 21 Dec 2015 13:11:13 +0900</pubDate>
    </item>
    <item>
      <title>밸런싱로놋 mpu6050 센서방향</title>
      <link>https://eltgroup.tistory.com/299</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 900px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2204664C5675507C17&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2204664C5675507C17&quot; width=&quot;900&quot; height=&quot;574&quot; filename=&quot;밸런싱로봇센서.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위사진에 보이는것처럼 센서의 y축이 차체의 바퀴와 나란히 배치되어 있습니다.&lt;/p&gt;&lt;p&gt;센서의 Y각도를 추출해서 밸런싱에 이용하고 있습니다.&lt;/p&gt;&lt;p&gt;아래는 올리신 사진인데, 사진이 흐려 자세히 보이지는 않지만 센서의 x축이 바퀴축과 나란한것 같습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 509px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/220F3C4A5675508F0D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F220F3C4A5675508F0D&quot; width=&quot;509&quot; height=&quot;603&quot; filename=&quot;밸런싱로봇센서2.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;위사진에 보면 mpu6050의 int핀에 선이 연결되어 있는것 같습니다. 해당 핀에 LOW, HIGH신호를 가하는것에 따라서 mpu6050 i2c통신 주소가 달라집니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;일단 소스코드상에서는 해당 핀에 아무것도 연결하지 않은 상태의 주소로 설정되어 있으니, 해당 핀에 연결된 선은 빼주시기 바랍니다.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;그리고 소스코드상에서는y축의 각도 변화를 추출하는데, 위의 차체에서는 차체가 기울더라도 x축을 중심으로&amp;nbsp;기울기에 변화가 있기 때문에, 올바르지 않게 작동하게 될겁니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;두가지 방법이 있는데, 한가지는 첫번째사진과 같이 축을 일치 시켜주는 방법이고, 다른 방법은 소스코드상에서&lt;/p&gt;&lt;p&gt;Y축 기울기를 측정하는 부분을 x축 기울기 측정으로 바꾸는 겁니다. 두번째가 더간단할거 같네요.&lt;/p&gt;&lt;p&gt;기울기를 측정하는 부분은 소스코드상에서 아래부분과 같습니다.&amp;nbsp;&lt;/p&gt;&lt;p&gt;CSelfBlancer.h 파일의 내부에 보시면 Update() 함수가 있습니다.&lt;/p&gt;&lt;p&gt;붉은원으로 표시해놓은 부분에 보시면 원래는 저부분이&lt;/p&gt;&lt;p&gt;m_Gyro.GetKalAngleY() 라고 되어 있습니다. 이것을 아래 그림에 나온것처럼&amp;nbsp;&lt;span style=&quot;line-height: 1.5;&quot;&gt;m_Gyro.GetKalAngleX()라고 바꿔주시면됩니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 651px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/251F45495675526E2E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F251F45495675526E2E&quot; width=&quot;651&quot; height=&quot;540&quot; filename=&quot;밸런싱로봇센서3.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;위와같이 수정하시고, 업로드 하신다음에 정상적이라면 바퀴축을 기준으로 차체를 기울일경우 기울인방향으로 모터가 회전해야 합니다.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;만일 기울인 반대 방향으로 모터가 회전한다면, 정방향/역방향이 바뀐경우이니&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;그때는 단순하게 모터드라이버에 연결된 선을 서로 바꿔서 연결하거나 아니면 아래와 같이 소스코드 부분을 수정하시면됩니다.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;역시 같은 소스인&amp;nbsp;&lt;span style=&quot;line-height: 1.5;&quot;&gt;CSelfBlancer.h 파일을 열어서&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&lt;b&gt;아래 사진에 표시 해놓은 부분을 수정하시면 되는데&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;g_Motor.Backward 부분과&amp;nbsp;g_Motor.Forward 부분을 서로 바꿔주시면 됩니다.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;그러니까 아래 그림의 UpdateLeft함수와 UpdateRight함수 내부에 보시면&amp;nbsp;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;g_Motor.Backward 부분과&amp;nbsp;g_Motor.Forward가 있는데&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;g_Motor.Backward(true, (uint8_t)(-fControl)); 를&amp;nbsp;&lt;/b&gt;&lt;b style=&quot;line-height: 1.5;&quot;&gt;g_Motor.&lt;/b&gt;&lt;b&gt;Forward&lt;/b&gt;&lt;b style=&quot;line-height: 1.5;&quot;&gt;(true, (uint8_t)(-fControl)); 로바꾸고&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;g_Motor.Forward(true, (uint8_t)fControl);&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt;	&lt;/span&gt;는&amp;nbsp;&lt;/b&gt;&lt;b style=&quot;line-height: 1.5;&quot;&gt;g_Motor.&lt;/b&gt;&lt;b&gt;Backward&lt;/b&gt;&lt;b style=&quot;line-height: 1.5;&quot;&gt;(true, (uint8_t)fControl); 처럼&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;b style=&quot;line-height: 1.5;&quot;&gt;Backward와 Forward를 서로 바꾸면 됩니다.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 677px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/256EAE425675B8EC0E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F256EAE425675B8EC0E&quot; width=&quot;677&quot; height=&quot;661&quot; filename=&quot;밸런싱로봇센서6.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 654px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/275C43425675B8ED16&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F275C43425675B8ED16&quot; width=&quot;654&quot; height=&quot;785&quot; filename=&quot;밸런싱로봇센서7.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/299</guid>
      <comments>https://eltgroup.tistory.com/299#entry299comment</comments>
      <pubDate>Sat, 19 Dec 2015 21:58:16 +0900</pubDate>
    </item>
    <item>
      <title>밸런싱로봇 전력공급</title>
      <link>https://eltgroup.tistory.com/298</link>
      <description>&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 900px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2361F842566AB86E0E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2361F842566AB86E0E&quot; width=&quot;900&quot; height=&quot;506&quot; filename=&quot;20151211_204607.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;위에 사진을 보시는 것처럼 2종의 배터리 전원공급부가 보입니다. 9V충전지는 아두이노 자체에 전력을 공급하기 위한 용도입니다. 충전건전지는 모터드라이버에 전원을 공급하기 위한 용도입니다. 9V전지와 건전지 4개는 Gnd를 공유하고 있습니다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;각 모터마다 필요로 하는 전류 및 전압의 크기가 있습니다. 모터의 정격전류 및 전압인데 충분히 공급되지 못하면 모터는 움직이지 않게 될겁니다.&lt;/p&gt;&lt;p&gt;보여주신 연결상으로 별다른 문제는 보이지 않는듯합니다. 제공한 소스또한 제가 직접 테스트를 해서 문제가 없다는 것을 확인했기 때문에 핀연결이 올바르게 되었다면 모터가 작동해야 하는게 정상입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;자세한 내용은 모르겠지만 9V건전지 만으로 전원을 공급하시는경우라면 전력부족으로 모터가 가동되지 않을 수 있습니다. 모터가 움직이기에 충분한 전력을 공급하셔야 합니다. 참고로 일반 알카라인 건전지의 경우 공급가능한 전류의 양이 너무적기 때문에 사용하시는 모터를 구동하기에 부족할 가능성이 높습니다.&lt;/p&gt;&lt;p&gt;충전지 계열을 이용하시는게 좋을겁니다.&lt;/p&gt;&lt;p&gt;아래는 소스를 업로드 했을때 밸런싱 로봇의 상태입니다.&lt;/p&gt;&lt;p&gt;보시는 것처럼 바로 작동이 되야 합니다. (댓글에도 달았지만, 기존에 제가 작성해둔 소스에서 LED컨트롤을 위해서 두개의 핀 9, 10번을 사용하고 있었습니다. 만드신 밸런스 로봇이 사용하는것과 중복되게핀을 사용중이라 제대로 작동이 안될 수 있을것 같은데, 일단 LED제어하는 부분을 비활성화한 소스를 업로드 해놨습니다. 해당 소스를 사용하시면될것 같습니다.)&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/iQD9YrzPEWg&quot; width=&quot;840&quot; height=&quot;630&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>아두이노작품</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/298</guid>
      <comments>https://eltgroup.tistory.com/298#entry298comment</comments>
      <pubDate>Fri, 11 Dec 2015 20:55:10 +0900</pubDate>
    </item>
    <item>
      <title>밸런싱 로봇 소스 사용법</title>
      <link>https://eltgroup.tistory.com/297</link>
      <description>&lt;p&gt;일단 여기에서 소스를 다운로드 합니다.&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;a href=&quot;https://github.com/choi98772/balancer&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;소스다운로드&lt;/a&gt;(Git)&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;압축을 푸시면 아래와 같은 내용물들이 보일겁니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 622px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/263F874A5665706D12&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F263F874A5665706D12&quot; width=&quot;622&quot; height=&quot;286&quot; filename=&quot;1.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Libraries폴더에는 아두이노용 라이브러리들이 들어 있습니다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;비주얼스튜디오용소스에는 비주얼스튜디어용 밸런싱 로봇소스가 있습니다.&lt;/p&gt;&lt;p&gt;아두이노스케치용소스에는 순수 아두이노 스케치용 소스가 들어 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;일단 Libraries폴더를 보면 아래와 같은 내용물들이 보입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 626px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/264E494A566570DC06&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F264E494A566570DC06&quot; width=&quot;626&quot; height=&quot;175&quot; filename=&quot;2.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;폴더가 몇개 보이는데요, 3개의 폴더들을 아두이노스케치 프로그램의 라이브러리 폴더에 복사해 넣어야 합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아두이노 아이콘에서 오른버튼 클릭하시고 속성에 들어가시면 아두이노 스케치 설치위치로 이동할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 778px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2620A048566577AB0A&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2620A048566577AB0A&quot; width=&quot;778&quot; height=&quot;796&quot; filename=&quot;7.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;폴더내용물을 보시면 아래에 보이는것처럼 libraries폴더가 보일겁니다. 저기 안에 밸런싱로봇 소스의&amp;nbsp;Libraries폴더안에 있던 3개 폴더를 복사해 넣으면 됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 655px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2204C4495665719B0B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2204C4495665719B0B&quot; width=&quot;655&quot; height=&quot;408&quot; filename=&quot;3.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래 그림처럼 3개의 폴더를 복사해 넣습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 668px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2503EB4D566571AB10&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2503EB4D566571AB10&quot; width=&quot;668&quot; height=&quot;681&quot; filename=&quot;4.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이제 라이브러리 설치는 끝났습니다. 아두이노 스케치 프로그램을 실행중이라면 일단 종료를 해주세요.&lt;/p&gt;&lt;p&gt;밸런싱 로봇 소스로 다시 돌아와서 아두이노용 소스 폴더로 들어가보면&lt;/p&gt;&lt;p&gt;아래와 같은 파일들이 보일겁니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 626px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/26410A4F5665724B29&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F26410A4F5665724B29&quot; width=&quot;626&quot; height=&quot;243&quot; filename=&quot;5.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;저기위에 표시해놓은 Blancer.ino파일을 아두이노 스케치 프로그램으로 열어주시면 됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;소스를 보시면 다음과 같은 부분이 있을겁니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 900px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/27594749566572E835&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F27594749566572E835&quot; width=&quot;900&quot; height=&quot;653&quot; filename=&quot;6.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;CDCMotorDriver는 모터드라이버를 제어하기위해 만든클래스 입니다. 생성자의 인자로 핀번호를 받고 있는데요&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;입력인자순서되로&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;모터1핀1, 모터1핀2, 모터2핀1, 모터2핀2, 모터1PWM핀, 모터2PWM핀&lt;br /&gt;&lt;/p&gt;&lt;p&gt;입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;이6개의 핀번호를 구성하신 회로와 맞게 수정하신다음에 아두이노에 업로드 하시고 사용하시면됩니다.&lt;/p&gt;&lt;p&gt;소스에 첨부된 설명.xlxs파일에보시면 간략한 설명이 포함되어 있습니다.&lt;/p&gt;&lt;p&gt;읽어 보시면될것 같습니다.&lt;/p&gt;</description>
      <category>아두이노작품</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/297</guid>
      <comments>https://eltgroup.tistory.com/297#entry297comment</comments>
      <pubDate>Mon, 7 Dec 2015 20:54:44 +0900</pubDate>
    </item>
    <item>
      <title>툼레이더 애니버서리 플레이 영상 41 ~ 45</title>
      <link>https://eltgroup.tistory.com/296</link>
      <description>&lt;p&gt;툼레이더 애니버서리 플레이 영상 41&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 42&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 43&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 44&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 45&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>툼레이더 애니버서리(Tomb Raider Anniversary)</category>
      <category>tomb raider</category>
      <category>툼레이더</category>
      <category>툼레이더: 애니버서리</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/296</guid>
      <comments>https://eltgroup.tistory.com/296#entry296comment</comments>
      <pubDate>Mon, 16 Nov 2015 04:16:31 +0900</pubDate>
    </item>
    <item>
      <title>툼레이더 애니버서리 플레이 영상 31 ~ 40</title>
      <link>https://eltgroup.tistory.com/295</link>
      <description>&lt;p&gt;툼레이더 애니버서리 플레이 영상 31&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 32&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 33&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 34&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 35&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 36&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 37&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 38&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 39&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 40&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>툼레이더 애니버서리(Tomb Raider Anniversary)</category>
      <category>tomb raider</category>
      <category>툼레이더</category>
      <category>툼레이더; 애니버서리</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/295</guid>
      <comments>https://eltgroup.tistory.com/295#entry295comment</comments>
      <pubDate>Mon, 16 Nov 2015 04:07:38 +0900</pubDate>
    </item>
    <item>
      <title>툼레이더 애니버서리 플레이 영상 21 ~ 30</title>
      <link>https://eltgroup.tistory.com/294</link>
      <description>&lt;p&gt;툼레이더 애니버서리 플레이 영상 21&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 22&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 23&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 24&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 25&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 26&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 27&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 28&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 29&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 30&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>툼레이더 애니버서리(Tomb Raider Anniversary)</category>
      <category>tomb raider</category>
      <category>툼레이더</category>
      <category>툼레이더: 애니버서리</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/294</guid>
      <comments>https://eltgroup.tistory.com/294#entry294comment</comments>
      <pubDate>Mon, 16 Nov 2015 03:51:15 +0900</pubDate>
    </item>
    <item>
      <title>툼레이더 애니버서리 플레이 영상 11 ~ 20</title>
      <link>https://eltgroup.tistory.com/293</link>
      <description>&lt;p&gt;툼레이더 애니버서리 플레이 영상 11&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 12&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 13&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 14&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 15&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 16&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 17&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 18&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 19&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 20&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>툼레이더 애니버서리(Tomb Raider Anniversary)</category>
      <category>tomb</category>
      <category>tomb raider</category>
      <category>툼레이더</category>
      <category>툼레이더: 애니버서리</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/293</guid>
      <comments>https://eltgroup.tistory.com/293#entry293comment</comments>
      <pubDate>Mon, 16 Nov 2015 03:33:26 +0900</pubDate>
    </item>
    <item>
      <title>툼레이더 애니버서리 플레이 영상 1 ~ 10</title>
      <link>https://eltgroup.tistory.com/292</link>
      <description>&lt;p&gt;툼레이더 애니버서리 플레이 영상 1&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 2&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 3&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 4&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 5&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 6&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 7&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 8&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 9&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 애니버서리 플레이 영상 10&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>툼레이더 애니버서리(Tomb Raider Anniversary)</category>
      <category>tomb</category>
      <category>tomb raider</category>
      <category>툼레이더</category>
      <category>툼레이더 애니버서리</category>
      <category>툼레이더: 애니버서리</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/292</guid>
      <comments>https://eltgroup.tistory.com/292#entry292comment</comments>
      <pubDate>Mon, 16 Nov 2015 03:17:30 +0900</pubDate>
    </item>
    <item>
      <title>툼레이더 언더월드 플레이 영상 31 ~ 40</title>
      <link>https://eltgroup.tistory.com/291</link>
      <description>&lt;p&gt;툼레이더 언더월드 플레이 영상 31&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 32&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 33&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 34&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 35&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 36&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 37&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 38&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 39&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 40&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>툼레이더 언더월드(Tomb Raider Under World)</category>
      <category>tomb raider</category>
      <category>tomb raider underworld</category>
      <category>툼레이더</category>
      <category>툼레이더 언더월드</category>
      <category>툼레이더: 언더월드</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/291</guid>
      <comments>https://eltgroup.tistory.com/291#entry291comment</comments>
      <pubDate>Mon, 16 Nov 2015 03:07:52 +0900</pubDate>
    </item>
    <item>
      <title>툼레이더 언더월드 플레이 영상 21 ~ 30</title>
      <link>https://eltgroup.tistory.com/290</link>
      <description>&lt;p&gt;툼레이더 언더월드 플레이 영상 21&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 22&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 23&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 24&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 25&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 26&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 27&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 28&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 29&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 30&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>툼레이더 언더월드(Tomb Raider Under World)</category>
      <category>tomb raider</category>
      <category>tomb raider underworld</category>
      <category>툼레이더</category>
      <category>툼레이더 : 언더월드</category>
      <category>툼레이더 언더월드</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/290</guid>
      <comments>https://eltgroup.tistory.com/290#entry290comment</comments>
      <pubDate>Mon, 16 Nov 2015 02:52:08 +0900</pubDate>
    </item>
    <item>
      <title>툼레이더 언더월드 플레이 영상 11 ~ 20</title>
      <link>https://eltgroup.tistory.com/289</link>
      <description>&lt;p&gt;툼레이더 언더월드 플레이 영상 11&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 12&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 13&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 14&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 15&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 16&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 17&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 18&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 19&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;툼레이더 언더월드 플레이 영상 20&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>툼레이더 언더월드(Tomb Raider Under World)</category>
      <category>tomb raider</category>
      <category>tomb raider under world</category>
      <category>툼레이더</category>
      <category>툼레이더 : 언더월드</category>
      <category>툼레이더 언더월드</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/289</guid>
      <comments>https://eltgroup.tistory.com/289#entry289comment</comments>
      <pubDate>Mon, 16 Nov 2015 02:32:07 +0900</pubDate>
    </item>
    <item>
      <title>툼레이더 언더월드 플레이 영상 1 ~ 10</title>
      <link>https://eltgroup.tistory.com/288</link>
      <description>&lt;p&gt;툼레이더 언더월드 플레이 영상1&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;툼레이더 언더월드 플레이 영상&lt;/span&gt;&amp;nbsp;2&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;툼레이더 언더월드 플레이 영상&lt;/span&gt;&amp;nbsp;3&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;툼레이더 언더월드 플레이 영상&lt;/span&gt;4&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;툼레이더 언더월드 플레이 영상&lt;/span&gt;5&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;툼레이더 언더월드 플레이 영상&lt;/span&gt;6&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;툼레이더 언더월드 플레이 영상&lt;/span&gt;7&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;툼레이더 언더월드 플레이 영상&lt;/span&gt;8&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;툼레이더 언더월드 플레이 영상&lt;/span&gt;9&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;툼레이더 언더월드 플레이 영상&lt;/span&gt;10&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>툼레이더 언더월드(Tomb Raider Under World)</category>
      <category>tomb</category>
      <category>tomb raider</category>
      <category>tomb raider under world</category>
      <category>언더월드</category>
      <category>툼레이더</category>
      <category>툼레이더 언더월드</category>
      <category>툼레이더: 언더월드</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/288</guid>
      <comments>https://eltgroup.tistory.com/288#entry288comment</comments>
      <pubDate>Mon, 16 Nov 2015 01:53:08 +0900</pubDate>
    </item>
    <item>
      <title>툼레이더 레전드 플레이영상</title>
      <link>https://eltgroup.tistory.com/287</link>
      <description>&lt;p&gt;플레이1&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이2&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이3&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이4&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이5&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이6&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이7&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이8&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이9&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이10&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이11&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이12&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이13&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이14&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이15&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이16&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이17&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이18&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이19&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이20&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이21&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;플레이22&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;figure class=&quot;unsupported component-kakaotv&quot; contenteditable=&quot;false&quot; style=&quot;background:#000;margin:16px 0;min-height:72px;padding:10px 16px;display:flex;align-items:center;justify-content:center;text-align:center;box-sizing:border-box;width:100%;max-width:100%;&quot;&gt;
    &lt;p contenteditable=&quot;false&quot; style=&quot;margin:0;color:#8a8a8a;font-size:13px;line-height:1.6;user-select:none;pointer-events:none;&quot;&gt;동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.&lt;/p&gt;
&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>툼레이더 레전드(Tomb Raider Legend)</category>
      <category>tomb raider</category>
      <category>tomb raider legend</category>
      <category>레전드</category>
      <category>툼레이더</category>
      <category>툼레이더 레전드</category>
      <category>툼레이더: 레전드</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/287</guid>
      <comments>https://eltgroup.tistory.com/287#entry287comment</comments>
      <pubDate>Sun, 15 Nov 2015 15:54:05 +0900</pubDate>
    </item>
    <item>
      <title>파일질라 FTP 서버구축하기</title>
      <link>https://eltgroup.tistory.com/286</link>
      <description>&lt;p&gt;업무상 FTP서버를 자주 사용합니다.&lt;/p&gt;&lt;p&gt;몇개의 FTP서버를 이용해 봤지만 파일질라서버가 가장 단순하고 파워풀한것 같습니다.&lt;/p&gt;&lt;p&gt;아래는 파일질라 FTP서버를 구축하는 방법에 대해서 설명해봤습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;먼저 FTP서버 설치 파일을 다운로드 받습니다.&lt;/p&gt;&lt;p&gt;공식적인 경로를 통해서 받으셔도 되지만 버전이 다를 수 있어 설명에 차이가 있을 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;파일질라설치파일&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block;   height: auto; max-width: 100%;&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/23624F3A5641055530&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://i1.daumcdn.net/cfs.tistory/v/0/blog/image/extension/zip.gif&quot; style=&quot;vertical-align: middle;&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;파일질라서버.zip&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다운로드 받은 파일을 적당한 곳에 압축을 풉니다. 내용물을 보시면 아래와 같습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 612px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2229B4365641062C2E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2229B4365641062C2E&quot; width=&quot;612&quot; height=&quot;76&quot; filename=&quot;1.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;FileZilla_Server-0_9_41.exe 가 서버 설치파일입니다. 위에 있는 FileZilla_server.exe는 서버 실행파일인데 유니코드 관련 패치가 되어 있는 버전입니다. 나중에 FTP서버에서 한글을 지원하기 위해서 필요합니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;일단 설치 파일을 설치 합니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;설치 과정은 그냥 Next를 주구장창 해주시면 됩니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;서버 설치가 완료되었다면 FTP서비스가 자동으로 시작되게 됩니다. 유니코드 패치된 버전으로 교체하기 위해서 서비스를 멈추어야 합니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;아래 그림에 보여지는 것처럼 프로그램 그룹으로 가서 Stop FileZilla Server를 통해서 서버를 멈출 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 219px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/232B76365641062E2D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F232B76365641062E2D&quot; width=&quot;219&quot; height=&quot;188&quot; filename=&quot;2.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;만일 저방법으로 서버가 멈춰지지 않으면 직접 서비스항목에서 멈출 수 있습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 662px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/21298A36564106302E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F21298A36564106302E&quot; width=&quot;662&quot; height=&quot;595&quot; filename=&quot;3.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;이제 파일질라서버가 설치된 폴더로 가서 아까 위에 압축풀었던&amp;nbsp;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;b&gt;FileZilla_server.exe&lt;/b&gt; 파일을 덮어쓰기 해줍니다.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;그런다음 다시 파일질라 서버를 재가동 합니다. 파일그룹에서 &lt;b&gt;Start Filezilla Server&lt;/b&gt;로&amp;nbsp;재가동하시거나 아래 그림처럼 서비스에서 직접 가동할 수 있습니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 662px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2529A2365641063230&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2529A2365641063230&quot; width=&quot;662&quot; height=&quot;263&quot; filename=&quot;4.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;윈도우 트레이 영역에 보시면 아래 그림에 표시해놓은것처럼 서버 인터페이스 아이콘이 보입니다. 더블 클릭해서 파일질라 서버 인터페이스를 오픈 합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 616px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/242A2236564106332D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F242A2236564106332D&quot; width=&quot;616&quot; height=&quot;49&quot; filename=&quot;5.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;파일질라 서버 인터페이스의 모습입니다.&lt;/p&gt;&lt;p&gt;매우 단촐한 구성이네요.&lt;/p&gt;&lt;p&gt;FTP클라이언트가 서버에 접속하기 위해서 계정이 필요합니다.&lt;/p&gt;&lt;p&gt;계정등록을 해보겠습니다.&lt;/p&gt;&lt;p&gt;아래 그림에 표시해놓은 사람모양 아이콘을 눌러줍니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 900px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2229C8365641063530&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2229C8365641063530&quot; width=&quot;900&quot; height=&quot;475&quot; filename=&quot;6.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;그럼 아래 그림처럼 UI가 오픈되는데요.&lt;/p&gt;&lt;p&gt;오른쪽에 보시면 Users라고 등록된 계정의 목록이 나옵니다.&lt;/p&gt;&lt;p&gt;아래에 Add버튼을 눌러서 새로운 계정을 추가 할 수 있습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 649px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2729AE36564106372E&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2729AE36564106372E&quot; width=&quot;649&quot; height=&quot;434&quot; filename=&quot;7.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Add버튼을 누르면 아래 그림처림 계정등록창이 나오는데 입력영역에 ID를 입력하시고 OK를 눌러줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 288px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/22219B37564106382C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F22219B37564106382C&quot; width=&quot;288&quot; height=&quot;203&quot; filename=&quot;8.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;계정이 추가 되었습니다. Users목록에 새로 추가된 계정(test)가 보이네요.&lt;/p&gt;&lt;p&gt;test를 선택하시고 왼쪽의 General항목을 눌러 줍니다.&lt;/p&gt;&lt;p&gt;몇개의 체크박스와 입력박스가 있는데&lt;/p&gt;&lt;p&gt;계정에 비번을 적용하실거면 Password항목에 체크를 해주시고 바로 오른편의 입력박스에 비번을 입력해줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 647px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2121AF37564106392C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2121AF37564106392C&quot; width=&quot;647&quot; height=&quot;435&quot; filename=&quot;9.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;다음으로 해당 FTP계정이 사용할 폴더를 지정해줘야 합니다.&lt;/p&gt;&lt;p&gt;왼쪽 Page영역의 &amp;nbsp;Shared folders 를 눌러 보시면 아래 그림과 같은 모습을 볼 수 있습니다.&lt;/p&gt;&lt;p&gt;그림에 표시해놓은 Add버튼을 눌러서 공유 폴더를 추가 할 수 있습니다.&lt;/p&gt;&lt;p&gt;사용하실 폴더를 선택하고 확인을 해주세요.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 900px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/25218C375641063B2C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F25218C375641063B2C&quot; width=&quot;900&quot; height=&quot;385&quot; filename=&quot;10.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;선택한 폴더가 추가된 것을 볼 수 있습니다.&lt;/p&gt;&lt;p&gt;표시해놓은 files영역을 보시면 여러개의 체크 박스가 있는걸 볼 수 있습니다.&lt;/p&gt;&lt;p&gt;Shares folders에 있는 폴더를 선택하고 해당 폴더에 대한 권한을 지정할 수 있는 기능입니다.&lt;/p&gt;&lt;p&gt;Read, Write는 파일 읽기 및 쓰기 가능&lt;/p&gt;&lt;p&gt;Delete는 파일 지우기 가능&lt;/p&gt;&lt;p&gt;Append 는 파일 수정가능&lt;/p&gt;&lt;p&gt;디렉토리 항목에 있는&lt;/p&gt;&lt;p&gt;Create, Delete는 디렉토리(폴더) 생성 삭제 가능&lt;/p&gt;&lt;p&gt;List는 디렉토리 조회가능&lt;/p&gt;&lt;p&gt;+Subdirs는 디렉토리의 하위디렉토리까지 조회가능&lt;/p&gt;&lt;p&gt;하다는 의미입니다.&lt;/p&gt;&lt;p&gt;적절한 권한을 선택해주시고 OK버튼을 눌러주시면 됩니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 649px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2721AA375641063D2C&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2721AA375641063D2C&quot; width=&quot;649&quot; height=&quot;435&quot; filename=&quot;11.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;설정이 성공적이라면 아래 그림과 같은 메시지를 볼 수 있습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 463px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/26200B375641063E2D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F26200B375641063E2D&quot; width=&quot;463&quot; height=&quot;237&quot; filename=&quot;12.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;기본적으로 FTP서버는 21번 22번 포트를 사용하고 있습니다. 하지만 보안을 생각한다면 포트를 변경해주시는게 좋겠습니다.&lt;/p&gt;&lt;p&gt;툴바영역의 톱니 모양 아이콘을 눌러서 서버 옵션설정창에 진입할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 296px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/22217D37564106412B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F22217D37564106412B&quot; width=&quot;296&quot; height=&quot;79&quot; filename=&quot;14.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;옵션 설정창의 모습입니다.&lt;/p&gt;&lt;p&gt;가장위의 제너럴 셋팅 항목을 선택하시고 Listen On these ports에 원하시는 적당한 포트명을 기입합니다.&lt;/p&gt;&lt;p&gt;1 ~ 65535까지 입력가능하네요. OK를 눌러 주시면 옵션 변경이 완료됩니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 594px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2228273C5641064328&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2228273C5641064328&quot; width=&quot;594&quot; height=&quot;411&quot; filename=&quot;15.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;이로서 서버에 대한 설정은 마무리 되었습니다. 더많은 기능들이 있는데 위정도까지만 설정하셔도 사용하는데 별다른 불편은 없을 겁니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;이제 테스트를 해볼차례입니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;아래 그림은 FTP클라이언트로 유명한 파일질라 FTP클라이언트의 모습입니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;다양한 경로를 통해서 다운로드 할 수 있으니 검색을 통해서 다운로드 받으시기 바랍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;설치하고 실행하시면 아래 그림과 같은 화면을 볼 수 있습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;상단의 툴바 영역에 호스트, 사용자면, 비밀번호, 포트등을 입력할 수 있는 공간이 보입니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;호스트에는 FTP서버의 주소를 입력해줍니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;사용자명과 비밀번호에는 아까 위에서 만들었던 계정을 입력해주시면 도고&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;포트는 역시 위에서 설정한 포트를 입력 후 빠른 연결 버튼을 눌러 서버에 접속 할 수 있습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 900px; font-size: 9pt; line-height: 1.5;; height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2321B437564106402B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2321B437564106402B&quot; width=&quot;900&quot; height=&quot;710&quot; filename=&quot;13.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;font-size: 9pt; line-height: 1.5;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래는 서버 접속에 성공한 모습입니다.&lt;/p&gt;&lt;p&gt;그림에 보시면 빈디렉터리 목록이라는 영역이 보일겁니다. 위의 계정에서 설정한 공유폴더의 내용물이 표시되는 공간입니다.&lt;/p&gt;&lt;p&gt;여기에 파일을 업로드 하시거나 다운로드 할 수 있습니다.&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 900px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2726743C564106452B&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2726743C564106452B&quot; width=&quot;900&quot; height=&quot;699&quot; filename=&quot;16.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;이상 간단한 설명을 마칩니다.&lt;br /&gt;&lt;/p&gt;</description>
      <category>기타</category>
      <category>ftp</category>
      <category>FTP 서버</category>
      <category>파일질라</category>
      <category>파일질라서버</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/286</guid>
      <comments>https://eltgroup.tistory.com/286#entry286comment</comments>
      <pubDate>Tue, 10 Nov 2015 06:17:09 +0900</pubDate>
    </item>
    <item>
      <title>구글플레이 게임서비스 클라우드 저장 사용하기(Googleplay game service cloud saving)</title>
      <link>https://eltgroup.tistory.com/285</link>
      <description>구글플레이 서비스에서 유용한점 하나가 클라우드 저장기능입니다.&lt;div&gt;&lt;p&gt;서버가 없는 게임인경우 게임데이터를 구글클라우드 서버에 저장하거나 가져오기를 통해서 사용자의 데이터를 안전하게 보관할 수 있습니다.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래 주소에서 유니티용 플러그인을 다운로드 할 수 있습니다.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/playgameservices/play-games-plugin-for-unity&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://github.com/playgameservices/play-games-plugin-for-unity&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;구글플레이 게임서비스 이용에 관한 전반적인 사항은 검색을 통해서 확인하시기 바랍니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;클라우드 저장기능사용에 대한 핵심적인 부분만 코드로 보여드립니다.&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #e5e5e5&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;11&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;12&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;13&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;14&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;15&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;16&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;17&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;18&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;19&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;20&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;21&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;22&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;23&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;24&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;25&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;26&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;27&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;28&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;29&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;30&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;31&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;32&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;33&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;34&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;35&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;36&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;37&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;38&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;39&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;40&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;41&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;42&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;43&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;44&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;45&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;46&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;47&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;48&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;49&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;50&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;51&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;52&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;53&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;54&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;55&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;56&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;57&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;58&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;59&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;60&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;61&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;62&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;63&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;64&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;65&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;66&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;67&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;68&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;69&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;70&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;71&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;72&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;73&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;74&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;75&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;76&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;77&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;78&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;79&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;80&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;81&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;82&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;83&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;84&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;85&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;86&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;87&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;88&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;89&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;90&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;91&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;92&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;93&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;94&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;95&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;96&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;97&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;98&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;99&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;100&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;101&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;102&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;103&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;104&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;105&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;106&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;107&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;108&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;109&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;110&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;111&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;112&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;113&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;114&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;115&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;116&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;117&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;118&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;119&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;120&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;121&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;122&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;123&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;124&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;125&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;126&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;127&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;128&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;129&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;130&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;131&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;132&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;133&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;134&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;135&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;136&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;137&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;138&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;139&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;140&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;141&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;142&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;143&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;144&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;145&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;146&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;147&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;148&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;149&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;150&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;151&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;152&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;153&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;154&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;155&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;156&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;157&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;158&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;159&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;160&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;161&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;using&lt;/span&gt;&amp;nbsp;UnityEngine;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;using&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#066de2&quot;&gt;System&lt;/span&gt;.Collections;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;using&lt;/span&gt;&amp;nbsp;GooglePlayGames;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;using&lt;/span&gt;&amp;nbsp;GooglePlayGames.BasicApi;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;using&lt;/span&gt;&amp;nbsp;GooglePlayGames.BasicApi.SavedGame;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;class&lt;/span&gt;&amp;nbsp;CGoogleplayGameServiceManager&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//게임서비스&amp;nbsp;플러그인&amp;nbsp;초기화시에&amp;nbsp;EnableSavedGames()를&amp;nbsp;넣어서&amp;nbsp;저장된&amp;nbsp;게임&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;합니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//주의&amp;nbsp;하실점은&amp;nbsp;구글플레이&amp;nbsp;개발자&amp;nbsp;콘솔의&amp;nbsp;게임서비스에서&amp;nbsp;해당게임의&amp;nbsp;세부정보에서&amp;nbsp;저장된&amp;nbsp;게임&amp;nbsp;사용을&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//하도록&amp;nbsp;설정하셔야&amp;nbsp;합니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;Init()&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PlayGamesClientConfiguration&amp;nbsp;config&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;new&lt;/span&gt;&amp;nbsp;PlayGamesClientConfiguration.Builder().EnableSavedGames().Build();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PlayGamesPlatform.InitializeInstance(config);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PlayGamesPlatform.DebugLogEnabled&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;false&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//Activate&amp;nbsp;the&amp;nbsp;Google&amp;nbsp;Play&amp;nbsp;gaems&amp;nbsp;platform&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PlayGamesPlatform.Activate();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//인증여부&amp;nbsp;확인&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;bool&lt;/span&gt;&amp;nbsp;CheckLogin()&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;return&lt;/span&gt;&amp;nbsp;Social.localUser.authenticated;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//--------------------------------------------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//게임&amp;nbsp;저장은&amp;nbsp;다음과&amp;nbsp;같이&amp;nbsp;합니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;SaveToCloud()&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color:#a71d5d&quot;&gt;!&lt;/span&gt;CheckLogin())&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//로그인되지&amp;nbsp;않았으면&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//로그인루틴을&amp;nbsp;진행하던지&amp;nbsp;합니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;return&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//파일이름에&amp;nbsp;적당히&amp;nbsp;사용하실&amp;nbsp;파일이름을&amp;nbsp;지정해줍니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OpenSavedGame(&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;사용할파일이름&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;true&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;OpenSavedGame(&lt;span style=&quot;color:#a71d5d&quot;&gt;string&lt;/span&gt;&amp;nbsp;filename,&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;bool&lt;/span&gt;&amp;nbsp;bSave)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ISavedGameClient&amp;nbsp;savedGameClient&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;PlayGamesPlatform.Instance.SavedGame;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;&amp;nbsp;(bSave)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;savedGameClient.OpenWithAutomaticConflictResolution(filename,&amp;nbsp;DataSource.ReadCacheOrNetwork,&amp;nbsp;ConflictResolutionStrategy.UseLongestPlaytime,&amp;nbsp;OnSavedGameOpenedToSave);&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//저장루틴진행&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;savedGameClient.OpenWithAutomaticConflictResolution(filename,&amp;nbsp;DataSource.ReadCacheOrNetwork,&amp;nbsp;ConflictResolutionStrategy.UseLongestPlaytime,&amp;nbsp;OnSavedGameOpenedToRead);&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//로딩루틴&amp;nbsp;진행&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//savedGameClient.OpenWithAutomaticConflictResolution호출시&amp;nbsp;아래&amp;nbsp;함수를&amp;nbsp;콜백으로&amp;nbsp;지정했습니다.&amp;nbsp;준비된경우&amp;nbsp;자동으로&amp;nbsp;호출될겁니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;OnSavedGameOpenedToSave(SavedGameRequestStatus&amp;nbsp;status,&amp;nbsp;ISavedGameMetadata&amp;nbsp;game)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;&amp;nbsp;(status&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;SavedGameRequestStatus.Success)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//&amp;nbsp;handle&amp;nbsp;reading&amp;nbsp;or&amp;nbsp;writing&amp;nbsp;of&amp;nbsp;saved&amp;nbsp;game.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//파일이&amp;nbsp;준비되었습니다.&amp;nbsp;실제&amp;nbsp;게임&amp;nbsp;저장을&amp;nbsp;수행합니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//저장할데이터바이트배열에&amp;nbsp;저장하실&amp;nbsp;데이터의&amp;nbsp;바이트&amp;nbsp;배열을&amp;nbsp;지정합니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SaveGame(game,&amp;nbsp;&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;저장할데이터바이트배열&quot;&lt;/span&gt;,&amp;nbsp;DateTime.Now.TimeOfDay);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//파일열기에&amp;nbsp;실패&amp;nbsp;했습니다.&amp;nbsp;오류메시지를&amp;nbsp;출력하든지&amp;nbsp;합니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;SaveGame(ISavedGameMetadata&amp;nbsp;game,&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;byte&lt;/span&gt;[]&amp;nbsp;savedData,&amp;nbsp;TimeSpan&amp;nbsp;totalPlaytime)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ISavedGameClient&amp;nbsp;savedGameClient&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;PlayGamesPlatform.Instance.SavedGame;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SavedGameMetadataUpdate.Builder&amp;nbsp;builder&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;new&lt;/span&gt;&amp;nbsp;SavedGameMetadataUpdate.Builder();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;builder&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.WithUpdatedPlayedTime(totalPlaytime)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.WithUpdatedDescription(&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;Saved&amp;nbsp;game&amp;nbsp;at&amp;nbsp;&quot;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;+&lt;/span&gt;&amp;nbsp;DateTime.Now);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;/*&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#999999&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(savedImage&amp;nbsp;!=&amp;nbsp;null)&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#999999&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#999999&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;This&amp;nbsp;assumes&amp;nbsp;that&amp;nbsp;savedImage&amp;nbsp;is&amp;nbsp;an&amp;nbsp;instance&amp;nbsp;of&amp;nbsp;Texture2D&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#999999&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;and&amp;nbsp;that&amp;nbsp;you&amp;nbsp;have&amp;nbsp;already&amp;nbsp;called&amp;nbsp;a&amp;nbsp;function&amp;nbsp;equivalent&amp;nbsp;to&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#999999&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;getScreenshot()&amp;nbsp;to&amp;nbsp;set&amp;nbsp;savedImage&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#999999&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;NOTE:&amp;nbsp;see&amp;nbsp;sample&amp;nbsp;definition&amp;nbsp;of&amp;nbsp;getScreenshot()&amp;nbsp;method&amp;nbsp;below&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#999999&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[]&amp;nbsp;pngData&amp;nbsp;=&amp;nbsp;savedImage.EncodeToPNG();&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#999999&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;builder&amp;nbsp;=&amp;nbsp;builder.WithUpdatedPngCoverImage(pngData);&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#999999&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}*/&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SavedGameMetadataUpdate&amp;nbsp;updatedMetadata&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;builder.Build();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;savedGameClient.CommitUpdate(game,&amp;nbsp;updatedMetadata,&amp;nbsp;savedData,&amp;nbsp;OnSavedGameWritten);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;OnSavedGameWritten(SavedGameRequestStatus&amp;nbsp;status,&amp;nbsp;ISavedGameMetadata&amp;nbsp;game)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ShowActionBar(&lt;span style=&quot;color:#a71d5d&quot;&gt;false&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;true&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;&amp;nbsp;(status&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;SavedGameRequestStatus.Success)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//데이터&amp;nbsp;저장이&amp;nbsp;완료되었습니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//데이터&amp;nbsp;저장에&amp;nbsp;실패&amp;nbsp;했습니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//----------------------------------------------------------------------------------------------------------------&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//클라우드로&amp;nbsp;부터&amp;nbsp;파일읽기&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;LoadFromCloud()&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color:#a71d5d&quot;&gt;!&lt;/span&gt;CheckLogin())&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//로그인되지&amp;nbsp;않았으니&amp;nbsp;로그인&amp;nbsp;루틴을&amp;nbsp;진행하던지&amp;nbsp;합니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;return&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//내가&amp;nbsp;사용할&amp;nbsp;파일이름을&amp;nbsp;지정해줍니다.&amp;nbsp;그냥&amp;nbsp;컴퓨터상의&amp;nbsp;파일과&amp;nbsp;똑같다&amp;nbsp;생각하시면됩니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OpenSavedGame(&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;사용할파일이름&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;false&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;OnSavedGameOpenedToRead(SavedGameRequestStatus&amp;nbsp;status,&amp;nbsp;ISavedGameMetadata&amp;nbsp;game)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;&amp;nbsp;(status&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;SavedGameRequestStatus.Success)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//&amp;nbsp;handle&amp;nbsp;reading&amp;nbsp;or&amp;nbsp;writing&amp;nbsp;of&amp;nbsp;saved&amp;nbsp;game.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LoadGameData(game);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//파일열기에&amp;nbsp;실패&amp;nbsp;한경우,&amp;nbsp;오류메시지를&amp;nbsp;출력하던지&amp;nbsp;합니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//데이터&amp;nbsp;읽기를&amp;nbsp;시도합니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;LoadGameData(ISavedGameMetadata&amp;nbsp;game)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ISavedGameClient&amp;nbsp;savedGameClient&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;PlayGamesPlatform.Instance.SavedGame;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;savedGameClient.ReadBinaryData(game,&amp;nbsp;OnSavedGameDataRead);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;OnSavedGameDataRead(SavedGameRequestStatus&amp;nbsp;status,&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;byte&lt;/span&gt;[]&amp;nbsp;data)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;if&lt;/span&gt;&amp;nbsp;(status&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;SavedGameRequestStatus.Success)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//&amp;nbsp;handle&amp;nbsp;processing&amp;nbsp;the&amp;nbsp;byte&amp;nbsp;array&amp;nbsp;data&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//데이터&amp;nbsp;읽기에&amp;nbsp;성공했습니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//data&amp;nbsp;배열을&amp;nbsp;복구해서&amp;nbsp;적절하게&amp;nbsp;사용하시면됩니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//읽기에&amp;nbsp;실패&amp;nbsp;했습니다.&amp;nbsp;오류메시지를&amp;nbsp;출력하던지&amp;nbsp;합니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(229, 229, 229);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; border-radius: 10px; padding: 1px; background-color: rgb(229, 229, 229);&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Unity</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/285</guid>
      <comments>https://eltgroup.tistory.com/285#entry285comment</comments>
      <pubDate>Fri, 30 Oct 2015 09:50:39 +0900</pubDate>
    </item>
    <item>
      <title>던전워즈 게임소개입니다,</title>
      <link>https://eltgroup.tistory.com/284</link>
      <description>&lt;p&gt;2015년경 출시한 게임입니다.&lt;/p&gt;
&lt;p&gt;유니티로 제작했고, 서버 없이 구글플레이 게임서비스와 쿠폰 사용부분에서&lt;/p&gt;
&lt;p&gt;JSP기반 웹서버를 조금이용했습니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;구글플레이, 애플스토어, 네이버스토어, 원스토어에 출시를 했지만&lt;/p&gt;
&lt;p&gt;현재는 개인사정으로 애플, 원스토어 버전만 서비스 중입니다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;애플앱스토어 :&amp;nbsp;&lt;a href=&quot;https://itunes.apple.com/us/app/dungeon-wars/id1053285564?l=ko&amp;amp;ls=1&amp;amp;mt=8&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://itunes.apple.com/us/app/dungeon-wars/id1053285564?l=ko&amp;amp;ls=1&amp;amp;mt=8&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;원스토어 :&lt;a href=&quot;https://www.onestore.co.kr/userpoc/game/view?pid=0000694826&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;https://www.onestore.co.kr/userpoc/game/view?pid=0000694826&lt;/a&gt;(유료버전)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;아래는 유니티 웹GL로 컨버팅한 버전입니다.&lt;/p&gt;
&lt;p&gt;웹GL을 지원하는 웹브라우저에서 플레이 할 수 있습니다.(크롬, 엣지, 파이어폭스등등)&lt;/p&gt;
&lt;p&gt;멈춘것 같이 보이지만 로딩까지 시간이 좀 걸릴 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;iframe width=&quot;800&quot; height=&quot;700&quot; src=&quot;https://choi98772.github.io/Games/DW/&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/KxhWUKXh6jc&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 900px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/26048635561F596407&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F26048635561F596407&quot; width=&quot;900&quot; height=&quot;506&quot; filename=&quot;1_google_1280x720.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 900px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2104E536561F59D239&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2104E536561F59D239&quot; width=&quot;900&quot; height=&quot;506&quot; filename=&quot;2_google_1280x720.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 900px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/27644C34561F59E218&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F27644C34561F59E218&quot; width=&quot;900&quot; height=&quot;506&quot; filename=&quot;3_google_1280x720.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 900px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/220C5F36561F59F335&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F220C5F36561F59F335&quot; width=&quot;900&quot; height=&quot;506&quot; filename=&quot;4_google_1280x720.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 900px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/2664EB35561F5A0A21&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F2664EB35561F5A0A21&quot; width=&quot;900&quot; height=&quot;506&quot; filename=&quot;5_google_1280x720.jpg&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>포트폴리오</category>
      <category>RPG</category>
      <category>게임</category>
      <category>던전워즈</category>
      <category>액션</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/284</guid>
      <comments>https://eltgroup.tistory.com/284#entry284comment</comments>
      <pubDate>Thu, 15 Oct 2015 16:48:52 +0900</pubDate>
    </item>
    <item>
      <title>앱스토어 가이드라인</title>
      <link>https://eltgroup.tistory.com/283</link>
      <description>&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0cm 0cm 0.0001pt; line-height: 13.5pt; text-align: center; clear: none; float: none;&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.studioh.bcrpg&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 180px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/21536C4656214AC719&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F21536C4656214AC719&quot; width=&quot;180&quot; height=&quot;120&quot; filename=&quot;google_180x120.png&quot; filemime=&quot;image/jpeg&quot; style=&quot;&quot;/&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;애플 앱스토어 가이드라인을 한번도 본적이 없어서
이번에 앱출시를 위해 한번 정독해봤습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0cm 0cm 0.0001pt; line-height: 13.5pt;&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;안되는 영어실력으로 끙끙거리며 번역해봤는데 내용이
많아서 다번역하지는 못했고 우리앱에 중요하다고 생각되는 항목에 대한 부분만 번역해봤습니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0cm 0cm 0.0001pt; line-height: 13.5pt;&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;오역의역이 있을수 있으니 단순참고만 부탁드립니다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0cm 0cm 0.0001pt; line-height: 13.5pt;&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;2.
Functionality(&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;기능성&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that crash
will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;크래시되는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that exhibit
bugs will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;버그가 보이는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that do
not perform as advertised by the developer will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
include undocumented or hidden features inconsistent with the description of
the App will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;설명과 일치하지 않거나 문서에 없는 또는 숨겨진
기능이 있는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.5&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that use
non-public APIs will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;비공개&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;API&lt;/span&gt;들을 사용한 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.6&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that read
or write data outside its designated container area will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;앱에 지정되지 않은 위치에 데이터를 기록하거나 읽는
앱은 거부된다&lt;/b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.7&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
download code in any way or form will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;어떠한 형태나 방법으로든 코드를 다운로드 하는 앱은
거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.8&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
install or launch other executable code will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;설치 또는 다른 실행 코드를 호출하는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.9&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that are
&quot;demo&quot;, &quot;trial&quot;, or &quot;test&quot; versions will be
rejected. Beta Apps may only be submitted through TestFlight and must follow
the TestFlight guidelines&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;데모&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;트라이얼&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;테스트 버전의 앱들은 거부된다&lt;span&gt;.&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;베타앱들은 테스트플라이트를
통해서 제출될 수 있고&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;테스트
플라이트 가이드 라인을 반드시 지켜야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.10&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;iPhone Apps
must also run on iPad without modification, at iPhone resolution, and at 2X
iPhone 3GS resolution&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;아이폰의 앱들은 반드시 수정없이 아이폰 해상도 또는&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;2x&lt;/span&gt;아이폰&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;3gs&lt;/span&gt;해상도 형태로 아이패드에서 실행되어야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.11&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
duplicate Apps already in the App Store may be rejected, particularly if there
are many of them, such as fart, burp, flashlight, and Kama Sutra Apps&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;이미 앱스토에있는 앱들&lt;span&gt;,&lt;/span&gt;특히나 방귀&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;트럼&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;플래시라이트&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;가마수투라 앱 같은 앱들은
거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.12&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that are
not very useful, unique, are simply web sites bundled as Apps, or do not
provide any lasting entertainment value may be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;매우 유용하지 않거나&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;유일하거나&lt;span&gt;(&lt;/span&gt;자기자신만을 위한앱같은&lt;span&gt;),&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;단순히 웹사이트에 연결되거나&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;어떠한 영구적인 컨테츠를
제공하지 않는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.13&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that are
primarily marketing materials or advertisements will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;마케팅&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;광고를 목적으로 하는 앱들은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.14&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that are
intended to provide trick or fake functionality that are not clearly marked as
such will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;의도적으로 속이거나 명백하게 표시되지 않은 형태로
가짜 기능을 제공하는 앱들은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.15&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps larger
than 100MB in size will not download over cellular networks (this is
automatically prohibited by the App Store)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;100Mb&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;이상크기의 앱들은 셀루러 네트워크&lt;span&gt;(&lt;/span&gt;통신사 네트워크&lt;span&gt;)&lt;/span&gt;를 통해서 다운로드 되지 않는다&lt;span&gt;.(&lt;/span&gt;이것은 앱스토어에서 자동으로 금지 시킨다&lt;span&gt;.)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.16&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Multitasking
Apps may only use background services for their intended purposes: VoIP, audio
playback, location, task completion, local notifications, etc.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;멀티 태스킹 앱들은 그들의 의도한 목적에 맞게 백스라운드 서비스를 사용해야한다.&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;: VoIP,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;오디오 플레이&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;위치&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;작업완성&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;로컬 통지&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;기타&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.17&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
browse the web must use the iOS WebKit framework and WebKit Javascript&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;웹 탐색은 반드시&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;iOS Webkit&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;프레임워크
및&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Webkit&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;자바 스크립트를
사용해야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.18&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
encourage excessive consumption of alcohol or illegal substances, or encourage
minors to consume alcohol or smoke cigarettes, will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;과도한 알코올 소비&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;불법 행위&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;미성년자에게 알코올 소비
또는 담배 피우기를 권유하는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.19&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
provide incorrect diagnostic or other inaccurate device data will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;잘못된 진단이나 부정확한 디바이스 데이터를 제공하는
앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.20&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Developers
&quot;spamming&quot; the App Store with many versions of similar Apps will be
removed from the iOS Developer Program&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt; color: red;&quot;&gt;비슷한 형태의 앱을 다량 앱스토어에 게시하는 개발자는&lt;/span&gt;&lt;/b&gt;&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span style=&quot;font-size: 9pt; color: red;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt; color: red;&quot;&gt;개발자 프로그램에서 제외된다&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 9pt; color: red;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.21&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that are
simply a song or movie should be submitted to the iTunes store. Apps that are
simply a book should be submitted to the iBooks Store&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;노래&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;영화는 아이튠즈 스토어&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;책은&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;iBook&lt;/span&gt;스토에서 제출될것이다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.22&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
arbitrarily restrict which users may use the App, such as by location or
carrier, may be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;위치나 캐리어 같은 것으로 유저의 앱사용을 임의로
제한하는 앱들은 거부될것이다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.23&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps must
follow the iOS Data Storage Guidelines or they will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱들은 반드시&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;iOS&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;데이터 저장소 가이드라인을
따라야 한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.24&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that are
offered in Newsstand must comply with schedules 1, 2 and 3 of the Program
License Agreement or they will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;뉴스스텐드에 공급되는 앱은 프로그램 라이선스 협정의
스케쥴&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;1, 2, 3&lt;/span&gt;을 따라야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.25&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
display Apps other than your own for purchase or promotion in a manner similar
to or confusing with the App Store will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;당신 소유가 아닌 앱의 구매 또는 프로모션을 위해
앱을 표시거나 기타 유사한 형태를 부추기는 앱들은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;2.26&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps may
display and recommend apps other than your own only if the collection is
designed for a specific approved need (e.g. health management, aviation,
accessibility, etc.) or provides significant added value for a specific group
of customers, or they will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱들은 만일 수집물이 특별히 공인된 필요에 의하거나&lt;span&gt;(&lt;/span&gt;건강관리&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;비행&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;접근성 기타&lt;span&gt;)&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;또는 고객의 특별한 그룹을
위한 중요한 부가 가치를 제공하기 위해서인 경우 다른 것 보다는 당신 소유의 앱을 표시 또는 권장할 수 있다&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.studioh.bcrpg&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;text-align: center;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 180px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/21536C4656214AC719&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F21536C4656214AC719&quot; width=&quot;180&quot; height=&quot;120&quot; filename=&quot;google_180x120.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;3. Metadata
(name, descriptions, ratings, rankings, etc.)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;메타데이터&lt;span&gt;(&lt;/span&gt;이름&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;설명&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;평가&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;랭킹&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;기타&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps or
metadata that mentions the name of any other mobile platform will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱이름 또는 메터데이터에 공식적으로 다른 모바일
플랫폼을 언급하는 앱들은 거부된다&lt;span&gt;.(&lt;/span&gt;안드로이드&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;아이폰&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;아이패드&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;애플&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;구글 처럼 다른 모바일플랫폼&lt;span&gt;(&lt;/span&gt;애플포함&lt;span&gt;)&lt;/span&gt;을 언급하지 말라는 소리&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps with
placeholder text will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps with
names, descriptions, screenshots, or previews not relevant to the content and
functionality of the App will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱의 이름&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;설명&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;스크린샷에 앱과 관계없는 컨텐츠가 포함된 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;App names in iTunes
Connect and as displayed on a device should be similar, so as not to cause
confusion&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;아이튠즈 컨넥터에 표시되는 앱이름과 디바이스에 표시되는
앱이름은 유사해야하며 혼동되지 않아야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.5&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Small and large
App icons should be similar, so as to not to cause confusion&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;작은 아이콘과 큰아이콘은 유사해서 혼동되지 않아야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.6&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps with App
icons, screenshots, and previews that do not adhere to the 4+ age rating will
be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱아이콘&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;스크린샷&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;미리보기가&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;세 미만 연령에 충실하지 않으면 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.7&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps with
Category and Genre selections that are not appropriate for the App content will
be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱의 카타고리와 장르가 앱의 컨텐츠와 부합되지 않으면
거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.8&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Developers are
responsible for assigning appropriate ratings to their Apps. Inappropriate
ratings may be changed/deleted by Apple&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;개발자는 자신의 앱에 합당한 평가를 받을 책임이
있다&lt;span&gt;.&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;부당하게 평가된
앱은 변경되거나 애플로부터 지워질것이다&lt;span&gt;.(&lt;/span&gt;평점조작하지말란소리&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.9&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Developers are
responsible for assigning appropriate keywords for their Apps. Inappropriate
keywords may be changed/deleted by Apple&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;개발자는 자신의 앱에 적합한 키워드를 사용해야한다&lt;span&gt;.&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;부당한 키워드는 애플이 변경하거나
지울것이다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.10&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Developers who
attempt to manipulate or cheat the user reviews or chart ranking in the App
Store with fake or paid reviews, or any other inappropriate methods will be
removed from the iOS Developer Program&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt; color: red;&quot;&gt;유저의 리뷰 또는 앱스토어내의 차트 랭킹을 조작하거나&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;가짜 유급 리뷰&lt;span&gt;(&lt;/span&gt;돈주고 리뷰&lt;span&gt;)&lt;/span&gt;를 시도 또는 유사한 형태의 부당한 방법을 시도하는 개발자는&lt;/span&gt;&lt;/b&gt;&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span style=&quot;font-size: 9pt; color: red;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt; color: red;&quot;&gt;개발자 프로그램에서 제외된다&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-size: 9pt; color: red;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.11&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
recommend that users restart their iOS device prior to installation or launch
may be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱을 설치&lt;span&gt;/&lt;/span&gt;실행하기전에&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;iOS&lt;/span&gt;디바이스를 제시작하도록 권장하는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.12&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps should
have all included URLs fully functional when you submit it for review, such as
support and privacy policy URLs&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;리뷰시에 앱내에 포함된 모든&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;URL&lt;/span&gt;들은 완전한 기능을 제공해야한다&lt;span&gt;(&lt;/span&gt;고객지원&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;개인정보 취급방침같은것들
및 기타&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.13&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps with
screenshots, previews, and marketing text that do not clearly identify
supplemental content or items that must be purchased separately (e.g. using
IAP) will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;스크린샷&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;미리보기 및 마케팅 텍스트에 표시된 내용중 구매를&lt;span&gt;(IAP&lt;/span&gt;같은&lt;span&gt;)&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;통해서
부분적으로 제공되는 컨텐츠라고 확실하게 표시하지 않은 내용이 포함된 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;(&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;예를들어 구매를 해야지만 사용할 수 있는 내용을
스크린샷이나 설명에 적어놓고&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이건
구매해야지 사용할 수 있다고 설명하지 않은경우&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.14&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;App previews
may only use video screen captures of the app, voice-overs, and textual and
design overlays, or the app will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱 미리보기에는 오직 앱으로부터 캡쳐된 비디오 스크린샷이나
음성들&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;텍스트등을
사용해야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.15&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps with
previews that display personal information of a real person without permission
will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱 미리보기에 허가없이 실제개인 정보를 출력하는
앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.16&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;App previews
may only include music that is licensed for that purpose in all selected
territories&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱 미리보기에는 모든 선택된 목적 지역에서 라이센스된
음악만 포함해야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;3.17&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;App previews
that include content played or streamed via the app (e.g. iTunes playlist,
YouTube streaming video) that is not licensed for use in the preview will be
rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱미리보기에 플레이 또는 스트림되는 컨텐츠가 라이선스되지
않은경우에는 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 16pt;&quot;&gt;4. Location(&lt;/span&gt;&lt;span style=&quot;font-size: 16pt;&quot;&gt;위치&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;4.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that do
not notify and obtain user consent before collecting, transmitting, or using
location data will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;사용자 동의없이 위치정보를 수집&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;전송&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이용하는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;4.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that use
location-based APIs for automatic or autonomous control of vehicles, aircraft,
or other devices will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;위치 기반&lt;span&gt;API&lt;/span&gt;를
차량&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;항공기&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;또는 다른 디바이스를 자동
또는 자율적으로 제어하기위해 사용하는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;4.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that use location-based
APIs for emergency services will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;위치기반&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;API&lt;/span&gt;를 긴급 서비스에 사용하는 앱들은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;4.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Location data
can only be used when directly relevant to the features and services provided
by the App to the user or to support approved advertising uses&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;위치데이터는 앱이 사용자를 지원 또는 공인된 광고를
사용하는등의 직접적인 관계가 있는 기능 또는 서비스를 제공할때만 사용할 수 있다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 17pt;&quot;&gt;5. Push
Notifications(&lt;/span&gt;&lt;span style=&quot;font-size: 17pt;&quot;&gt;푸시
알림&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;5.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
provide Push Notifications without using the Apple Push Notification (APN) API
will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;애플의 푸시알림&lt;span&gt;(APN)
API&lt;/span&gt;를사용하지 않고 푸시알림을 제공하는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;5.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that use
the APN service without obtaining a Push Application ID from Apple will be
rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;알려진 애플의 푸시 어플레케이션&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;ID&lt;/span&gt;없이&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;APN&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;서비스를 사용하는 앱은
거부될것이다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;5.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that send
Push Notifications without first obtaining user consent, as well as apps that
require Push Notifications to function, will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱이 푸시알림 기능 요구에 대한 동의없이 푸시알림을
보내는 경우 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;5.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that send
sensitive personal or confidential information using Push Notifications will be
rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;민감한 개인또는 비밀 정보를 푸시알림으로 보내는경우
거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;5.5&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that use
Push Notifications to send unsolicited messages, or for the purpose of phishing
or spamming will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;청하지 않은 메시지나&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;피싱&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;스팸을 목적으로 한 푸시
알림을 보내는 경우 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;5.6&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps cannot use
Push Notifications to send advertising, promotions, or direct marketing of any
kind&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱은 광고&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;프로모션 또는 어떠한 종류의 직접적인 마케팅에 푸시 알림을
사용할 수 없다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;5.7&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps cannot
charge users for use of Push Notifications&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱은 푸시알림 이용에 대한 경비를 유저에게 부담시킬
수 없다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;5.8&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
excessively use the network capacity or bandwidth of the APN service or unduly
burden a device with Push Notifications will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;APN&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;서비스에 지나치게 네트워크 용량 또는 대역폭을 사용하거나&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;디바이스에 지나치게 부담을
주는경우 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;5.9&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
transmit viruses, files, computer code, or programs that may harm or disrupt
the normal operation of the APN service will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;해를 끼치거나&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;APN&lt;/span&gt;서비스의 일반적인 작동을 붕괴시키는 바이러스&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;컴퓨터코드&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;또는 프로그램을 전송하는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 16pt;&quot;&gt;6. Game
Center(&lt;/span&gt;&lt;span style=&quot;font-size: 16pt;&quot;&gt;게임센터&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;6.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
display any Player ID to end users or any third party will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;최종사용자의 플레이어&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;ID&lt;/span&gt;또는 서드파티를 표시하는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;6.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that use
Player IDs for any use other than as approved by the Game Center terms will be
rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;게임센터의 공인된 플레이어&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;ID&lt;/span&gt;를 사용하지 않는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;6.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Developers that
attempt to reverse lookup, trace, relate, associate, mine, harvest, or
otherwise exploit Player IDs, aliases, or other information obtained through
Game Center will be removed from the iOS Developer Program&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt; color: red;&quot;&gt;개발자는 검색&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;추적&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;관계&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;제휴&lt;span&gt;, mine,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;수확&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;플레이어&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;ID&lt;/span&gt;의 부당한 사용&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;별명&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;또는 게임센터를 통해서 연결된 다른 정보를 리버스 하는경우&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;iOS&lt;/span&gt;개발자 프로그램에서 제외된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;6.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Game Center
information, such as Leaderboard scores, may only be used in Apps approved for
use with Game Center&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;리더보드 점수 같은 게임센터의 정보는 오직 공인된
게임센터와 함께 사용할 수 있다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;6.5&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that use
the Game Center service to send unsolicited messages, or for the purpose of
phishing or spamming will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;게임센터 서비스를 청하지 않은 메시지 전송&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;또는 피싱&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;스팸목적으로 이용하는 앱은
거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;6.6&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
excessively use the network capacity or bandwidth of Game Center will be
rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;게임센터의 네트워크 용량이나 대역폭을 지나치게 소모하는
앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;6.7&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
transmit viruses, files, computer code, or programs that may harm or disrupt
the normal operation of the Game Center service will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;피해를 주거나 게임센터 서비스의 정상적인 운영을
방해할 목적으로 바이러스&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파일들&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;컴퓨터코드 또는 프로그램을
전송하는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 17pt;&quot;&gt;7.
Advertising(&lt;/span&gt;&lt;span style=&quot;font-size: 17pt;&quot;&gt;광고&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;7.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
artificially increase the number of impressions or click-throughs of ads will
be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;인위적으로 광고의 클릭 또는&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;impressions&lt;/span&gt;를 증가 시키는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;7.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
contain empty iAd banners will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;비어있는&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;iAD&lt;/span&gt;배너를 포함한 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;7.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that are
designed predominantly for the display of ads will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;광고 표시를 목적으로 하기 위해 디자인된 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;8. Content and
Intellectual Property Rights(&lt;/span&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;컨첸츠와 지적 재산권&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;8.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps must
comply with all terms and conditions explained in the Guidelines for Using
Apple Trademarks and Copyrights and the Apple Trademark List&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱은 애플의 상표및 저작권&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;애플 상표들을 사용하기위해
가이드라인에 설명된 용어와 조건들을 반드시 따라야 한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;8.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
suggest or infer that Apple is a source or supplier of the App, or that Apple
endorses any particular representation regarding quality or functionality will
be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;애플이 공급하거나&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;애플 앱 공급자이거나 또는 품질이나 기능을 애플이 보증한다는
등의 어떠한&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;암시나 결론을 내도록 표시하는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;8.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
appear confusingly similar to an existing Apple product, interface, or
advertising theme will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;이미 있는 애플 제품의 인터페이스 또는 광고 테마와
유사하거나 혼란을 부추기는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;8.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
misspell Apple product names in their App name (i.e., GPS for Iphone, iTunz)
will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱이름에 잘못된 철자의 애플 제품이름을 사용하는
앱은 거부된다&lt;span&gt;.(&lt;/span&gt;예&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;GPS for iphone, iTunz)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;8.5&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps may not
use protected third party material such as trademarks, copyrights, patents or
violate 3rd party terms of use. Authorization to use such material must be
provided upon request&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱은 제&lt;span&gt;3&lt;/span&gt;자의
보호된 상표&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;저작권&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;특허 또는 제&lt;span&gt;3&lt;/span&gt;자와의 계약 위반을 할 수 없다&lt;span&gt;.&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사용에 대한 인가 정보는 요청되는경우 반드시 제공되어야 한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;8.6&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
include the ability to download music or video content from third party sources
(e.g. YouTube, SoundCloud, Vimeo, etc) without explicit authorization from
those sources will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;음악이나 비디오 컨텐츠를 관련자들의 명백한 인가없이
제&lt;span&gt;3&lt;/span&gt;자의 소스&lt;span&gt;(&lt;/span&gt;유튜브&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사운드클라우드&lt;span&gt;, Vimeo&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;등&lt;span&gt;)&lt;/span&gt;로부터 다운로드
하는앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 16pt;&quot;&gt;9. Media
content(&lt;/span&gt;&lt;span style=&quot;font-size: 16pt;&quot;&gt;미디어 컨텐트&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;9.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that do
not use the MediaPlayer framework to access media in the Music Library will be
rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;음악라이브러리 내부의 미디어 액세스를 위해&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;MediaPlayer&lt;/span&gt;를 사용하는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;9.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;App user
interfaces that mimic any iPod or iTunes interface will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱 사용자 인터페이스가&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;iPod&lt;/span&gt;또는&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;iTunes&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;인터페이스를 흉내
내는 경우 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;9.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Audio streaming
content over a cellular network may not use more than 5MB over 5 minutes&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;셀루러 네트워크를 통한 오디오 컨텐츠 스트리밍은&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;5&lt;/span&gt;분동안&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;5MB&lt;/span&gt;이상 초과 사용할 수없다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;9.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Video streaming
content over a cellular network longer than 10 minutes must use HTTP Live
Streaming and include a baseline 192 kbps or lower HTTP Live stream&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;셀루러 네트워크를 통해&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;10&lt;/span&gt;분이상의 비디오 컨텐츠 스트리밍하는 경우 반드시&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;HTTP&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;라이브 스트리밍을 사용해야하며&lt;span&gt;, 192 kbps&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;또는 그이하의&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;HTTP Live&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;스트림 제한선을
포함해야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;10. User
interface(&lt;/span&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;사용자
인터페이스&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;10.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps must
comply with all terms and conditions explained in the Apple iOS Human Interface
Guidelines&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱은 애플&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;iOS&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;휴먼 인터페이스 가이드라인에
설명된 계약과 조건을 반드시 따라야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;10.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that look
similar to Apps bundled on iOS or Watch OS devices, including the App Store,
iTunes Store, and iBooks Store, will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;iOS&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;또는&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Watch OS&lt;/span&gt;디바이스의 번들과 유사하게 보이거나&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;앱스토어&lt;span&gt;, iTunes&lt;/span&gt;스토어&lt;span&gt;, iBook&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;스토어등과 유사한
기능을 포함하는경우 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;10.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that do
not use system provided items, such as buttons and icons, correctly and as
described in the Apple iOS Human Interface Guidelines may be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;애플&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;iOS&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;휴먼 인터페이스 가이드라인에
올바르게 설명된되로&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;버튼이나
아이콘 같은 시스템을 위해 제공된 아이템들을 사용하는경우 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;10.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
create alternate desktop/home screen environments or simulate multi-App widget
experiences will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;데스크탑&lt;span&gt;/&lt;/span&gt;홈
스크린 환경 또는 다중앱 위젯 경험을 시뮬레이트 하는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;10.5&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that alter
the functions of standard switches, such as the Volume Up/Down and Ring/Silent
switches, will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;볼륨 업&lt;span&gt;/&lt;/span&gt;다운&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;링&lt;span&gt;/&lt;/span&gt;사일런트 스위치 같은 표준 스위치 기능을 변경시키는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;10.6&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apple and our
customers place a high value on simple, refined, creative, well thought through
interfaces. They take more work but are worth it. Apple sets a high bar. If
your user interface is complex or less than very good, it may be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;애플과 우리의 고객들은 인터페이스의 단순함&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;세련됨&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;창조성에 높은 가치를 둔다&lt;span&gt;.&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;그것은 더 많은 작업이 필요하지만
가치가 있다&lt;span&gt;.&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;애플은
높은 빗장을 만든다&lt;span&gt;.&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;만일
당신의 사용자 인터페이스가 복잡하거나&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;최상이
아니라면&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;그것은
거부될것이다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;10.7&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Watch Apps
whose primary function is telling time will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;워치앱의 주된 기능이 시간을 말하는 것이라면 거부될것이다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 16pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 16pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 16pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 16pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 16pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 16pt;&quot;&gt;11. Purchasing
and currencies(&lt;/span&gt;&lt;span style=&quot;font-size: 16pt;&quot;&gt;구매와
통화&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
unlock or enable additional features or functionality with mechanisms other
than the App Store will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱이 앱스토어에 있는 다른 앱들의 추가기능이나 특징들을
잠금해제하거나&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;활성화
시키는 경우 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps utilizing
a system other than the In-App Purchase API (IAP) to purchase content,
functionality, or services in an App will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱이 앱내의 컨텐츠나 기능&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;또는 서비스 구매에&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;In-App&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;구매&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;API&lt;/span&gt;대신 다른 시스템을 사용하는경우 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps using IAP
to purchase physical goods or goods and services used outside of the App will
be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱이 앱 외부의 실제 물건 또는 물건들과 서비스를
이용을 구매하는데&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;IAP&lt;/span&gt;를 사용하는경우 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that use
IAP to purchase credits or other currencies must consume those credits within
the App&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;IAP&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;를사용하여 구매한 크레딧 또는 다른 통화들은 반드시
앱내에서 소모되어야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.5&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that use
IAP to purchase credits or other currencies that expire will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;IAP&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;를 사용하여 구매한 크레딧이나 다른 통화의 기간이
만료되는 경우 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.6&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Content
subscriptions using IAP must last a minimum of 7 days and be available to the
user from all of their iOS devices&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;IAP&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;를 사용한 구독 컨텐츠들은 기간이 최소&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;7&lt;/span&gt;일이며&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;다른
모든&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;iOS&lt;/span&gt;디바이스들에서 사용할 수 있어야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.7&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that use
IAP to purchase items must assign the correct Purchasability type&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;IAP&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;를 사용하여 구매하는 아이템들에는 올바른 구매 타입을
할당해야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.8&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that use
IAP to purchase access to built-in capabilities provided by iOS, such as the
camera or the gyroscope, will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;iOS&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;에서 기본 제공되는 카메라 또는 자이로스코프 같은
기본 기능에&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;IAP&lt;/span&gt;구매를 사용하는앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.9&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps containing
content or services that expire after a limited time will be rejected, except
for specific approved content (e.g. films, television programs, music, books)&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;제한된 시간이후에 컨텐츠나 서비스가 만료되는 앱은
특별히 공인된 컨텐츠들&lt;span&gt;(&lt;/span&gt;영화들&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;텔레비전 프로그램&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;음악&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;책&lt;span&gt;)&lt;/span&gt;을 제외하고는
거부될 것이다&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.10&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Insurance Apps
must be free, in legal-compliance in the regions distributed, and cannot use
IAP&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;보험앱들은 배포지역의 법을 준수해야하며&lt;span&gt;, IAP&lt;/span&gt;를 사용할 수 없다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.11&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;In general, the
more expensive your App, the more thoroughly we will review it&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;일반적으로&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;당신이 앱이 다른것들에 비해 더 비싼경우&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;우리는 더욱 철저히 심사할것이다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.12&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps offering
subscriptions must do so using IAP, Apple will share the same 70/30 revenue
split with developers for these purchases, as set forth in the Program License
Agreement&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;구독을 제공하는 앱들은 반드시&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;IAP&lt;/span&gt;를 사용해야하며&lt;span&gt;, 4&lt;/span&gt;번째의 프로그램 라이선스 협정에 설정한것으로
애플은 개발자와&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;70/30&lt;/span&gt;으로 이익을 분배한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.13&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that link
to external mechanisms for purchases or subscriptions to be used in the App,
such as a &quot;buy&quot; button that goes to a web site to purchase a digital
book, will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱내에서&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;“&lt;span&gt;buy&lt;/span&gt;”&lt;span class=&quot;apple-converted-space&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;버튼을
눌러서 책 구매를 위해 웹사이트로 가는것과 같이 외부의 구매 또는 구독 매카니즘 링크를 사용하는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.14&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps can read
or play approved content (specifically magazines, newspapers, books, audio,
music, video and cloud storage) that is subscribed to or purchased outside of
the App, as long as there is no button or external link in the App to purchase
the approved content. Apple will only receive a portion of revenues for content
purchased inside the App&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱에서 공인된 컨텐츠를 읽거나 플레이 할 수 있으며&lt;span&gt;(&lt;/span&gt;특별한 메거진&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;신문&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;책&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;오디오&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;음악&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;비디오&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;클라우드 저장소&lt;span&gt;)&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;앱내에 구매를 위한 버튼이나
외부링크가 없기만하면&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;앱의
외부에서 구매 또는 구독이 가능하다&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;애플은
오직 앱 내부에서 구매된 컨텐츠 수입의 일부만 받을것이다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.15&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps may only
use auto-renewing subscriptions for periodicals (newspapers, magazines),
business Apps (enterprise, productivity, professional creative, cloud storage),
and media Apps (video, audio, voice), or the App will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;자동 갱신 구독은 정기 간행물만&lt;span&gt;(&lt;/span&gt;신문&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;매거진&lt;span&gt;)&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사용할 수 있으며&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;비즈니스앱들&lt;span&gt;(&lt;/span&gt;기업&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;생산성&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;전문 창조&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;클라우드 저장소&lt;span&gt;)&lt;/span&gt;와 미디어앱들&lt;span&gt;(&lt;/span&gt;비디오&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;오디오&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;음성&lt;span&gt;)&lt;/span&gt;이 사용하는경우
거부될것이다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.16&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps may enable
additional approved features or functionality when used in combination with
specific approved physical products (such as a toy) as long as the additional
features and functionality are either completely dependent on such hardware
(for example an App that is used to control a telescope) or also available
through the App without the physical products, such as by way of reward for
achievement or by use of IAP&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;11.17&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps may
facilitate transmission of approved virtual currencies provided that they do so
in compliance with all state and federal laws for the territories in which the
app functions&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 17pt;&quot;&gt;12. Scraping
and aggregation&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;12.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
scrape any information from Apple sites (for example from apple.com, iTunes
Store, App Store, iTunes Connect, Apple Developer Programs, etc.) or create
rankings using content from Apple sites and services will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱이 애플 사이트로부터의 어떠한 정보를 모은것이거나&lt;span&gt;(&lt;/span&gt;예를들어&lt;span&gt; apple.com, &lt;/span&gt;아이튠즈스토어&lt;span&gt;, &lt;/span&gt;앱스토어&lt;span&gt;, &lt;/span&gt;아이튠즈컨넥트&lt;span&gt;, &lt;/span&gt;애플개발자프로그램&lt;span&gt;,
&lt;/span&gt;기타&lt;span&gt;) &lt;/span&gt;애플사이트나 서비스 컨텐츠를 사용하여 순위를 생성하는 형태인경우 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;12.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps may use
approved Apple RSS feeds such as the iTunes Store RSS feed&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱은 아이튠즈 스토어의&lt;span&gt; RSS&lt;/span&gt;피드와 같은 공인된 애플의&lt;span&gt; RSS&lt;/span&gt;피드를 사용해야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;12.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that are
simply web clippings, content aggregators, or a collection of links, may be
rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱이 단지 웹페이지 스크랩&lt;span&gt;, &lt;/span&gt;컨텐츠 조각 모음&lt;span&gt;, &lt;/span&gt;링크의 모음인 경우 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;13. Damage or
injury(&lt;/span&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;손해 또는
상해&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;13.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
encourage users to use an Apple Device in a way that may cause damage to the
device will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;장치에 피해를 유발할 수 있는 방법으로 애플 장치를 사용을 유도하는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;13.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
rapidly drain the device's battery or generate excessive heat will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;급격히 장치 배터리를 소모하거나&lt;span&gt;, &lt;/span&gt;과도한 열을 발생시키는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;13.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps whose use
may result in physical harm may be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱사용으로 물리적인 손해를 끼치는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;14. Personal
attacks(&lt;/span&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;인신공격&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;14.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Any App that is
defamatory, offensive, mean-spirited, or likely to place the targeted
individual or group in harm's way will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;명예훼손&lt;span&gt;, &lt;/span&gt;모욕적&lt;span&gt;, &lt;/span&gt;공격적인의미&lt;span&gt;, &lt;/span&gt;또는 개인이나 그룹을 대상으로 해를 끼치는 형태의 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;14.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Professional
political satirists and humorists are exempt from the ban on offensive or
mean-spirited commentary&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;전문적인 정치 풍자가나 유머작가의 경우 모욕 또는 공격적의미의 해설 금지로부터 면제된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;14.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
display user generated content must include a method for filtering
objectionable material, a mechanism for users to flag offensive content, and
the ability to block abusive users from the service&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top:0cm;margin-right:0cm;margin-bottom:0cm;margin-left:8.85pt;
margin-bottom:.0001pt;text-indent:-8.85pt;mso-char-indent-count:-1.0;
line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;사용자가 생성한 컨텐츠를 표시하는 앱들은 반드시
사용자들의 모욕적인 컨텐츠에 표기하는 매커니즘이나 서비스로부터 사용자들의 욕설을 차단하는것과 같은 형태로&lt;span&gt;&amp;nbsp; &lt;/span&gt;기분이 상할 만한 내용들에 대한 필터링을&lt;span&gt;&amp;nbsp; &lt;/span&gt;포함해야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;15. Violence(&lt;/span&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;폭력&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;15.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps portraying
realistic images of people or animals being killed or maimed, shot, stabbed,
tortured or injured will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;실제와 같은 이미지로 사람이나 동물들을 죽음&lt;span&gt;, &lt;/span&gt;불구&lt;span&gt;, &lt;/span&gt;총에맞거나&lt;span&gt;, &lt;/span&gt;찔림&lt;span&gt;, &lt;/span&gt;고통스러움&lt;span&gt;, &lt;/span&gt;상처입음 과 같은 표현을 하는 앱은 거부된다&lt;span&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;15.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
depict violence or abuse of children will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;아동에 대한 폭력이나 학대를 묘사한 앱은 거부될것이다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;15.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&quot;Enemies&quot;
within the context of a game cannot solely target a specific race, culture, a
real government or corporation, or any other real entity&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;게임내 배경이 되는 적들은 구체적인 단일의 형태인 인종&lt;span&gt;, &lt;/span&gt;문화&lt;span&gt;, &lt;/span&gt;실제정부&lt;span&gt;, &lt;/span&gt;회사&lt;span&gt;, &lt;/span&gt;또는
다른 실제 존재들이 될 수 없다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;15.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps involving
realistic depictions of weapons in such a way as to encourage illegal or
reckless use of such weapons will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;무기같은것의 불법 또는 무모한 사용을 부추기는 방법으로 무기의 현실적인 묘사에 몰두한 앱들은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;15.5&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
include games of Russian roulette will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;러시안 룰렛 게임을 포함한 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;16.
Objectionable content(&lt;/span&gt;&lt;span style=&quot;font-size: 14pt;&quot;&gt;기분이 상할만한 내용&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;16.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
present excessively objectionable or crude content will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;지나치게 기분이 상할만 하거나 천연그대로의 컨텐츠를 포함한 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;16.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that are
primarily designed to upset or disgust users will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;주로 고의 적인 전복 또는 사용자 혐오가 목적인 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;17. Privacy(&lt;/span&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;사생활&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;17.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps cannot
transmit data about a user without obtaining the user's prior permission and
providing the user with access to information about how and where the data will
be used&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;어떠한 또는 어딘가의 데이터들에 대한 정보에 접근하기 위해서 사용자의 주된 허가나 제공없이 데이터를 전송하는 앱은
거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;17.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
require users to share personal information, such as email address and date of
birth, in order to function will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;기능을 위해서 사용자의 이메일이나&lt;span&gt;, &lt;/span&gt;생일같은 개인정보의 공유를 요구하는
앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;17.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps may ask
for date of birth (or use other age-gating mechanisms) only for the purpose of
complying with applicable children's privacy statutes, but must include some
useful functionality or entertainment value regardless of the user's age&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;어린이 사생활 범률적용에 따르기 위한 목적으로 생일&lt;span&gt;(&lt;/span&gt;또는 다른 나이확인
매커니즘 사용&lt;span&gt;)&lt;/span&gt;을 물어 볼 수 있다&lt;span&gt;, &lt;/span&gt;그러나 반드시 몇가지
유용한 기능이나 사용자 나이의 관계없는 서비스적 가치를 포함해야한다&lt;span&gt;. &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;17.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
collect, transmit, or have the capability to share personal information (e.g.
name, address, email, location, photos, videos, drawings, the ability to chat,
other personal data, or persistent identifiers used in combination with any of
the above) from a minor must comply with applicable children's privacy
statutes, and must include a privacy policy&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;미성년자로 부터 수집&lt;span&gt;, &lt;/span&gt;전송&lt;span&gt;, &lt;/span&gt;개인정보
공유&lt;span&gt;(&lt;/span&gt;예를 들어 이름&lt;span&gt;, &lt;/span&gt;주소&lt;span&gt;, &lt;/span&gt;이메일&lt;span&gt;, &lt;/span&gt;위치&lt;span&gt;, &lt;/span&gt;사진&lt;span&gt;, &lt;/span&gt;비디오&lt;span&gt;, &lt;/span&gt;그리기&lt;span&gt;, &lt;/span&gt;채팅&lt;span&gt;, &lt;/span&gt;기타 개인정보 또는 위의 어떠한 데이터를 이용한 지속적인 식별가능함&lt;span&gt;)&lt;/span&gt;하는경우
반드시 아동 사생활 범률을 따라야 하며&lt;span&gt;, &lt;/span&gt;개인정보 취급방침을 포함해야 한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;17.5&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
include account registration or access a user&lt;/span&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;’&lt;span&gt;s existing account must
include a privacy policy or they will be rejected&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;계정 등록을 포함하거나 유저가 보유한 계정에 접근하는 앱들은 반드시 개인정보 취급방침을 포함해야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;18.
Pornography(&lt;/span&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;포르노그래피&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;18.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps containing
pornographic material, defined by Webster's Dictionary as &quot;explicit
descriptions or displays of sexual organs or activities intended to stimulate
erotic rather than aesthetic or emotional feelings&quot;, will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;포르노그래픽을 포함하거나&lt;span&gt;, Webster's &lt;/span&gt;사전에 선언된 &lt;span&gt;“&lt;/span&gt;확실한 설명 또는 성적인 표현&lt;span&gt;, &lt;/span&gt;미학적 또는 감정적 관점을 벗어난
성적 호기심을 자극시키는&lt;span&gt;” &lt;/span&gt;앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;18.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
contain user generated content that is frequently pornographic (e.g. &quot;Chat
Roulette&quot; Apps) will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;사용자가 만든 컨텐츠에 포함된 내용이 빈번한 포르노 그래픽을 포함하는경우 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;19. Religion,
culture, and ethnicity(&lt;/span&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;종교&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;문화&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;민족성&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;19.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps containing
references or commentary about a religious, cultural or ethnic group that are
defamatory, offensive, mean-spirited or likely to expose the targeted group to
harm or violence will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱에는 종교적인 참조나 주석을 담을 수 있지만&lt;span&gt;, &lt;/span&gt;종교&lt;span&gt;, &lt;/span&gt;문화&lt;span&gt;,&lt;/span&gt;민족에 대한 명예회손&lt;span&gt;, &lt;/span&gt;모욕행위&lt;span&gt;, &lt;/span&gt;기분 나쁜 의미들&lt;span&gt;, &lt;/span&gt;특정 단체에 대해 해를 입히기 위한 폭로들이
포함되는경우 거부될것이다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;19.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps may contain
or quote religious text provided the quotes or translations are accurate and
not misleading. Commentary should be educational or informative rather than
inflammatory&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;종교적인 내용을 인용하거나 포함할 수 있지만&lt;span&gt;, &lt;/span&gt;정확하게 해석되어야 하며&lt;span&gt;, &lt;/span&gt;오도해서는 안된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;해설은 자극적이지 않아야 하며&lt;span&gt;, &lt;/span&gt;교육적이거나 정보 재공을 위한 목적이어야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;20. Contests,
sweepstakes, lotteries, raffles, and gambling(&lt;/span&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;콘테스트&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;경마&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;복권&lt;span&gt;,&lt;span class=&quot;apple-converted-space&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;도박&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;20.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Sweepstakes and
contests must be sponsored by the developer/company of the App&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;20.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Official rules
for sweepstakes and contests must be presented in the App and make it clear
that Apple is not a sponsor or involved in the activity in any manner&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;20.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;It must be
permissible by law for the developer to run a lottery App, and a lottery App
must have all of the following characteristics: consideration, chance, and a
prize&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;20.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that allow
a user to directly purchase a raffle ticket in the App will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;20.5&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that offer
real money gaming (e.g. sports betting, poker, casino games, horse racing) or
lotteries must have necessary licensing and permissions in the locations where
the App is used, must be restricted to those locations, and must be free on the
App Store&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;20.6&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that use
IAP to purchase credit or currency to use in conjunction with real money gaming
will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;21. Charities
and contributions(&lt;/span&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;자선과 기부&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;21.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
include the ability to make donations to recognized charitable organizations
must be free&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;21.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;The collection
of charitable donations must be done via a web site in Safari or an SMS&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;22. Legal
requirements(&lt;/span&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;범률
요구&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;22.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps must
comply with all legal requirements in any location where they are made
available to users. It is the developer's obligation to understand and conform
to all local laws&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱 사용자들의 지역적 &amp;nbsp;범률 요구를 반드시
따라야 한다&lt;span&gt;. &lt;/span&gt;개발자는 법을 이해하고&lt;span&gt;, &lt;/span&gt;지역법을 따라야한다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;22.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
contain false, fraudulent or misleading representations or use names or icons
similar to other Apps will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;앱이 거짓&lt;span&gt;, &lt;/span&gt;사기&lt;span&gt;, &lt;/span&gt;오도된
설명을 포함하거나 다른앱과 비슷한 이름&lt;span&gt;, &lt;/span&gt;아이콘을 사용하는 경우 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;22.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
solicit, promote, or encourage criminal or clearly reckless behavior will be
rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;구걸하거나&lt;span&gt;, &lt;/span&gt;조장&lt;span&gt;, &lt;/span&gt;범죄
행위나 무모한 행동을 부추기는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;22.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
enable illegal file sharing will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;불법적인 파일 공유를 활성화시키는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;22.5&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that are
designed for use as illegal gambling aids, including card counters, will be
rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;불법 &lt;span&gt;aids &lt;/span&gt;도박&lt;span&gt;, card
counters&lt;/span&gt;를 포함하기 위해 디자인된 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;22.6&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
enable anonymous or prank phone calls or SMS/MMS messaging will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;익명 또는 장난전화&lt;span&gt; SMS/MMS&lt;/span&gt;메시지를 보내는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;22.7&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Developers who
create Apps that surreptitiously attempt to discover user passwords or other
private user data will be removed from the iOS Developer Program&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt; color: red;&quot;&gt;사용자 비밀번호나 다른 개인데이터를 몰래 빼내려는 개발자는 개발자 프로그램에서 제외된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;22.8&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
contain DUI checkpoints that are not published by law enforcement agencies, or
encourage and enable drunk driving, will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;22.9&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
calculate medicinal dosages must be submitted by the manufacturer of those
medications or recognized institutions such as hospitals, insurance companies,
and universities&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;의학적 투약을 계산하는 앱들은 반드시 약물의 제조사&lt;span&gt;, &lt;/span&gt;병원이나&lt;span&gt;, &lt;/span&gt;보험회사 및 대학 같이 공인된 협회만 게시할 수 있다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;22.10&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that use
iTunes music previews in an unauthorized manner will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;허가받지 않은 방법으로 아이튠즈 음악 미리듣기를 사용하는 앱은 거부된다&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;23. Wallet&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;23.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Wallet passes
can be used to make or receive payments, transmit offers, or offer
identification (such as movie tickets, airline tickets, coupons and reward
offers). Other uses may result in the rejection of the App and the revocation
of Wallet credentials&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;23.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Passes must
include valid contact information from the issuer of the pass or the App will
be rejected and Wallet credentials may be revoked&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;23.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Passes must be
signed by the entity that will be distributing the pass under its own name,
trademark, or brand or the App will be rejected and Wallet credentials may be
revoked&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;24. Kids
Category(&lt;/span&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;아동 카테고리&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;24.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps in the Kids
Category must include a privacy policy and must comply with applicable
children's privacy statutes&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;24.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps in the
Kids Category may not include behavioral advertising (e.g. the advertiser may
not serve ads based on the user's activity within the App), and any contextual
ads presented in the App must be appropriate for kids&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;24.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps in the
Kids Category must get parental permission or use a parental gate before
allowing the user to link out of the app or engage in commerce&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;24.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps in the
Kids Category must be made specifically for kids ages 5 and under, ages 6-8, or
ages 9-11&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;25.
Extensions(&lt;/span&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;확장&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;25.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps hosting
extensions must comply with the App Extension Programming Guide&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;25.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps hosting
extensions must provide some functionality (help screens, additional settings)
or they will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;25.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps hosting
extensions that include marketing, advertising, or in-app purchases in their
extension view will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;25.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Keyboard
extensions must provide a method for progressing to the next keyboard&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;25.5&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Keyboard
extensions must remain functional with no network access or they will be
rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;25.6&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Keyboard
extensions must provide Number and Decimal keyboard types as described in the
App Extension Programming Guide or they will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;25.7&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps offering
Keyboard extensions must have a primary category of Utilities and a privacy
policy or they will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;25.8&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps offering
Keyboard extensions may only collect user activity to enhance the functionality
of their keyboard extension on the iOS device or they may be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;26. HomeKit&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;26.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps using the
HomeKit framework must have a primary purpose of providing home automation
services&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;26.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps using the
HomeKit framework must indicate this usage in their marketing text and they
must provide a privacy policy or they will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;26.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps must not
use data gathered from the HomeKit APIs for advertising or other use-based data
mining&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;26.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps using data
gathered from the HomeKit API for purposes other than improving the user
experience or hardware/software performance in providing home automation
functionality will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;27. HealthKit
and Human Subject Research&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;27.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps using the
HealthKit framework or conducting human subject research for health purposes,
such as through the use of ResearchKit, must comply with applicable law for
each Territory in which the App is made available, as well as Sections 3.3.28
and 3.3.39 of the iOS Developer Program License Agreement&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;27.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that write
false or inaccurate data into HealthKit will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;27.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps using the
HealthKit framework that store users&lt;/span&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;’&lt;span&gt; health information in iCloud
will be rejected&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;27.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps may not
use or disclose to third parties user data gathered from the HealthKit API or
from health-related human subject research for advertising or other use-based
data mining purposes other than improving health, or for the purpose of health
research&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;27.5&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that share
user data acquired via the HealthKit API with third parties without user
consent will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;27.6&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps using the
HealthKit framework must indicate integration with the Health app in their
marketing text and must clearly identify the HealthKit functionality in the app&lt;/span&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;’&lt;span&gt;s user
interface&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;27.7&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps using the
HealthKit framework or conducting human subject research must provide a privacy
policy or they will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;27.8&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps that
provide diagnoses, treatment advice, or control hardware designed to diagnose
or treat medical conditions that do not provide written regulatory approval
upon request will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;27.9&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps conducting
health-related human subject research must obtain consent from participants or,
in the case of minors, their parent or guardian. Such consent must include the
(a) nature, purpose, and duration of the research; (b) procedures, risks, and
benefits to the participant; (c) information about confidentiality and handling
of data (including any sharing with third parties); (d) a point of contact for
participant questions; and (e) the withdrawal process&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;27.10&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps conducting
health-related human subject research must secure approval from an independent
ethics review board. Proof of such approval must be provided upon request.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;28. TestFlight&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;28.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps may only
use TestFlight to beta test apps intended for public distribution and must
comply with the full App Review Guidelines&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;28.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps using
TestFlight must be submitted for review whenever a build contains material
changes to content or functionality&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;28.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps using
TestFlight may not be distributed to testers in exchange for compensation of
any kind&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;mso-line-height-alt:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 15pt;&quot;&gt;29. Apple Pay&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;29.1&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps using
Apple Pay must provide all material purchase information to the user prior to
sale of any good or service or they will be rejected; Apps using Apple Pay to
offer recurring payments must, at a minimum, disclose the length of the renewal
term and the fact that it will continue until canceled, what will be provided
during each period, the charges that will be billed to the customer, and how to
cancel.&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;29.2&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps using
Apple Pay must use Apple Pay branding and user interface elements correctly and
as described in the Apple Pay Identity Guidelines or they will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;29.3&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps using
Apple Pay as a purchasing mechanism may not offer goods or services that
violate the law of any territory in which the good or service will be delivered
and may not be used for any illegal purpose&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;29.4&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps using
Apple Pay must provide a privacy policy or they will be rejected&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;29.5&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin:0cm;margin-bottom:.0001pt;line-height:13.5pt&quot;&gt;&lt;span style=&quot;font-size: 9pt;&quot;&gt;Apps using
Apple Pay may only share user data acquired via Apple Pay with third parties
when provided to facilitate or improve delivery of goods and services or to
comply with legal requirements&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 0cm 0cm 0.0001pt;&quot;&gt;





















































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































































&lt;/p&gt;&lt;p&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>iOS</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/283</guid>
      <comments>https://eltgroup.tistory.com/283#entry283comment</comments>
      <pubDate>Sat, 10 Oct 2015 17:50:03 +0900</pubDate>
    </item>
    <item>
      <title>네이버 앱스토어 인앱영수증 검증 c#버전</title>
      <link>https://eltgroup.tistory.com/282</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.studioh.bcrpg&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;text-align: center;&quot;&gt;&lt;img actualwidth=&quot;180&quot; width=&quot;180&quot; exif=&quot;{}&quot; id=&quot;tx_entry_87619_&quot; class=&quot;txc-image&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/21536C4656214AC719&quot; height=&quot;120&quot; title=&quot;더블클릭을 하시면 이미지를 수정할 수 있습니다&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;네이버의 경우 구글과 같은 형태로 영수증을 발급하고 있습니다.&lt;/p&gt;&lt;p&gt;그렇기 때문에 구글 결제모듈과 동일한 방법으로 영수증 검증을 하면되는데 차이점은&lt;/p&gt;&lt;p&gt;네이버결제 데이터에는 한글같은게 포함되기 때문에 약간의 수정이 있어야 합니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아래 코드는 네이버 결제 코드 검증 루틴의 코드입니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;구글 검증루틴과 차이점은 아래 코드에서 진하게 표시해놓은(&lt;/span&gt;&lt;b style=&quot;font-size: 9pt; color: rgb(1, 1, 1); font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; line-height: 15.6px; white-space: pre; background-color: rgb(250, 250, 250);&quot;&gt;&lt;span style=&quot;color: rgb(0, 153, 204);&quot;&gt;Encoding&lt;/span&gt;.UTF8.GetBytes(Message)&lt;/b&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;) 부분입니다.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;바운시 캐슬 암호화 루틴은 구글 결제 코드 예제에 보시면 포함되어 있고, 라이브러리를 포함하기 힘든경우에는&lt;/p&gt;&lt;p&gt;바운시 캐슬 사이트에서 소스 코드를 직접 받아서 사용하시면됩니다.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.bouncycastle.org/&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;http://www.bouncycastle.org/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #e5e5e5&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;11&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;12&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;13&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;14&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;15&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;16&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;17&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;18&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;19&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;20&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;21&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;22&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;23&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;24&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;25&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;26&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;27&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;28&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;29&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;30&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;31&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;32&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;33&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;34&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;35&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;36&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;37&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;38&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;39&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;40&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;41&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;42&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;43&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;44&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;45&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;46&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;47&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;48&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;49&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;50&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;51&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;52&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;53&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;54&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;55&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;56&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;57&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;58&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;59&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;60&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;61&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;62&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;63&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;64&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;65&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;66&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;67&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;using&lt;/span&gt;&amp;nbsp;Org.BouncyCastle.Security;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;using&lt;/span&gt;&amp;nbsp;Org.BouncyCastle.Crypto;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;using&lt;/span&gt;&amp;nbsp;Org.BouncyCastle.Crypto.Parameters;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;using&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;System&lt;/span&gt;.Security.Cryptography;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;using&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;System&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;class&lt;/span&gt;&amp;nbsp;NaverSignatureVerify&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RSAParameters&amp;nbsp;_rsaKeyInfo;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;public&lt;/span&gt;&amp;nbsp;NaverSignatureVerify(&lt;span style=&quot;color:#0099cc&quot;&gt;String&lt;/span&gt;&amp;nbsp;strNaverPublicKey)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RsaKeyParameters&amp;nbsp;rsaParameters&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;(RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(strNaverPublicKey));&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;byte&lt;/span&gt;[]&amp;nbsp;rsaExp&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;rsaParameters.Exponent.ToByteArray();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;byte&lt;/span&gt;[]&amp;nbsp;Modulus&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;rsaParameters.Modulus.ToByteArray();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//&amp;nbsp;Microsoft&amp;nbsp;RSAParameters&amp;nbsp;modulo&amp;nbsp;wants&amp;nbsp;leading&amp;nbsp;zero's&amp;nbsp;removed&amp;nbsp;so&amp;nbsp;create&amp;nbsp;new&amp;nbsp;array&amp;nbsp;with&amp;nbsp;leading&amp;nbsp;zero's&amp;nbsp;removed&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;int&lt;/span&gt;&amp;nbsp;Pos&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#308ce5&quot;&gt;0&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color:#ff3399&quot;&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#308ce5&quot;&gt;0&lt;/span&gt;;&amp;nbsp;i&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;&amp;lt;&lt;/span&gt;&amp;nbsp;Modulus.Length;&amp;nbsp;i&lt;span style=&quot;color:#ff3399&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;+&lt;/span&gt;)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;if&lt;/span&gt;&amp;nbsp;(Modulus[i]&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#308ce5&quot;&gt;0&lt;/span&gt;)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pos&lt;span style=&quot;color:#ff3399&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;+&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;break&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;byte&lt;/span&gt;[]&amp;nbsp;rsaMod&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;byte&lt;/span&gt;[Modulus.Length&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&amp;nbsp;Pos];&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Array.Copy(Modulus,&amp;nbsp;Pos,&amp;nbsp;rsaMod,&amp;nbsp;&lt;span style=&quot;color:#308ce5&quot;&gt;0&lt;/span&gt;,&amp;nbsp;Modulus.Length&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;-&lt;/span&gt;&amp;nbsp;Pos);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//&amp;nbsp;Fill&amp;nbsp;the&amp;nbsp;Microsoft&amp;nbsp;parameters&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_rsaKeyInfo&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;new&lt;/span&gt;&amp;nbsp;RSAParameters()&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Exponent&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;rsaExp,&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Modulus&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;rsaMod&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;bool&lt;/span&gt;&amp;nbsp;Verify(&lt;span style=&quot;color:#0099cc&quot;&gt;String&lt;/span&gt;&amp;nbsp;Message,&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;String&lt;/span&gt;&amp;nbsp;Signature)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;if&lt;/span&gt;&amp;nbsp;(Application.platform&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;RuntimePlatform.Android)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;using&lt;/span&gt;&amp;nbsp;(RSACryptoServiceProvider&amp;nbsp;rsa&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;new&lt;/span&gt;&amp;nbsp;RSACryptoServiceProvider())&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;try&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rsa.ImportParameters(_rsaKeyInfo);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;return&lt;/span&gt;&amp;nbsp;rsa.VerifyData(&lt;b&gt;&lt;span style=&quot;color:#0099cc&quot;&gt;Encoding&lt;/span&gt;.UTF8.GetBytes(Message)&lt;/b&gt;,&amp;nbsp;&lt;span style=&quot;color:#993333&quot;&gt;&quot;SHA1&quot;&lt;/span&gt;,&amp;nbsp;Convert.FromBase64String(Signature));&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;catch&lt;/span&gt;&amp;nbsp;(&lt;span style=&quot;color:#0099cc&quot;&gt;System&lt;/span&gt;.&lt;span style=&quot;color:#0099cc&quot;&gt;Exception&lt;/span&gt;&amp;nbsp;ex)&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;#&lt;span style=&quot;color:#ff3399&quot;&gt;if&lt;/span&gt;&amp;nbsp;NEED_LOG&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Debug.Log(&lt;span style=&quot;color:#993333&quot;&gt;&quot;Verify&amp;nbsp;failed&amp;nbsp;:&amp;nbsp;&quot;&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;+&lt;/span&gt;&amp;nbsp;ex.ToString());&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;#endif&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;false&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;else&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color:#ff3399&quot;&gt;true&lt;/span&gt;;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(229, 229, 229);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; border-radius: 10px; padding: 1px; background-color: rgb(229, 229, 229);&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>c#</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/282</guid>
      <comments>https://eltgroup.tistory.com/282#entry282comment</comments>
      <pubDate>Sun, 13 Sep 2015 07:04:08 +0900</pubDate>
    </item>
    <item>
      <title>블록 게임</title>
      <link>https://eltgroup.tistory.com/281</link>
      <description>&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;
		&lt;title&gt;Unity Web Player | blockgame&lt;/title&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;https://ssl-webplayer.unity3d.com/download_webplayer-3.x/3.0/uo/jquery.min.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
		&lt;!--
		var unityObjectUrl = &quot;http://webplayer.unity3d.com/download_webplayer-3.x/3.0/uo/UnityObject2.js&quot;;
		if (document.location.protocol == 'https:')
			unityObjectUrl = unityObjectUrl.replace(&quot;http://&quot;, &quot;https://ssl-&quot;);
		document.write('&lt;script type=&quot;text\/javascript&quot; src=&quot;' + unityObjectUrl + '&quot;&gt;&lt;\/script&gt;');
		--&gt;
		&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
		&lt;!--
			var config = {
				width: 960, 
				height: 600,
				params: { enableDebugging:&quot;0&quot; }
				
			};
			var u = new UnityObject2(config);

			jQuery(function() {

				var $missingScreen = jQuery(&quot;#unityPlayer&quot;).find(&quot;.missing&quot;);
				var $brokenScreen = jQuery(&quot;#unityPlayer&quot;).find(&quot;.broken&quot;);
				$missingScreen.hide();
				$brokenScreen.hide();
				
				u.observeProgress(function (progress) {
					switch(progress.pluginStatus) {
						case &quot;broken&quot;:
							$brokenScreen.find(&quot;a&quot;).click(function (e) {
								e.stopPropagation();
								e.preventDefault();
								u.installPlugin();
								return false;
							});
							$brokenScreen.show();
						break;
						case &quot;missing&quot;:
							$missingScreen.find(&quot;a&quot;).click(function (e) {
								e.stopPropagation();
								e.preventDefault();
								u.installPlugin();
								return false;
							});
							$missingScreen.show();
						break;
						case &quot;installed&quot;:
							$missingScreen.remove();
						break;
						case &quot;first&quot;:
						break;
					}
				});
				u.initPlugin(jQuery(&quot;#unityPlayer&quot;)[0], &quot;https://dl.dropboxusercontent.com/u/211062767/blocktest.unity3d&quot;);
			});
		--&gt;
		&lt;/script&gt;
		&lt;style type=&quot;text/css&quot;&gt;
		&lt;!--
		body {
			font-family: Helvetica, Verdana, Arial, sans-serif;
			background-color: white;
			color: black;
			text-align: center;
		}
		a:link, a:visited {
			color: #000;
		}
		a:active, a:hover {
			color: #666;
		}
		p.header {
			font-size:10pt;
		}
		p.header span {
			font-weight: bold;
		}
		p.footer {
			font-size:8pt;
		}
		div.content {
			margin: auto;
			width: 960px;
		}
		div.broken,
		div.missing {
			margin: auto;
			position: relative;
			top: 50%;
			width: 193px;
		}
		div.broken a,
		div.missing a {
			height: 63px;
			position: relative;
			top: -31px;
		}
		div.broken img,
		div.missing img {
			border-width: 0px;
		}
		div.broken {
			display: none;
		}
		div#unityPlayer {
			cursor: default;
			height: 600px;
			width: 960px;
		}
		--&gt;
		&lt;/style&gt;
	
	
		&lt;p class=&quot;header&quot;&gt;벽돌굴려서 구멍에 넣으면 끝나는 간단한 예제입니다&lt;/p&gt;&lt;p class=&quot;header&quot;&gt;마우스 왼버튼을 눌러서 드래그 하게 되면 바닥을 회전 시킬 수 있습니다.&lt;/p&gt;&lt;p class=&quot;header&quot;&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;header&quot;&gt;&lt;span&gt;Unity Web Player | &lt;/span&gt;blockgame&lt;/p&gt;
		&lt;div class=&quot;content&quot;&gt;
			&lt;div id=&quot;unityPlayer&quot;&gt;
				&lt;div class=&quot;missing&quot;&gt;
					&lt;a href=&quot;http://unity3d.com/webplayer/&quot; title=&quot;Unity Web Player. Install now!&quot;&gt;
						&lt;img alt=&quot;Unity Web Player. Install now!&quot; src=&quot;http://webplayer.unity3d.com/installation/getunity.png&quot; width=&quot;193&quot; height=&quot;63&quot;&gt;
					&lt;/a&gt;
				&lt;/div&gt;
				&lt;div class=&quot;broken&quot;&gt;
					&lt;a href=&quot;http://unity3d.com/webplayer/&quot; title=&quot;Unity Web Player. Install now! Restart your browser after install.&quot;&gt;
						&lt;img alt=&quot;Unity Web Player. Install now! Restart your browser after install.&quot; src=&quot;http://webplayer.unity3d.com/installation/getunityrestart.png&quot; width=&quot;193&quot; height=&quot;63&quot;&gt;
					&lt;/a&gt;
				&lt;/div&gt;
			&lt;/div&gt;
		&lt;/div&gt;
		&lt;p class=&quot;footer&quot;&gt;« created with &lt;a href=&quot;http://unity3d.com/unity/&quot; title=&quot;Go to unity3d.com&quot;&gt;Unity&lt;/a&gt; »&lt;/p&gt;&lt;p class=&quot;footer&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;footer&quot;&gt;&lt;a href=&quot;http://nekofile.net/ddogwYd&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 24pt;&quot;&gt;프로젝트다운로드&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <category>Unity</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/281</guid>
      <comments>https://eltgroup.tistory.com/281#entry281comment</comments>
      <pubDate>Sat, 22 Aug 2015 03:58:46 +0900</pubDate>
    </item>
    <item>
      <title>빌보드 테스트</title>
      <link>https://eltgroup.tistory.com/279</link>
      <description>&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;
		&lt;title&gt;Unity Web Player | billboardtest&lt;/title&gt;
		&lt;script type=&quot;text/javascript&quot; src=&quot;https://ssl-webplayer.unity3d.com/download_webplayer-3.x/3.0/uo/jquery.min.js&quot;&gt;&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
		&lt;!--
		var unityObjectUrl = &quot;http://webplayer.unity3d.com/download_webplayer-3.x/3.0/uo/UnityObject2.js&quot;;
		if (document.location.protocol == 'https:')
			unityObjectUrl = unityObjectUrl.replace(&quot;http://&quot;, &quot;https://ssl-&quot;);
		document.write('&lt;script type=&quot;text\/javascript&quot; src=&quot;' + unityObjectUrl + '&quot;&gt;&lt;\/script&gt;');
		--&gt;
		&lt;/script&gt;
		&lt;script type=&quot;text/javascript&quot;&gt;
		&lt;!--
			var config = {
				width: 960, 
				height: 600,
				params: { enableDebugging:&quot;0&quot; }
				
			};
			var u = new UnityObject2(config);

			jQuery(function() {

				var $missingScreen = jQuery(&quot;#unityPlayer&quot;).find(&quot;.missing&quot;);
				var $brokenScreen = jQuery(&quot;#unityPlayer&quot;).find(&quot;.broken&quot;);
				$missingScreen.hide();
				$brokenScreen.hide();
				
				u.observeProgress(function (progress) {
					switch(progress.pluginStatus) {
						case &quot;broken&quot;:
							$brokenScreen.find(&quot;a&quot;).click(function (e) {
								e.stopPropagation();
								e.preventDefault();
								u.installPlugin();
								return false;
							});
							$brokenScreen.show();
						break;
						case &quot;missing&quot;:
							$missingScreen.find(&quot;a&quot;).click(function (e) {
								e.stopPropagation();
								e.preventDefault();
								u.installPlugin();
								return false;
							});
							$missingScreen.show();
						break;
						case &quot;installed&quot;:
							$missingScreen.remove();
						break;
						case &quot;first&quot;:
						break;
					}
				});
				u.initPlugin(jQuery(&quot;#unityPlayer&quot;)[0], &quot;https://dl.dropboxusercontent.com/u/211062767/bbtest.unity3d&quot;);
			});
		--&gt;
		&lt;/script&gt;
		&lt;style type=&quot;text/css&quot;&gt;
		&lt;!--
		body {
			font-family: Helvetica, Verdana, Arial, sans-serif;
			background-color: white;
			color: black;
			text-align: center;
		}
		a:link, a:visited {
			color: #000;
		}
		a:active, a:hover {
			color: #666;
		}
		p.header {
			font-size:10pt;
		}
		p.header span {
			font-weight: bold;
		}
		p.footer {
			font-size:8pt;
		}
		div.content {
			margin: auto;
			width: 960px;
		}
		div.broken,
		div.missing {
			margin: auto;
			position: relative;
			top: 50%;
			width: 193px;
		}
		div.broken a,
		div.missing a {
			height: 63px;
			position: relative;
			top: -31px;
		}
		div.broken img,
		div.missing img {
			border-width: 0px;
		}
		div.broken {
			display: none;
		}
		div#unityPlayer {
			cursor: default;
			height: 600px;
			width: 960px;
		}
		--&gt;
		&lt;/style&gt;
	
	
		&lt;p class=&quot;header&quot;&gt;&lt;span&gt;Unity Web Player | &lt;/span&gt;billboardtest&lt;/p&gt;
		&lt;div class=&quot;content&quot;&gt;
			&lt;div id=&quot;unityPlayer&quot;&gt;
				&lt;div class=&quot;missing&quot;&gt;
					&lt;a href=&quot;http://unity3d.com/webplayer/&quot; title=&quot;Unity Web Player. Install now!&quot;&gt;
						&lt;img alt=&quot;Unity Web Player. Install now!&quot; src=&quot;http://webplayer.unity3d.com/installation/getunity.png&quot; width=&quot;193&quot; height=&quot;63&quot;&gt;
					&lt;/a&gt;
				&lt;/div&gt;
				&lt;div class=&quot;broken&quot;&gt;
					&lt;a href=&quot;http://unity3d.com/webplayer/&quot; title=&quot;Unity Web Player. Install now! Restart your browser after install.&quot;&gt;
						&lt;img alt=&quot;Unity Web Player. Install now! Restart your browser after install.&quot; src=&quot;http://webplayer.unity3d.com/installation/getunityrestart.png&quot; width=&quot;193&quot; height=&quot;63&quot;&gt;
					&lt;/a&gt;
				&lt;/div&gt;
			&lt;/div&gt;
		&lt;/div&gt;
		&lt;p class=&quot;footer&quot;&gt;« created with &lt;a href=&quot;http://unity3d.com/unity/&quot; title=&quot;Go to unity3d.com&quot;&gt;Unity&lt;/a&gt; »&lt;/p&gt;&lt;p class=&quot;footer&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;footer&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;p class=&quot;footer&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;&lt;/span&gt;&lt;a href=&quot;http://nekofile.net/dd3ZRmX&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot;&gt;&lt;span style=&quot;font-size: 18pt;&quot;&gt;프로젝트 파일다운로드&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;&lt;p class=&quot;footer&quot;&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Unity</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/279</guid>
      <comments>https://eltgroup.tistory.com/279#entry279comment</comments>
      <pubDate>Sun, 16 Aug 2015 22:41:32 +0900</pubDate>
    </item>
    <item>
      <title>MPU6050 자이로 가속도 센서</title>
      <link>https://eltgroup.tistory.com/278</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.studioh.bcrpg&quot; target=&quot;_blank&quot; class=&quot;tx-link&quot; style=&quot;text-align: center;&quot;&gt;&lt;img actualwidth=&quot;180&quot; width=&quot;180&quot; exif=&quot;{}&quot; id=&quot;tx_entry_87619_&quot; class=&quot;txc-image&quot; src=&quot;https://t1.daumcdn.net/cfile/tistory/21536C4656214AC719&quot; height=&quot;120&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;자이로 와 가속도 센서가 포함된 센서입니다.&lt;/p&gt;&lt;p&gt;매우 유명하여 딱히 설명할 필요가 없는 센서인데,&lt;/p&gt;&lt;p&gt;예제또한 풍부합니다.&lt;/p&gt;&lt;p&gt;하지만 깔끔하게 센서제어 및 액세스에 관련한 부분만 만들어진것은 안보이는것 같아&lt;/p&gt;&lt;p&gt;제가 참고 했던 예제중 하나를 클래스로 래핑하여, 라이브러리화 했습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;사용법은 아래와 같습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;첨부 파일을 아두이노 라이브러리에 추가 하시고 사용하면됩니다.&lt;/p&gt;&lt;p&gt;칼만필터라는 예제를 수정한 버전인데 혹 이미 같은 라이브러리를 추가해놓으신경우에는&lt;/p&gt;&lt;p&gt;에러가 날 수 도 있겠습니다.&lt;/p&gt;&lt;p&gt;그런경우에는&amp;nbsp;&lt;b&gt;CMPU6050.h&lt;/b&gt; 파일만 칼만필터 라이브러리 폴더내에 복사해 넣으시면되겠습니다.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-size: 9pt; line-height: 1.5;&quot;&gt;첨부&lt;/span&gt;라이브러리&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block;   height: auto; max-width: 100%;&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/2236814B55B35DA619&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://i1.daumcdn.net/cfs.tistory/v/0/blog/image/extension/zip.gif&quot; style=&quot;vertical-align: middle;&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;KalmanFilter.zip&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;예제소스코드&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block;   height: auto; max-width: 100%;&quot;&gt;&lt;a href=&quot;https://t1.daumcdn.net/cfile/tistory/264E2B3A5675BCAB08&quot;&gt;&lt;img alt=&quot;&quot; src=&quot;https://i1.daumcdn.net/cfs.tistory/v/0/blog/image/extension/zip.gif&quot; style=&quot;vertical-align: middle;&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;mpu6050test.zip&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;아두이노 작품 메뉴에 있는 밸런싱 로봇은 아래 라이브러리를 활용하여 만든것이니, 동작에 별문제 없다고 생각합니다.&lt;/p&gt;&lt;div class=&quot;colorscripter-code&quot; style=&quot;color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; position:relative !important; overflow:auto&quot;&gt;&lt;table class=&quot;colorscripter-code-table&quot; style=&quot;margin:0; padding:0; border:none; background-color:#fafafa; border-radius:4px;&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style=&quot;padding:6px; border-right:2px solid #e5e5e5&quot;&gt;&lt;div style=&quot;margin:0; padding:0; word-break:normal; text-align:right; color:#666; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;line-height:130%&quot;&gt;1&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;2&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;3&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;4&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;5&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;6&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;7&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;8&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;9&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;10&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;11&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;12&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;13&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;14&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;15&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;16&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;17&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;18&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;19&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;20&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;21&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;22&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;23&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;24&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;25&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;26&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;27&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;28&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;29&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;30&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;31&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;32&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;33&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;34&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;35&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;36&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;37&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;38&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;39&lt;/div&gt;&lt;div style=&quot;line-height:130%&quot;&gt;40&lt;/div&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;padding:6px 0&quot;&gt;&lt;div style=&quot;margin:0; padding:0; color:#010101; font-family:Consolas, 'Liberation Mono', Menlo, Courier, monospace !important; line-height:130%&quot;&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;#include&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;lt;&lt;/span&gt;Arduino.h&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;#include&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;lt;&lt;/span&gt;Wire.h&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;#include&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;lt;&lt;/span&gt;Kalman.h&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;#include&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;lt;&lt;/span&gt;CMPU6050.h&lt;span style=&quot;color:#a71d5d&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#999999&quot;&gt;//mpu6050&amp;nbsp;매니저입니다.&amp;nbsp;단순히&amp;nbsp;누군가&amp;nbsp;만들어놓은&amp;nbsp;유명한&amp;nbsp;예제에서&amp;nbsp;mpu6050부분만&amp;nbsp;뽑아&amp;nbsp;클래스화&amp;nbsp;시킨겁니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;CMpu6050Manager&amp;nbsp;g_Mpu6050;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;setup()&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;g_Mpu6050.Init();&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//setup에서&amp;nbsp;반드시&amp;nbsp;한번&amp;nbsp;호출해&amp;nbsp;줍니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;Serial.begin(&lt;span style=&quot;color:#0099cc&quot;&gt;9600&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;}&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&lt;span style=&quot;color:#a71d5d&quot;&gt;void&lt;/span&gt;&amp;nbsp;loop()&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;{&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//매&amp;nbsp;루프마다&amp;nbsp;호출되게&amp;nbsp;해줍니다.&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;g_Mpu6050.Update();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//x값은&amp;nbsp;-90&amp;nbsp;~&amp;nbsp;90&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//y값은&amp;nbsp;-180&amp;nbsp;~&amp;nbsp;180범위&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//상보&amp;nbsp;필터(Complementary&amp;nbsp;Filter)&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;float&lt;/span&gt;&amp;nbsp;companglex&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;g_Mpu6050.GetCompAngleX();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;float&lt;/span&gt;&amp;nbsp;compangley&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;g_Mpu6050.GetCompAngleY();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#999999&quot;&gt;//칼만&amp;nbsp;필터,&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;float&lt;/span&gt;&amp;nbsp;kalmananglex&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;g_Mpu6050.GetKalAngleX();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;float&lt;/span&gt;&amp;nbsp;kalmanangley&amp;nbsp;&lt;span style=&quot;color:#a71d5d&quot;&gt;=&lt;/span&gt;&amp;nbsp;g_Mpu6050.GetKalAngleY();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;Serial.print(&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;kalx&amp;nbsp;:&amp;nbsp;&quot;&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;Serial.print(kalmananglex,&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;2&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;Serial.print(&lt;span style=&quot;color:#63a35c&quot;&gt;&quot;\tkaly&amp;nbsp;:&amp;nbsp;&quot;&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;Serial.print(kalmanangley,&amp;nbsp;&lt;span style=&quot;color:#0099cc&quot;&gt;2&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;Serial.println();&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;&amp;nbsp;&amp;nbsp;delay(&lt;span style=&quot;color:#0099cc&quot;&gt;500&lt;/span&gt;);&lt;/div&gt;&lt;div style=&quot;padding:0 6px; white-space:pre; line-height:130%&quot;&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align:right; margin-top:-13px; margin-right:5px; font-size:9px; font-style:italic&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: rgb(229, 229, 229);&quot;&gt;Colored by Color Scripter&lt;/a&gt;&lt;/div&gt;&lt;/td&gt;&lt;td style=&quot;vertical-align:bottom; padding:0 2px 4px 0&quot;&gt;&lt;a href=&quot;http://colorscripter.com/info#e&quot; target=&quot;_blank&quot; style=&quot;color: white;&quot;&gt;&lt;span style=&quot;font-size: 9px; word-break: normal; border-radius: 10px; padding: 1px; background-color: rgb(229, 229, 229);&quot;&gt;cs&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style=&quot;text-align: center; clear: none; float: none;&quot;&gt;&lt;span class=&quot;imageblock&quot; style=&quot;display: inline-block; width: 900px;  height: auto; max-width: 100%;&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/cfile/tistory/223874395675BB970D&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Ft1.daumcdn.net%2Fcfile%2Ftistory%2F223874395675BB970D&quot; width=&quot;900&quot; height=&quot;475&quot; filename=&quot;mpu6050센싱.png&quot; filemime=&quot;image/jpeg&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>아두이노</category>
      <category>mpu6050</category>
      <category>가속도</category>
      <category>아두이노</category>
      <category>자이로</category>
      <author>래머</author>
      <guid isPermaLink="true">https://eltgroup.tistory.com/278</guid>
      <comments>https://eltgroup.tistory.com/278#entry278comment</comments>
      <pubDate>Sat, 25 Jul 2015 18:58:30 +0900</pubDate>
    </item>
  </channel>
</rss>