무선랜 장착 노트북을 통해 인터넷 공유(Adhoc, Peer to peer) 설정하기

|

내 블로그가 어느사이 강한 정치색을 띄고 있었다. 보수성향을 사람들이 보면 좌익 빨갱이라고 할지도 모르겠다.

처음 블로그에 글을 올리기 시작할 때는 이게 아니었는데... 누가 날 이렇게 만들었나 원망스럽기도 하다.

 

오늘은 내 블로그 본연의 목적에 충실한 글을 올려야지...

오래전부터 한번 해보려 맘먹었던 유선 인터넷과 무선랜이 함께 지원되는 노트북에서 인터넷 공유 설정법이다.

 

----- 본 문 -----

 

PC를 조금 사용하는 사람이라면 집에 인터넷 라인이 들어오지 않는 사람을 없을 것이다. 그리고 PC를 두 대 이상 사용하는 매니아(?)도 많다. 두 대 이상의 PC에서 인터넷에 접속하기 위해서 인터넷 공유기를 사용하는 것이 이미 일반화 되어 있고 인터넷 유무선 공유기의 가격도 엄청나게 커진 시장으로 인해 10만원 훨씬 미만으로 하락한 상태다.

 

하지만 이동이 잦은 엔지니어들 특히 두 명 이상 짝을지어 지방출장을 가는 경우에는 공유기를 들고 다니기는 솔직히 부담스럽다. 일부러 인터넷이 되는 숙소를 잡고 혼자 인터넷 서핑을 하는 것은 가능하지만 두 명이 동시에 두대로 인터넷을 하는 것은 생각하지 못하고 있었다.

 

그러던 중 두 명이 함께 출장을 가서 1박을 하는 상황이 발생했고 방으로 들어오는 인터넷 유선라인을 노트북에 연결하고 장착된 무선랜카드를 통해 인터넷 공유설정을 해보기로 마음먹었다.

 

PC에 랜카드 두 개를 설치하고 인터넷을 공유하는 것은 해보았지만 무선랜카드를 통해 공유 설정을 해보는 것은 처음이다 보니 설정이 그리 간단하지는 않았다.

 

지금부터 그 과정을 설명한다.

 

먼저 구성을 보면

 

 

위의 그림에서와 같이 Note1으로 유선인터넷 회선이 연결된다. 집이라면 ADSL, VDSL, 광랜 등의 인터넷 회선이 될 것이다.

 

이때 인터넷 공유기의 역할을 대신할 Note1에는 유선랜카드와 무선랜카드가 모두 장착되어 있다고 가정한다.

 

이러한 환경에서 Note2 Note1의 인터넷을 공유하기 위해서는 Note1으로 유선을 통해 들어온 로컬 연결 영역을 공유 설정해주고 Note1의 무선랜카드의 설정을 Adhoc 이라는 Peer to Peer 방식으로 설정해 주면 된다.

 

이제 이 과정을 살펴보자.

 

먼저 유선을 통해 인터넷이 들어오는 Note1에서 해야 할 설정이다.

<01.JPG>

 

먼저 유선랜 혹은 집으로 들어오는 ADSL, VDSL, 광랜 등 인터넷에 연결된 Note1에서 네트워크 환경을 보면 위의 그림과 같다. 또한 무선 네트워크도 활성화 되어 있어야 한다.

 

이제 아래 그림과 같이 로컬 영역 연결의 공유 설정을 해야한다. 로컬 영역 연결의 속성 창을 열고 고급탭을 선택하고 인터넷 연결 공유에 체크만 해주면 된다.

 

<02.JPG>

 

위와 같이 체크하고 확인 버튼을 누른다.

<03.JPG>

 

정상적으로 공유가 설정되었다면 위의 그림과 같이 로컬 영역 연결공유됨이라고 표시가 된다.

 

다음은 무선 네트워크의 설정이다.

 

먼저 무선 네트워크 연결의 속성창을 열고 다음 화면과 같이 설정한다.

 

<04.JPG>

 

속성 창의 무선 네트워크 탭에서 Windows에서 무선 네트워크 구성을 체크해주고 맨 아래쪽의 고급 버튼을 눌러 표시되는 윈도에서 컴퓨터 간 네트워크만(특별)에 체크를 해준다. Windows에서 무선 네트워크 구성이 활성화 되지 않는 다면 네트워크 설정을 관리하는 별도의 프로그램이 활성화 되어 있기 때문이다. 윈도를 리부팅하고 해당 네트워크 설정프로그램을 종료한 뒤 다시 시도해야 한다.

 

다음은 Access Point 역할을 하기 위한 설정이다.

 

<05.JPG>

 

아래쪽의 추가 버튼을 클릭하고 연결정보 탭에 위와 같이 SSID를 입력한다.

그리고 키가 자동으로 공급됨의 선택을 해제한 뒤 네트워크 키를 입력한다. 이 네트워크 키는 보안을 위한 암호로서 최소 5자리 혹은 13자리 숫자+영문으로 입력해야 한다.

그리고 확인 버튼을 누른다.

 

<06.JPG>

 

SSID 관련 설정이 완료되면 위와 같이 네트워크 목록에 앞 화면에서 입력한 SSID 값이 보인다. 단 아직 연결되지 않은 상태이기 때문에 적색 X 표시가 되어 있어도 정상이다.

 

다음단계는 생성한 SSID Note1을 연결시키는 작업이 이루어져야 한다.

 

Note1에서 사용할 수 있는 무선 네트워크를 보면 다음과 같이 노트북의 무선 랜카드에 부여된 SSID를 확인할 수 있다.

 

<07.JPG>

 

해당 SSID를 선택하고 연결버튼을 클릭한다.

 

<08.JPG>

 

앞의 화면과 같이 네트워크 키를 입력하라는 창이 보이게 된다. 앞에서 설정한 네트워크 키 5자리 혹은 13자리를 입력하고 연결 버튼을 누른다.

 

<09.JPG>

 

입력한 네트워크 키가 올바르다면 위와 같이 연결됨 이라는 표시가 된다.

 

 

<10.JPG>

그리고 나서 "무선 네트워크 연결의 속성에 들어가면 앞의 그림과 같이 적색 X 표시가 있던 무선네트워크 SSID에 적색 X 표시가 사라졌음을 알 수 있다.

 

이제 마지막으로 해야 하는 설정은 Note1의 무선 네트워크 연결의 IP를 설정해주는 부분이다.

 

아래 화면과 같이 고정IP를 지정해 주면 된다.

 

<그림 11.JPG>

 

 

이제 인터넷을 공유할 Note1의 설정은 모두 완료되었다.

 

완료된 뒤 Note1 IP 설정은 다음과 같이 확인할 수 있다. 명령창에서 ipconfig를 실행한 화면이다.

 

<
그림 12.JPG>

 

유선으로 인터넷에 연결된 로컬 영역 연결에는 게이트웨이가 설정되어 있는 것을 볼 수 있다. 위의 화면은 광랜으로 들어오는 인터넷회선이 유무선 공유기에 연결되어 있고 Note1이 랜으로 공유기에 연결되어 Note1이 사설IP를 사용하는 경우이다.

 

만약 인터넷 회선이 광랜, ADSL, VDSL등으로 Note1에 직접 연결된다면 공인IP가 부여될 것이다.

 

다음부터는 Note1을 통해 인터넷을 사용하게 될 Note2의 설정이다. Note1 보다는 훨씬 간단하게 설정이 된다.

 

Note2에서는 무선 랜카드(무선 네트워크 연결) IP Note1의 무선 연결의 IP 대역으로 맞추어주는 것으로 작업은 끝난다.

<
그림 51.JPG>

 

위의 화면과 같이 무선 네트워크 연결의 속성 창을 열고 TCP/IP IP Note1의 대역으로 맞춘다. 여기서 기본 게이트웨이를 Note1 IP로 맞추어야 한다는 것에 유의하자. 또한 IP 주소는 Note1의 무선의 IP 주소와 달라야 한다.

 

설정이 완료되면 이제 Note2에서 무선 Access Point를 검색해보자.

<
그림 52.JPG>

 

Note2에서 앞의 화면처럼 사용할 수 있는 무선 네트워크 보기를 선택하면 다음 화면과 같이 Note1의 무선 네트워크 연결에서 설정한 SSID가 보인다.

<그림 53.JPG>

 

여기에서 Note1 SSID가 오랫동안 보이지 않고 어느정도 시간이 흘러야 한다고 하는 인터넷의 자료들이 많았지만 그 이유는 Note1의 무선랜 설정 중 설정을 완료하고 Note1에서 해당 SSID에 연결을 하지 않았기 때문이 아닌가 생각된다. 나도 처음엔 너무 오랫동안 Note1 SSID가 잡히지 않아서 고민했었지만 Note1에서 해당 SSID를 찾아 연결을 하고나니 Note2에서 바로 Note1에서 설정한 SSID가 검색되었다.

 

이제 연결만 하면 된다. 다음 화면과 같이 해당 SSID를 선택하고 연결 버튼을 누르자.

<
그림 54.JPG>

 

연결 버튼을 클릭하면 네트워크 키를 물어본다.

여기에는 Note1의 무선 네트워크 설정 시 입력한 네트워크 키를 동일하게 넣어주면 된다.

틀리면??? 당연히 연결이 안된다.

 

<그림 55.JPG>

 

Note1의 무선 SSID에 잘 연결된 화면이다. 이제 Note1과 Note2 두대의 PC을 이용해 인터넷 공유기 혹은 AP 없이 웹서핑을 즐기는 일만 남았다.

 

두명이상이 동행하는 출장길에서 유용하게 사용할 수 있는 노트북의 무선 랜카드를 통한 인터넷 공유 설정법이다.


'Computer_language > Computer_care' 카테고리의 다른 글

msi 우분투 무선랜  (2) 2009.03.15
usb xp 설치  (0) 2009.03.13
웹2.0시대 많이 쓰이는 용어들(4)  (0) 2009.01.27
웹2.0시대 많이 쓰이는 용어들(3)  (0) 2009.01.27
웹2.0시대 많이 쓰이는 용어들(2)  (0) 2009.01.27
And

[Web플밍] PHP와 AJAX를 이용한 웹개발

|

PHPAJAX를 이용한 웹개발 [원문]

 

목차

Ajax 개요    
    Ajax

    
사용되는 기술에 대한 소개
    Ajax
의 장점과 단점
    
작동원리

XMLHttpRequest에 대해서
    
소개
    
레퍼런스
    
사용법
    
크로스브라우징

phpJavascript에서 XML 사용하기
    php
에서 XML사용하기
    Javascript
에서 XML 사용하기 

JSON 알아보기 

phpAjax를 활용한 프로그램

 

Ajax

개요

1. Jesse James Garrett20052월 ‘Ajax:A New Approach to Web Application’ 이란 에세이에서 처음으로 사용 됨

2. Ajax'Asynchronous JavaScript + XML'의 줄임말
    '
비동기  자바스크립트 XML‘ 

3. Ajax는 웹프로그래밍의 한 종류로 하나의 기술이 아니라
    
여러 가지 기술이 복합된 방법론  

4. Ajax는 자바스크립트 렌더링 엔진을 이용한 기술

 

사용되는 기술에 대한 소개

XHTML (extensible hypertext markup language )
        
하이퍼텍스트 생성 언어(HTML) 버전 4를 확장성 생성 언어(XML)를 적용하여 재구성한 것.

Javascript
미국의 넷스케이프커뮤니케이션사가 개발한 스크립트 언어.  

CSS (cascading style sheets )
        
하이퍼텍스트 생성 언어(HTML) 문서의 형태를 기술하기 위한 시트.  

DOM (document object model )
        
웹 브라우저를 통한 확장성 생성 언어(XML) 문서의 상호 연동을 위한

        
객체 기반의 문서 모델.

XML (eXtensible Markup Languag )
          
하이퍼텍스트 생성 언어(HTML)를 대체할 목적으로 월드 와이드 웹 컨소시엄(W3C)

          
표준화 작업을 진행한 페이지 기술 언어.

JSOM (JavaScript Object Notation)
         
경량화 데이터 교환형식

XmlHttpRequest
         
서버로 비동기 호출을 할 수 있음

 

장점과 단점

장점
          ActiveX
나 플래쉬를 상당부분 대체가능
          
페이지가 로드된 후 페이지를 동적으로 변화시키는 것에 적합
          
원하는 응답을 빠른 시간에 받을  수  있음
          
서버의 부하를 줄일수 있음
          
브라우져에 종속되지 않음

단점
          
리플래쉬시 모든정보가 사라짐
          
뒤로가기 버튼을 사용할 수 없음
          
즐겨찾기를 할 수 없음
          
디버깅이 어려움
          
클라이언트 에서 많은 로직이 처리되어야 함

 

작동 원리

    

 

     

 

XMLHttpRequest에 대해서

소개

  1. XMLHttpRequest는 로딩이 완료된 웹 페이지에서 자바스크립트 렌더링 엔진을 이용하여 다시 서버에 자료를 보내거나 받아오는 것을 가능 

  2. XML 이외의 다른 형태의 자료도 지원한 

  3. Javascript 렌더링 엔진을 이용함으로 브라우저에 종속되지 않음 

주의

XMLHttpRequest는 서로 다른 도메인에서는 작동되지 않음
    -
대부분의 브라우저에서는 요청후 중지되나 인터넷 익스플러러에서는
       
보안 경고 창이 나타나 사용자가 선택가능

래퍼런스

표준 매소드

abort()

현재의 요청

getAllResponseHeaders()

HTTP요청에 대한 모든 헤더를 키/값으로 반환한다.

getResponseHeader("header")

명시된 헤더의 문자열값을 반환

open("method","url")

서버 호출단계 "method" 아규먼트는 GET,POST,HEAD하나이고 URL아규먼트는 상대혹은 절대주소가 들어간다.

send(content)

요청을 서버로 보낸다.

setRequestHeader("Header","value")

명시된 값으로 헤더를 설정한다. 헤더에 값을 설정하기 전에는 반드시 open()메소드를 호출한다.

표준 프로퍼티

onreadystatechange

상태에 변경이 있을때 마다 실행되는 이벤트 핸들러

readyState

XMLHttpRequest가 요청한 상태를 반환

(0:초기화, 1: 로드중, 2: 로드됨, 3:처리중, 4:완료됨)

responseText

XMLHttpRequest 의 서버의 응답이 문자열로 됨

responseXML

XMLHttpRequest 의 서버의 응답이 XML로 됨,

파싱가능, DOM객체로 처리된다.

status

서버로 부터 받은 HTTP상태코드

(정상:200, 비정상:404(Page Not Found))

statusText

Http상태코드의 텍스트 버전(정상, 오류)

 

사용법

예제 1......

GET 방식으로 서버에 요청하기 

간당하게 XML파일을 가져오는 예제  

function handler(){
    if (req.readyState == 4) {
        if (req.status == 200) {
            if(this.responseXML != null)
                alert(this.responseXML.getElementById('test').firstChild.data );
            else
                alert(“None”);
          } else {
                alert("Problem: " + req.statusText);
          }
    }

var client = new XMLHttpRequest();
client.onreadystatechange = handler;
client.open("GET", "test.xml");
client.send();

 

예제 2......

POST 방식으로 서버에 요청하

function handler(){

    if (req.readyState == 4) {

        if (req.status == 200) {

            if(this.responseXML != null)

                alert(this.responseXML.getElementById('test').firstChild.data );

            else

                alert(“None”);

        } else {

                alert("Problem: " + req.statusText);

          }

    }

}

function ping(message) {

    var client = new XMLHttpRequest();

    client.onreadystatechange = function()

    client.open("POST", "/test.php");

    client.send(message);

}

 

크로스브라우징

표준웹브라우저에서 호출법
    var client = new XMLHttpRequest();
    client.onreadystatechange = handler;
    client.open("GET", "test.xml");
    client.send();

IE에서 호출법
    var client = new ActiveXObject("Microsoft.XMLHTTP");
    client.onreadystatechange = handler;
    client.open("GET", "test.xml");
    client.send();

 

phpJavascript에서 XML 사용하기

 

php에서 사용하기

SimpleXML
    SimpleXML
모듈은 사용자가 쉽게 XML문서를  객체화 시켜 사용 가능

    
요구사항 : PHP5    

XML
    James Clark
expat를 사용
.
    XML
문서를 처리할 수 있게 하지만, 유효성을 검증하지는 않음

    
요구사항 : PHP를 아파치 1.3.9 이상의 모듈로 컴파일
               expat
설치 => http://www.jclark.com/xml/expat.html

DOM
    XML
문서를 DOM API 로 제공함

    
요구사항 : java VM이 설치 되어있어야 함 (java VMJNI 생성하여 사용)

 

$xmlstr = <<
 
  
  
   
   Ms. Coder
   Onlivia Actora
   

   
   Mr. Coder
   
El Act'r
   
  

  
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  

  7
  5
 


XML;

SimpleXML 이용하기

 가져오기
$xml = simplexml_load_string($xmlstr);
echo $xml->movie[0]->plot;

 

XML 문서 생성하기
$xml = simplexml_load_string("");
$xml->movie->actor->age = '21';
echo $xml->asXML();

 

XML 이용하기

 가져오기
$xml_parser = xml_parser_create();
xml_parse_into_struct($xml_parser, $xmlstr, $vals, $index);
xml_parser_free($xml_parser);
$key=$index[PLOT][0];
echo $vals[$key][value];

 

DOM 이용하기
 
가져오기
$doc = new DOMDocument();
$doc->loadXML($xmlstr);
$allnodes = $doc->getElementsByTagName('plot');
$node = $allnodes->item(0);
echo $node->nodeValue;

XML 문서 생성하기
$doc = new DOMDocument("1.0", "UTF-8");
$root = $doc->createElement("movies");
$root = $doc->appendChild($root);
$elementname = $doc->createElement("movie");
$elementname = $root->appendChild($elementname);
$elementname1 = $doc->createElement("actor");
$elementname1 = $elementname->appendChild($elementname1);
$elementname2 = $doc->createElement("actor");
$elementname2 = $elementname1->appendChild($elementname2);
$elementname2->appendChild($doc->createTextNode("29"));

 

javascript에서 사용하기


:badtag -->

XMLHTTP


XML  읽어오기

 

 

JSON 알아보기


JSON
(JavaScript Object Notation)

    경량화 데이터 교환형식

    사람이 읽고 쓰기편함

    기계가 해석하기 용이
    
언어로부터 완벽하게 독립

JSON의 구조

    name/value 형태의 쌍으로 collection 타입

    값들의 순서화된 리스트

 

 

 

 

 

 

 

 기 본 예 제

 Javascript part

    



PHP part


    include ib/lib.php";

    $sql = "SELECT name FROM list WHERE `area`='".$_REQUEST[area]."' order by rand() LIMIT 9";

    $query = $db->query($sql,"su_member");

    while($data = mysql_fetch_array($query)){

     echo "

  • ". $data[name]n";

        }


    제공되는 형태


        서울지역

        

  • 정우천

        

  • 이인성

        

  • 정명재

        

  • 정봉수

        

  • 윤동순

        

  • 유종훈

        

  • 노권수

        

  • 오정석

        

  • 김정석


    실행 링크

        javascript:retrieveURL('http://www.superuser.co.kr/home/lib/area.php?area=서울')">





  •  phpAjax를 활용한 프로그램

     

    프로그램 시나리오

        로드 이후 서버에서 환경 설정값 요청 및 받음

        최근게시물 형태의 위젯의 위치 및 크기 정보 적용

        Javascript를 이용하여 브라우져의 이벤트 캡쳐

        위젯이 drag & drop으로 위치 이동 가능

        최종 이동위치에 대한 좌표값 축출

        축출된 좌표값을 서버로 전송

        전송된 좌표값 DB에 저장

        새로 지정된 좌표값 클라이언트에 전송

        전송받은 값으로 레이어 위치 재정렬






    환경설정

    소스

    include_once "../lib/json.php";

    include_once "../lib/db.config.php"

    $query = mysql_query("select * from myp where cid='locli' order by no");

    $i=0;

    while($data = mysql_fetch_array($query)){

    $count=count($ENVS[$data[gid]]);

    $ENVS[$data[gid]][$count] = array('width'=>$data[width],'height'=>$data[height],'xpos'=>$data[xpos],'ypos'=>$data[ypos],'names'=>$data[names]);

    }

    $JSON = new Services_JSON();

    echo $JSON->encode($ENVS);

    ?>


    리턴 파일 형식

    {"data":

    [

    {"idx":"locli.search.linux",

    "link":"/home/lecture/index.php?cateNo=&secNo=&theNo=&leccode=36",

    "subject":"u2592 5. RedHat 9 (APM(Apache Php Mysql) uc124uce58 ubc0fuc6b4uc601)"}

    ,{"idx":"locli.search.linux",

    "link":"/home/lecture/index.php?cateNo=&secNo=&theNo=&leccode=33",

    "subject":"u2592 2. RedHat 9 uc124uce58ud6c4 uae30ubcf8 uc14bud305"}

    ,{"idx":"locli.search.linux"

    ,"link":"/home/lecture/index.php?cateNo=&secNo=&theNo=&leccode=788",

    "subject":"APM uc124uce58 ubc0f uc124uc815(1.3.9)"}

    ,{"idx":"locli.search.linux",

    "link":"/home/lecture/index.php?cateNo=&secNo=&theNo=&leccode=32",

    "subject":"u2592 1. Redhat 9 uc124uce58(2/2)"}

    ,{"idx":"locli.search.linux",

    "link":"/home/lecture/index.php?cateNo=&secNo=&theNo=&leccode=5",

    "subject":"u2592 1. RedHat 9 uc124uce58(1/2)"}

    ]

    }

    서버에 환경 설정 요청


    function createXMLHttp(str){

    if(window.ActiveXObject){

    if(!str) xmlHttp = new ActiveXObject("Microsoft.XMLHttp");

    }else if(window.XMLHttpRequest){

    if(!str) xmlHttp = new XMLHttpRequest();

    }

    }


    function getENV(){

    url = 'runMy/Env.php';

    //url="XMLSchema/env.xml";

    createXMLHttp();

    xmlHttp.open("POST",url,true);

    xmlHttp.onreadystatechange = setENV;

    xmlHttp.send(null);

    }


    function setENV(){

    if(xmlHttp.readyState == 4){

    if(xmlHttp.status == 200){

    var results = xmlHttp.responseText;

    var obj = results.parseJSON();

    for(i=0;i

    inputENV(obj.search[i],'search');

    }

    }

    }

    }


    function inputENV(obj,str){

    document.getElementById('hiddenLayer').innerHTML=document.getElementById('hiddenLayer').innerHTML+"


    "+obj.names+"
    ";


    }









    파이어폭스에서의 마우스 드래그 앤 드랍 및 이벤트 캡쳐

    document.captureEvents(Event.MOUSEDOWN);

    document.onmousedown=mousdownMo;

    document.captureEvents(Event.MOUSEMOVE);

    document.onmousemove = moveing

    document.captureEvents(Event.MOUSEUP);

    document.onmouseup = mousupMo;



    function mousdownMo(event){

    if (event.which !=1){

    return false;

    }else{

    if(event.target.className == "drag") {

    mousdown = true;

    x = event.clientX;

    y = event.clientY;

    }

    }

    }

    function mousupMo(event) {

    mousdown = false;

    }

    function moveingMo(event) {

    if(mousdown) {

    var distX = event.clientX - x;

    var distY = event.clientY - y;

    event.target.style.left =parseInt(event.target.style.left) + distX;

    event.target.style.top = parseInt(event.target.style.top) + distY;

    x = event.clientX;

    y = event.clientY;

    return false;

    }

    }



    Internet Explorer에서의 마우스 드래그 앤 드랍 및 이벤트 캡쳐


    document.onmousedown = mousdownIe;

    document.onmouseup = mmousupIe;

    document.onmousemove = moveingIe;



    function mousdownIe() {

    if(event.srcElement.className == "drag") {

    mousdown = true;

    x = event.clientX;

    y = event.clientY;

    }

    }

    function mousupIe() {

    mousdown = false;

    }

    function moveingIe() {

    if(mousdown) {

    var distX = event.clientX - x;

    var distY = event.clientY - y;

    event.srcElement.style.left =parseInt(event.srcElement.style.left) + distX;

    event.srcElement.style.top = parseInt(event.srcElement.style.top) + distY;

    x = event.clientX;

    y = event.clientY;

    return false;

    }

    }



    .drag { position: absolute; cursor:move }






    Javascript Part


    function setpos(xpos,ypos,idx){

    if(idx != ""){

    url = 'runMy/setpos.php?xpos='+xpos+'&ypos='+ypos+'&idx='+idx; xmlHttp='';

    createXMLHttp();

    xmlHttp.open("GET",url,true);

    xmlHttp.onreadystatechange = setpost;

    xmlHttp.send(null);

    }

    }


    function setpost(){

    if(xmlHttp.readyState == 4){

    if(xmlHttp.status == 200){

    ..

    }else{

    alert(xmlHttp.responseText);

    }

    }

    }



    PHP Part


    $data = explode(".",$_REQUEST[idx]);


    mysql_connect("localhost","su","dlfmsdkcla");

    mysql_select_db("test");


    mysql_query("update myp set xpos=".$_REQUEST[xpos].",ypos=".$_REQUEST[ypos]." where cid='".$data[0]."' AND gid='".$data[1]."' AND names='".$data[2]."'");


    if(mysql_error()){

    echo "500";

    }else{

    echo "ok";










     PHP based Ajax Frameworks

     AjaxAC

    AjaxAC is an open-source framework written in PHP, used to develop/create/generate AJAX applications. The fundamental idea behind AJAX (Asynchronous JavaScript And XML) is to use the XMLHttpRequest object to change a web page state using background HTTP sub-requests without reloading the entire page.

    Homepage: http://ajax.zervaas.com.au

     

    XOAD

    XOAD, formerly known as NAJAX, is a PHP based AJAX/XAP object oriented framework that allows you to create richer web applications.

    Homepage: http://www.xoad.org
    Documentation:
    http://www.xoad.org/documentation/source/
    Demo: http://www.xoad.org/examples/

     

    PAJAJ

    What is the PAJAJ framework, it stands for (PHP Asynchronous Javascript and JSON). It is a object oriented Ajax framework written in PHP5 for development of event driven PHP web applications.

    Homepage: http://sourceforge.net/projects/pajaj/
    Documentation: http://www.wassons.org/pajaj/public/docs/index.php

     

    Symfony

    A PHP 5 Development Framework inspired by Rails. It has integrated database abstraction and support for AJAX. Installation is fairly easy. Symfony is aimed at building robust applications in an enterprise context. This means that you have full control over the configuration: from the directory structure to the foreign libraries, almost everything can be customized. To match your enterprisedevelopment guidelines, symfony is bundled with additional tools helping you to test, debug and document your project.

    AjaxBlog: http://ajaxblog.com/arc.application-in-php-in-minutes-with-symfony

    Homepage: www.symfony-project.com
    Documentation:
    http://www.symfony-project.com/content/documentation.html
    http://www.symfony-project.com/trac/wiki 



    XAJAX

    xajax is an open source PHP class library that allows you to easily create powerful, web-based, Ajax applications using HTML, CSS, JavaScript, and PHP. Applications developed with xajax can asynchronously call server-side PHP functions and update content without reloading the page.

    Homepage: http://xajax.sourceforge.net/

     

    PEAR:: HTML_AJAX

    Provides PHP and JavaScript libraries for performing AJAX (Communication from JavaScript to your server without reloading the page)

    Homepage: http://pear.php.net/package/HTML_AJAX
    Documentation: http://pear.php.net/package/HTML_AJAX/docs

     

    Flexible AJAX

    Flexible Ajax is a handler to combine the remote scripting technology, also known as AJAX (Asynchronous Javascript and XML), with a php-based backend.

    Homepage: http://tripdown.de/flxajax/
    Demo: http://tripdown.de/flexible_ajax_example.php

    http://blog.naver.com/limhy0128/60032877868 


    And

    영화

    |
    회신번호없음 님의 말 (오후 04:25) :
    [씨즐]커피n무비 이벤트 영화예매권도착! FS0953574267 유효기간04월17일
    회신번호없음 님의 말 (오후 04:25) :
    [씨즐]커피n무비 이벤트 영화예매권도착! EX7168018236 유효기간04월17일
    회신번호없음 님의 말 (오후 04:25) :
    [씨즐]커피n무비 이벤트 영화예매권도착! MI7687330198 유효기간04월17일
    회신번호없음 님의 말 (오후 04:25) :
    [씨즐]커피n무비 이벤트 영화예매권도착! VC6024709418 유효기간04월17일

    'My_life > Prattle' 카테고리의 다른 글

    고민..  (0) 2009.02.20
    웃긴.. 풋.. 미국 부부싸움 시리즈...  (0) 2009.02.03
    취업사이트  (0) 2009.01.28
    취업 면접시 필패(必敗)하는 질문 10개  (0) 2009.01.21
    자아검색  (0) 2009.01.11
    And

    영어 공부 사이트

    |

    Business English Pod   http://businessenglishpod.com/ 
    The Business English Podcast for Workplace English Trainin이라는부제에서도 있듯이 영어학습을 위한 비지니스 팟 캐스트입니다. 비지니스관련 아티클과 영어듣기 음성 파일이 제공 
    LoutLit.org   http://www.loudlit.org/collection.htm 
    소설이나 시를 웹에서 바로 듣기와 읽기가 가능한 사이트 
    Archive  http://www.archive.org/
    오디오북이나
    책 뿐 아니라 저작권이 공개된 영화와 음악도 무료로 제공
    LibriVox  http://librivox.org/
    자원봉사자들이
    녹음한 무료오디오북 제공

    Wired for Books  
    http://wiredforbooks.org/
    poems, stories, plays, essays, lectures, and interviews for children and adults.
    아이들을 상대로 이야기를 천천히 쉽게하고 그림과 이야기 내용도 슬라이드 형태로 보여주기에 듣기 훈련을 하는데 좋다.

    Voices in the Dark 
    http://voicesinthedark.com/
    무료
    오디오북제공

    Project Gutenberg 
    http://www.gutenberg.org/wiki/Main_Page
    엄청난
    양의 책을 무료 텍스트와 오디오로 제공

    Assistive Media 
    http://www.assistivemedia.org/
    New Yorker
    같이 유명한 잡지의 글들을 MP3 파일로 제공

    영어회화사전  http://www.jsenglish.com/conver/conver.htm
    speaking Xpress
    내용 일부분만을 정리해 놓은 것으로 speaking Xpress에서는 듣기, 따라하기, 말하기 반복학습 기능까지 제공
    페이지에서는 텍스트만 있다.

    Just Vocabulary 
    http://justvocabulary.libsyn.com/
    하루에
    2단어씩 설명과 예문, 동의어와 반의어를 방송한다. 단어 수준이 높지만 천천히 또박또박 설명해주기에 듣기에는 무리가 없다. 홈페이지보다는 RSS 리더를 통해서 구독하면 더욱 편리

    Radio Diaries 
    http://www.radiodiaries.org/
    미국의
    라디오방송으로서 다양한 주제별로 Script함께 방송을 들을 있다. 대화체형식으로 되어있어 미국의 문화를 익히기에도 좋다.

    Grammar Girl’s Quick and Dirty tips for better writing 
    http://grammar.quickanddirtytips.com/
    Grammar Girl
    영작할범하기 쉬운 실수나, 문법적 오류 등을 설명해준다. 초보자에게는 부담스러운 속도로 읽어주나 스크립트와 오디오파일이 제공되어 영어 듣기 공부에도 많은 도움이된다. RSS 피드도제공.

    Voice of America Pronunciation Guide 
    http://ibb7.ibb.gov/pronunciations/
    Voice of America
    제공하는 발음가이드. 세계주요인물, 국제기구/단체등의 발음기호와 함께 사운드도 리얼미디어파일로 들어볼 있다
    VOA홈페이지에서는 다양한 뉴스를 MP3 파일로 받을 수 있음
    And

    msi 우분투 무선랜

    |

    넷북인 NC10이나 제 동생이 사용 중인 MSI 노트북.. 및 atheros 5xxx 시리즈를 가지고 계신 분이 많을 줄로 압니다. 저 역시 넷북인 NC10에 atheros ar5007eg가 붙어있어서 삽질 좀 ㅎㅎ

    8.10부터는 백포트 모듈에서 바로 무선랜을 잡을 수 있는데;; 문제는 이걸로 무선랜을 잡고 트랜스미션이나 델루즈로 토렌트 파일을 받으면 접속자 수 때문에 연결이 끊겼다가 다시 접속 됐다가;; 맘대로;;

    그리고 ndis+gtk 인 wrapper로 잡으면 윈도 드라이버로 쉽게 잡을 수 있지만, 종료가 제대로 되지 않는 단점이 생깁니다 --;;

    그래서 올립니다. 아래에 설명이 나가겠지만, 저 곳엔 매일 매일 파일이 갱신됩니다. 하지만, 맨날 그 내용이 변하지는 않습니다.
    한가지 버그가 있습니다. 그건;; 무조건 무선 수신율이 100%로 나온다는거 ㅎㅎ 기분 좋은 버그 인가요?

    그럼 이제 아래와 같이 해보세요~~

    ====================================================================================

    우선 여기서 파일을 다운 받습니다. 아무거나 받으셔도 됩니다.


    그리고 터미널을 열고 아래를 한 줄 씩 복사해서 붙여넣기 하세요~

    tar -jxf compat-wireless*.bz2
    cd compat-wireless*
    sudo make install
    sudo make unload
    sudo make load


    참 쉽죠? 도움이 됐다면 추천~ ㅋ

     

    출처 : http://hitme.kr/entry/a5k-in-ubuntu?category=2

    And

    usb xp 설치

    |



    지난 시간에는 USB로 DOS 부팅 USB 만들기를 해봤습니다.

    ODD가 없고 Ghost 이런걸 쓸려면 꼭 필요한 것들이죠.

    이번에는 S5에 설치된 XP Home Edition 대신에 XP Professional Edition을 설치할려고 합니다.

    만약에 외장 ODD (CD/DVD) & USB 허브 & 설치 CD가 있다면 그냥 연결해서 설치하시면 되지만...

    만약에 S5에 연결한 외장 ODD가 없다면....어떻게 할까요?

    방법이 있습니다...USB에 OS 설치 영역을 심어주시면 됩니다.

    그럼 지금부터 하나씩 알아보도록 하겠습니다.

     

    먼저 첨부파일에서 3가지 파일을 다운 받으신 후에 아무 폴더에 압축해제 합니다.

     

     

     

    그런 후에 petousb의 폴더에 있는 PeToUSB.exe 파일을 usb_prep8 폴더로 복사해서 붙여 넣습니다.

     

     

    다음 usb_prep8.cmd 화일을 실행합니다. (그냥 더블 클릭~~)

     

     

    DOS창이 뜨고 아무키나 입력하게 되면....

    아래와 같이 해당 USB의 포멧을 시작합니다.

    (반드시 USB 안의 자료들은 백업해 두시길.....)

     

     

    Start를 시작하면 포멧을 시작하고 끝난후에 확인을 클릭하면 DOS 창 화면이 바뀝니다.

     

     

     

    여기서 중요한건...이창은 절대로 끄면 안됩니다.

    이 창에서 중요한건 1번/3번입니다. (4번은 그냥 실행)

    순서상 1-3-4로 가면 되는데....4번 전에 해야할 일이 부팅 섹터를 만들어줘야합니다.

    1-3번 작업  후에 하셔도 되고...먼저 하셔도 됩니다.

     

    저는 1번/3번부터 먼저 했습니다.

     

    1번을 선택하면 아래와 같이 XP Setup Source가 들어있는 드라이브를 선택하시면 됩니다.

     

     

    2번은 USB로 넘기기 전에 가상 드라이브로 복사하는 것인데..

    따로 선택하지 않으셔도 됩니다.

    3번을 입력하면 현재 USB가 들어있는 Drive를 선택하라고 합니다.

    저는 USB가 I: 드라이브에 있어서 I를 넣어줬습니다.

     

     

    여기서 4번을 누르면 안됩니다.

    부팅섹터를 넣지 않았으니깐요...^^;;

    이창은 그대로 둔 상태에서 시작-실행-cmd를 눌러 줍니다.

     

     

     

    아래와 같은 DOS 창이 뜨고...

    방금 전에 압축 해제한 bootsect 디렉토디로 들어갑니다.

    간단한 DOS 명령어는....

    cd XX - XX라는 하위 디렉토리로 이동을 쓰시면 됩니다. (cd bootsect - bootsect 라는 디렉토리로 이동)

    cd .. - 바로 상위 디렉토리로 이동하는 명령어

    이정도는 아실듯...^^;

    이동 하신 후 bootsect.exe /nt52 I: 를 입력합니다.

    (이 때 I는 USB Drive로 위에서 와 같습니다.)

     

     

     

    성공하면 아래와 같이 메세지가 출력 됩니다.

     

     

     

    그럼 이 DOS 창은 닫고..

    이전에 두었던 usb_prep8.cmd 창으로 돌아갑니다.

    그리고 4번을 눌러줍니다.

     

     

     

    이후로는...여러가지 말들이 나오는데..

    그냥 y나 아무키를 눌러주시면 됩니다.

     

     

    지루한 복사가 끝나고...

    USB로 부팅+XP 설치 이미지를 심는데...꽤나 오랜  시간이 걸립니다.

    컴이 떨어지거나 USB 속도가 느리면 더욱더요~~

    우째든 추후에 나오는 메세지는 Yes 하시면 됩니다.

     

     

     

     

    완전히 설치가 끝나면 DOS 창을 닫고...

    USB를 열어보면....아래와 같이 부팅+XP 설치 USB가 만들어 졌습니다.

     

     

     

     

    제 경우는 Wi-Fi 랜이 안잡히더군요.

    디스크 있음으로 해도 마찬가지....ㅋ

    아무래도 설치중에 이상이나....양산용 보드가 아니라서 생기는 문제일 수 있을듯 합니다.

    우째든 중요한건 XP 설치용 USB를 만드는 작업이니...^^;; 


    And

    스타크래프트 브루드워, USB로 실행하기

    |

    좀 오래된 정보지만 스타크래프트를 USB 메모리에서 실행하는 방법입니다.  1.15.2 버전 이후로 노씨디 크랙도 필요 없어져 아주 간편하게 USB로 담을 수 있네요. 스타가 설치 안 된 PC에서도 꼭 즐겨야 한다고 생각하는 분들만 한번 해보시길.. –_-;


    준비물

    • USB 메모리 (1GB 이상 추천)
    • 스타크래프트 브루드워 CD 또는 ISO 이미지

    1) 스타크래프트 오리지널과 브루드워를 하드디스크에 설치합니다.


    2) 설치를 마치면 배틀넷에 접속하거나 패치를 다운로드 받아 최신 1.161 버전으로 패치합니다.


    3) 레지스트리 편집기를 오픈 합니다. (시작 – 실행 – regedit)

     


    4) HKEY_LOCAL_MACHINE\SOFTWARE\Blizzard Entertainment\Starcraft 폴더를 우클릭 하고 ‘내보내기’를 선택합니다. ‘내보내기 범위’를 ‘선택한 분기’에 체크하고 적당한 파일이름과 위치를 선택해 저장합니다.

     


    5) 내보낸 레지스트리 파일을 메모장으로 열고 붉은색으로 마크된 라인을 찾아서 다음과 같이 바꿔주세요. 만약 마크된 항목이 없다면 추가해 주시고 모든 편집이 끝났으면 다시 저장합니다.

    "Program"=".\\Starcraft.exe"
    "StarCD"="."
    "PathData"=".\\StarDat.mpq"

     


    6) 스타크래프트 CD에 있는 INSTALL.EXE 파일을 스타크래프트가 설치된 폴더로 복사해서 이름을 Broodwar.mpq 파일로 바꿔줍니다.


    6) 이제 USB 메모리를 꼽고 하드디스크의 스타크래프트 폴더를 USB로 전체 복사합니다. 또 위에서 만들었던 screg.reg 레지스트리 파일도 같이 복사해 줍니다. (전체 용량이 660MB 정도 되는 만큼 만약 1GB 미만의 USB 메모리라면 이 과정을 생략하고 노씨디 패치와 install.exe 립버전을 구해 USB 메모리에 넣어줍니다. 그리고 Map 폴더 용량이 21MB 정도 되는데 용량을 더 아끼고 싶다면 Map 폴더 안의 파일을 지우고 본인이 원하는 맵 파일만 넣어도 됩니다.)

     



    모든 과정을 잘 마쳤으면 이제 실행을 해봐야겠죠!!

    1) USB 메모리를 PC에 연결합니다.
    2) screg.reg 파일을 더블클릭 합니다.
    3) StarCraft.exe 파일로 게임을 실행합니다.


    아주 잘 되는군요.. ^_^


    And

    이런 저런 영어 학습 방법

    |

    오늘도 출근 길.. 지하철에 자리잡고 바로 졸고 있는 내 손엔 CNN교재가 들려 있으니..

    25살 신입사원과 사회와의 치열한 싸움이.. 하하 ^^;;

     

    고가 해외 수입품으로 내츄럴하여 안정성이 검증된 초강력 수면제인 영어!
    PMP단어학습, 온라인 영어 강의, 5분 보면 네이티브된다는 거짓 책까지... 

    모든 수단을 다 동원해 공부하고 교환학생까지 다녀왔건만..

     

    한국 온지 2년 만에 입안에서 꼬물대는 것은 한낱 혀요, 입 밖으로 터져 나오지 않는 것은 영어이니라… (oh my ..) 

    외국계에서 일하며 클라이언트들과 비즈니스 톡을 해야하는 나는 죄인이될 뿐이고..

    전화가 울리면 던져버리고 싶고! 영어와 고군분투하는 사람들을 위한 도움상회는 없나요?

     

     

    “국민과목 영어와 싸우느라 힘드셨죠?

    머리는 굳어가는데 공부할 시간은 없고 진급 때마다 영어가 발목 잡으면.. 어휴~ .”

     

    “가입 즉시1급 지도사들이 직접 나서서 공부에 방해가 되는 방종에 정신이 번쩍 들도록

    귓방맹이를 날려드립니다.”

     

    “월 구천구백원에 꿈에서도 영어로 품격 있게 나불댈 수 있도록 도와주는 고품격 영어달인서비스!” 

     

     

    이런 제게 30년 노하우의 영어 달인, S기업 임원이셨던 아버님께서 잉글리쉬 바이블을 주시니(아빠..왜 이제야..)

    그 놀라운 시크릿을 오늘도 끈질기게 영어 공부하시는 많은 분들과 나누고자 합니다.

     

     

    생활 속의 언어, CNN, AP News등 영어뉴스 수시로 듣기

     

    아버지가 4년 간 사우디에서 근무하시던 때, No.1 영어학습 도구는 TV였다고 합니다. 제대로 듣기는 영어의 기본이라 하시며,

    정년퇴임 후에도 CNN 뉴스를 통해 listening과 speaking을 한결같이 연습하시는 진정 달인의 모습

     

     

      
    미국에서 공부하는 친구도 TV만큼 좋은 교재가 없다고... 

    수업 듣고 과제하는 것으로 작문은 느는데 회화는 여전히.. 그래서 항상 TV를 켜 놓고 산다는 것.

     

    TV만큼 언어발달에 도움되는 매체도 없다고 생각합니다.

    특히 외신 뉴스 강추입니다. 국내에는 AFKN, BBC 등의 채널이 제공되고 있는데요

    CNN헤드라인 뉴스까지 CJ미디어와 IPTV myLGtv에서 제공해 놀랐습니다. 국내에도 이젠 안 들어오는 채널이 없는 듯..

     

    영어로 뉴스를 들으며 발음을 교정하고, 세계 각 국의 소식을 빠르게 접하니 일석이조가 아닐까요?!

     

     

    Fluent Speaker? 외국어엔 장사없다. 기초회화는 늘 ReeeeeeeeeeeeeeeeeMIND!

     

    30년 넘게 공부했어도 출장 전엔 always 기본 회화부터 remind하시는 아버지.

    기초라고 얕보지 말고 계속 remind해줘야 자연스럽게 대화가 가능하다고 강조하십니다.

    허나, 최근엔 기초 영어책을 들고 다니기 멋쩍어하시는 아빠(^^::), 이런 아빠를 위해 제가 추천한 것은  아이팟입니다.

     

     

      

    요즘 지하철에서도 눈에 자주 띄는 아이튠즈의 팟캐스트는 아이팟 유저를 위한 혜택인데요.

    ESL(English as Second Language)과 미국 백악관이 제공하는 President Obama’s Weekly Address 등이 영어 공부에 좋다고 하네요.

    여기에 웹사이트에서 제공하는 다이얼로그를 프린트하고 다운로드한 팟캐스트를 들으면 완벽!  WOW!

    이젠 언제 어디서든 해외 콘텐츠를 통해 공부할 수 있습니다. (실은 살짝 압박이기도^^ )

      


    한글 자막은 명대사를 우리말로 기억하게 할 뿐이고!

      

     

     

    최근 GRE공부에 지친 저에게 아버지가 영어 자막 영화와 미드를 권하셨습니다.
    문법과 formal English는 공부해서 늘지만, 일상 대화와 정서는 바로 영화나 미드로 배울 수 있다는 말씀. 재미 + 학습까지~

     

    한글 자막은 리스닝을 동시에 한다고 하지만 한 순간 자막에만 몰두 하고 있는 자신을 발견합니다.

    영어 공부하신다면 무자막 또는 영문 자막으로 보세요. 처음엔 힘들지만. 곧 한국어로 오역된 것까지 눈에 뵈고 재미가 쏠쏠합니다. 

     

    자막 선택 기능은 PC로 다운받아 보면 보통 되지요^^

    요즘 실시간 방송된다고 해서 갈아탄 IPTV myLGtv도 자막 선택이 되더라구요.

    세기의 명작 이터널선샤인이 있길래 영문 자막으로 한번 더 봤습니다. (아직 자막없이 보긴 초콤 힘이 딸립니다)

    한글 자막으로 볼 때와 느낌이 사뭇 다름^^
    자막 속도 조절도 되서 좀 느리게 들으면서 대사를 (멋있는 척하며) 따라해보기도 합니다. 

     

     

    또 한가지! IPTV에서 myPC라는 디빅스 플레이어 기능이 있어 벽걸이TV 속 미드를 감상할 수 있습니다.
    케이블 미드는 한글자막이지만 myPC는 자막선택 가능~  영어 공부 핑계로 히어로즈를 봅니다. ^^
    영어자막과 함께 받아서 보고, 국내 미방영인 보스턴 리갈 시즌4도 함께 보고 있어요.

    GRE 수업 들으면서 알게 되었는데 (GRE 단어가 나온다며 몇 장면 보여주더라구요)

    보스턴 리갈의 주인공이 굉장히 정확하면서도 빠르게 대사를 친다고 ㅋㅋ

     


    한글 번역은 은근 잘못된 자막이 많습니다. 포 기브 미 = 제게 주세요?!  ㅎㅎ
    (사진은 잘못된 자막에 열 받은 블로거가 쓴.. 사일런트 힐 자막이라는데)
    그런 자막을 보는 것보다는 차라리 영어 원어로 보는 것이 났겠죠?

     


    다 읽으려 하지 말고 익숙하고 눈에 잘 뛰는 부분을 찾아보자

     

     

      
    자~ 지금까지 Listening과 speaking에 중심을 주었다면, writing을 위한 아버지의 시크릿!
    영자 신문과 소설! 좋은 문법책도 많지만.. 스토리 없음 진도 안 나간다고.^^ 정확한 문법구사를 위해 신문과 소설이 최고라고 합니다. 
     

    폼나는 뉴욕타임즈~ 사놓고 안 봤다고 스트레스 받지 마시고, 읽기 쉬운 헤드라인 먼저 읽어 봅시다!

    꽤 반가운 단어들이 눈에 띕니다. 또 신문에는 미국 생활용어를 실감나게 느낄 수 있는 PUN(말장난하다)이 많다고 합니다.

    PUN은 유사한 발음의 단어를 말 장난할 때 쓰는데, 신문에선 주로 풍자할 때 쓴다네요. PUN을 알면 그 나라 문화를 fully 이해하는 거라고..

    앞으론 영자 신문 볼 때 ‘왜 굳이 이 단어를 썼지?’ 하는 느낌이 들면, PUN인지, 그 안에 숨겨진 더리 시크릿(?)은 무엇인지 의심해보세요
     
    큰 맘 먹고 산 비싼 영문소설~ 책장만 지키는 것을 보면 맘은 아프고 읽긴 싫습니다. 영어 소설은 읽는 버릇이 중요하다고 합니다.

    저는 영어 소설 읽기에 강제성을 조금 더하기 위해 일주일에 2~3번 정도 회사 동료들과 스터디 하며, 오만과 편견 읽고 있습니다.

    처음에는 너무 어려운 것 아닌가 했는데  전반적 스토리를 알고 흐름을 이해하니 어렵지 않습니다.

    한 번 읽어 버릇하니 요즘은 혼자서도 (아주 가끔)읽곤 합니다. 

     


    Back To the Basic! 단어가 안 외워진다면 26번만 읽어주세요

     

     

    자자~ 어느덧 마지막 시크릿~ 단어가 안 외워진다면 26번만 반복해보라는 것이었습니다.

     

    언어란 오감을 활용해야 한다는 것이었습니다. 후각도 동원해서 영어의 냄시를맡으며..
    26번 발음과 뜻을 말하고, 눈으로 26번 스펠링을 보고, 26번 쓰기까지 한다면 어떤 단어든 기억된다고.

     

     

    이제 아셨겠지만, 아버지의 비결은 영어를 일상속에 늘 친숙하게 두는 것입니다.

    한글 배울 때 학교 가서 ‘ㄱ,ㄴ..’써서만 말하고 듣고 하는 게 아닌 것처럼,

    영어도 생활 속에 깊숙이 침투시켜 놔야 어느 날 입이 빵.. 하고 터진단 말씀!

    생활 속에 작은 것부터 실천해 보세요. 준비된 자에게만 기회가 온다고 합니다.

     

    And

    IOCP

    |


    처음이라 어떻게 시작해야 할 지 모르겠군요.
    저는 강좌를 제가 여러분들에게 무엇을 "알려드린다"기 보다 서버 제작시의 여러가지의 것들에 대해서, 사적인 이야기 하듯이 착각하기 쉬웠던 점이나 제작시에 어려웠던 점등에 대해서, 제가 먼저 얘기하고, 리플을 보며, 더 좋은 방법을 찾아가는 식으로 진행하고 싶군요.
    이곳에 고수분들이 많이 계시고, 아직 중수도 안 된 저로썬 그것이 최선의 방식이라 생각됩니다.

    먼저 저희가 제작할 서버는 아주 간단한 채팅 서버 입니다.
    사용자가 접속해서, 문자열을 1개 날리면, 접속한 모든 사용자에게 다시 문자열을 날려줍니다.
    (접속 처리부를 이용해서, 다른 기능으로 사용하실 수 도 있겠군요...손보셔야 할 게 많겠지만^^)

    먼저 저희가 만들 서버란 것에 대해서, 추상적으로 생각해 보죠.
    프로그램을 실행시키면, 일단 아무도 접속해 있지 않고 서버는 접속을 기달리고 있는 상태가 되겠죠?
    그러다가 1명이 접속을 시도하면, 서버에선 1개의 연결을 마련합니다.
    그렇게 100명이 접속하고, 100개의 연결이 현재 준비되어 있다고 생각해 봅시다.
    이중에 47번째 사람이 메세지를 날립니다. 서버는 메세지를 47번째 연결으로 부터 메세지를 하나 읽습니다. 그 메세지를 100명에게 차례로 날려줍니다. 그리고, 다음 메세지가 올것을 기달리고 있습니다.

    그럼 IOCP에 들어가기에 앞서, 몇가지(멀티 스레드, 비동기 I/O)에 대해 먼저 얘기해 볼까요?^^


    [멀티 스레드와 멀티 프로세서]

    클라이언트랑 다른 것이 멀티쓰레드 환경이라는 것입니다.
    클라이언트 제작시에는 동시에 함수가 2개가 실행된다는 생각은 안하고 짭니다만..
    서버는 함수가 중복되서, 실행될 수 있다는 거죠. 그래서, 동시에 2곳에서 실행되지 말아야 할 곳은 크리티컬 섹션이라는 것으로 감쌌습니다.
    (동시에 2곳에서 접근 못하게 해주죠...현재 누군가 접근해 있다면, 기달리고 있습니다.)
    멀티 쓰레드란 것중에 흥미 있는 거 몇개만 생각해 볼까여?
    먼저 멀티스레드를 이용하는 것엔 크게 2가지가 생각납니다.
    1. UI를 위해서
    - 예를들면, 워드프로그램에서 사용자가 글을 쓰고 있는 동안 짬짬이 맞춤법 검사를 할때
    2. 성능의 향상을 위해서
    - 일을 몇개를 중복해서, 시키면, 정말 쉴새없이 일하게 할 수 있죠...-_-;;(마치 저를 보는 듯..ㅠ_ㅠ)
      (근데, 일(Thread)가 너무 많아지면, 각 일을 하다가 다른 일로 바꾸는 데 걸리는 시간 때문에 결국 아무짓도 못하는 수가 있죠..^^..마찬가지로 서버에서 Thread가 넘 많아지면, 현재 작업 Thread를 계속 바꾸게 되서(Context Switching), 이 Context Switching에 시간을 더 잡아먹게 되죠. 배보다 배꼽이 크다고 할까요)
      Single CPU에서(단일 프로세서) Multi Thread일 필요는 없습니다.
      예를 들면, 10명(10 CPU)이 한 팀인데, 10가지 작업이 있다면, 각자 1작업이 있다면, 1 Time에 끝납니다.
      하지만, 혼자하는 작업(1 CPU)이라면, 순서대로 10개를 끝내는 것이 빠르지 동시에 10개를 시작해서, 이것하다가 조금있다가 저것하는 식으로 한다면, 더 느리겠죠?^^
      (이것하다 저것하다 하는 것을 context switching한다라고 합니다)
      대신에 가끔은 Multi Thread도 괜찮을 때가 있는데, 예를들면, 저희가 프린트 하는 작업과 청소하는 일이 있다면, 프린트 작업의 특성상 쉬는 시간이 많죠?(많은 문서를 프린트하고 있는 중간..)
    그 사이에 청소를 하는 건 좋겠죠? 마찬가지로 일의 특성에 따른 문제란 건데, 아무튼 CPU가 계속 바쁘게 돌아가는 일이라면, Multi Thread는 속도의 저하를 가져올 수있죠.
    서버에서 스레드를 쓰는 이유는 주로 2번때문이겠죠?
    일단 크게 착각할 수 있는 부분이 왜 서버에 멀티 스레드가 필요한가 인데, 착각의 대표적인 예가 "서버가 다중 접속을 받기 때문에 멀티 쓰레드를 쓴다"는 것이죠.
    그렇게 "할 수"는 있지만, 1개의 접속마다 Thread를 한개씩 돌린다면 1000명이 접속하면, 쓰레드 1000개가 돌아가야 한다는 소린데...설마 그렇게 무식하게 쓰지는 않겠죠?^^ 원칙적으로 서버에서 멀티 쓰레드를 쓰는 이유는 서버 같은 경우 CPU가 여러개인 경우가 많고, 그럴 경우 "CPU가 2개 이상일때, 효율적으로(CPU를) 부려먹기 위해서" 입니다.
    (뭐 listen해야 하기 때메 어짜피 멀티 스레드로 돌긴하겠지만...쩝...그 listen하는 스레드랑 저희가 앞으로 얘기할 멀티스레드상의 sync문제는 저희가 만든 스레드들이 한 코드를 공유할 때 생기는 문제점에 대해서, 얘기하는 거 거니깐요..)

    *멀티 스레드와 멀티 프로세서
    그냥 단일 스레드 프로그램을 멀티 프로세서에다 돌린다고 중복되서 실행되지는 않습니다. 멀티 스레드로 만들어 줘야 멀티 스레드를 효과적으로 사용할 수 있다는 것이죠.
    그리고, 단일 프로세서환경에서 멀티 스레드로 짜줘봤자 "동시에" 실행되는 건 아닙니다. 1프로세서(CPU)에서 "동시처럼" 쪼개서 실행되는 거죠^^
    멀티 프로세서에다가 단일 스레드 프로그램을 짜준다면, 1프로세서(CPU)를 제외하곤 아마 쉬고 있겠죠.
    글구 윈도우 자체는 멀티 스레드로 돈다는 거 잊지 마시고..

    *1곳에서만 실행되어야 하는 코드의 경우
    CRITICAL_SECTION이라는 것을 사용합니다.(사용법은 다들 아시겠죠?^^;;)

    [비동기 I/O]
    *I/O 개념 잡기
    네트워크 카드도 하나의 I/O일 뿐이다.(저같은 경우 처음에 이것을 이해하기 힘들었는데 다른분들은 어떠실지?)
    결국 네트워크 카드에 쓰고(Send), 읽고(Read)하는 거죠.
    여기서, Async I/O를 쓰게 되는 거구요.

    *Overlapped I/O
    개념은 별거 아닙니다. 저희 MP3 Player틀어놓구, 동영상 틀면, 소리 2개가 중복해서 동시에 들리죠?
    (긍까 자신의 일이 끝날때까지 자원을 잡아먹고 있는 것이 아니라 OS한테 주문만 하고, 어떻게 어떤 순서로
     처리할지는 OS한테 맡긴다고 보면 될까요?^^)
    걍 그렇게 중복되서 성능을 높이는 거 정도라고만 알아주세요^^
    (근데 예를 들어 파일을 열고, 동일한 위치에 "ABCD"라고 쓰라고 하고, 또 "1234"라고 쓰라고 했는데,
     OS가 "1234"부터 쓰고, "ABCD"를 쓰면, 저희가 원한 결과가 안나오겠죠?^^)

    *Async I/O(비동기 I/O)
    개념을 잡아보겠습니다.

    네트워크 통신도 I/O라는 것을 먼저 생각해 주시기 바랍니다.
    프린트하건, 그래픽을 표현하건, 컴퓨터 입장에서는 모두 I/O에 해당되죠.
    I/O에서 비동기적인 것은 필수죠.(I/O는 컴퓨터 입장에선 느린 편이니까요)
    예를 들면, 프린트 하면서, 딴 작업을 할 수 없다면, 무지 불편해 버리겠죠?

    직원(고씨) == Application (흠..저희 회사 사장님 성이 고씨 이십니다...--;...컴맹이십니다...죄송합니다 사장님)
    사장님 == Programmer

    *사장님이 직원에게 일을 시킵니다. 직원은 여러가지 일을 할 수 있는데 이렇게 시킨다고 합시다.(중복 I/O)

    1. 사장 : "어이~ 고씨. 틈나면, 프린트 1000장 해놓구, 커피 타다 놓구, 컴퓨터 100대 딱아놔~"
      (이렇게 여러개의 작업을 set시킵니다. 작업 순서는 고씨 마음이겠죠?^^)
    2. 고씨(application)를 async하게 일을 할 경우.
    - 프린트 1000장을 프린터에게 시켜놓구(set), 커피물을 올리고(set), 컴퓨터를 딱다가
      켜피가 끓는걸 알면,(notify) 커피타서, 사장님께 1잔 올리고,
      계속 컴퓨터를 딱다가 프린트가 1000장이 다 된것을 알게 되면(notify), 사장님께 갖다 드리고
      컴퓨터를 딱겠죠
    (커피를 언제 타가지고 올지 모릅니다...-_-;;)
    (대신 총작업시간은 최소화 되겠죠)

    * 동기적으로 일을 시키는 경우는 이렇습니다.(작업 하는 건 간단하죠)
    1. 사장 : "어이~ 고씨. 프린트 1000장 해와"
    2. 고씨 : "....-_-;..(..씨발)....(한참후에)....1000장 해왔는데요"
    3. 사장 : "목마르다 커피 타와라~"
    4. 고씨 : "....-_-;..(조까..)....(좀 있다가)...커피 드세요^^"
    5. 사장 : "...^-_-^...(끝난 줄 알았지??)...컴퓨터 100대만 딱아라 -_-"
    6. 고씨 : "....(한꺼번에 시키지 뭐하는 짓이냐?..-_-;...알았다).....알겠습니다^^"
    (매번 일이 끝난 것을 확인하고, 순서를 제어하는 것이 가능합니다.)
    (좀 느리죠??)

    비효율적이죠?^^...문제는 책에 있는 소스나 그런 서버들이 이런 방식으로 짜여져 있다는 것입니다.
    (뭐 일단 이해하기 좋으니깐요^^)
    서버는 최적화되게 짜야 하는데, 이런방식을 채택하고, 2-3 의 단계를 빨리 해주는 코딩을 해봤자 소용없는 짓이 되겠죠^^

    그럼 저희가 IOCP(async i/o)를 쓰기 위해서 어떤 것을 해주면 되느냐~!!
    먼저 우리가, set해주고, 딴일을 하고 있으면, I/O 완료시 OS가 notify해주죠.
    이 2가지를 잘 다루는 것이 IOCP의 사용법이라 생각됩니다^^.

    *동기적인 소켓과의 비교
    제일 비효율적인 것부터 소개를 해보죠(CSocket)

    1. CSocket (동기화)
    send나 recv를 쓰면, 블록킹 되다가 그것의 성공 여부까지 리턴해 줍니다.
    recv의 경우 메세지가 올때까지 기달려서, 온 메세지를 확실히 읽어주죠^^
    (set -> notify 시간 동안 기달려서, return합니다.)

    2. CAsyncSocket(넌블록킹)
    send : 그냥 보냄. 제대로 갔는지 안 갔는지는 모른다.
    recv : recv버퍼를 보고 없으면, false를 리턴하고, 있으면 데이터를 읽어온다.
    2가지 면에서 안 좋은데(제가 그냥 생각한 것입니다.)
    1. 언제 왔는지 모르니까 계속 함수를 불러줘야 한다.
    2. 이미 특정 위치에 data가 있는데, 다시 우리가 정한 문자열에 copy해 줘야 한다.
    (데이터를 읽어온다는 것이 생각해보면, 이미 컴퓨터의 임의의 위치에 데이터가 있는 데 그것을 다시 저희가 만든 프로그램의 저장위치(문자열)로 복사해 온다는 것이죠)
    2-1. recv함수가 실행중에 다른 data가 오면, 리시브함수가 안 불리는 것으로 알고 있습니다.
    2-2. 2개 이상의 CPU를 가진 컴퓨터일 경우. 컴퓨터는 10개의 cpu가 동시에 10개를 처리할 수 있음에두 불구하고, recv함수가 끝날때까지(1개의 data복사가 끝날때까지) 다같이 기달려야 하는 상황이 발생하는 것입니다. 그게 끝나면 다음 data를 복사하면서 또, 10개의 cpu가 기달리고요.
    결국 1개나 10개나 삐까삐까 해지는 것입니다.

    3. IOCP
    WriteFile : 틈나면, 이 위치부터 어느 크기 만큼 보내라고 set해줌.(진짜로 보낼때 그 데이터가 변해 있거나 메모리가 해제 되어 있을 수 있음)
    ReadFile : 메세지가 오면, 요따가 요만큼 쓰라고, set해줌. OS에서 요따가 요만큼 쓰고 나서 다 썻다고 하면(notify), 그 자리를 보면, 메세지가 기록되어 있음.

    [I/O Completion Port와 기존의 간단한 서버와의 비교]
    기존의 서버...간단한 CAsync, Async소켓과 비교해 보면,(Sync는 어짜피 서버로 쓰지 않겠죠...설마^^)
    1. 메세지가 오면,함수를 하나 실행시켜 줍니다. 하지만, 그 함수 안에서 Recv()라는 함수를 써야 겠죠?
    결국 이미 컴퓨터 안에 정보(문자열)가 있는데, 또 Copy하는 결과가 되겠죠.
    IOCP같은 기술의 경우 저희가 공간을 셋팅해주면, OS가 정보를 그따가 기록하고, 다 썻을 경우(Completion)함수에서부터 실행되게 되죠.


    처음 이 글을 올린다는 글을 1달도 전에 올렸었는데, 이제야 올리네요. 여러가지로 바뻐서 죄송합니다...ㅠ_ㅠ
    이제는 글을 1주일 간격으로 쭈르륵 올릴 생각입니다.

    참고 서적 : Programming Server-Side Application (Richter, Clark)

     

    먼저 글 들어가기 전에..

    고임님을 깜박했군요...(훗...고씨 == 고임님^^..을 생각하면서 썻을지도 모른다는 생각이 문득 드네요....^^)

    위에 3분 칭찬해 주셔서 고맙습니다....^^....오늘 떨면서, 데브피아에 들어왔는데,
    큰힘이 되었답니다...^^

    특히 최인호님...처음 IOCP 공부하려구 할때부터 지금까지 고맙습니다.
    인호님이 쓰신 글을 읽으면서 많은 도움이 됐습니다...(제 머리속에 있는 인호님 글을 제거해 낼 수가 없으니 나중에 표절이라구 하셔두 전 할말이 없겠군요...^^;;)

    오늘은 역시 통신의 여러가지 방법들을 쭉 보기로 하죠.
    사실 이부분 건너뛰고, IOCP API만 설명해도 쓰는데는 그렇게 지장이 없겠지만
    딴 사람들한테 아는 척 할려면, "이런 저런 것들이 있고, 이거의 장점은 요것이지!!"
    해야 되지 않겠어요^^....(근데, 이걸루 아는 척할만한 것두 아닌게 좀 흠이죠....-_-;;)
    참고로 더 자세히 알고 싶으시면, Server-Side Application 책을 보십시요
    (근데, 앞에 한 30page볼려구 7만원짜리 책사는 사람이 있을까요??...)
    (....그런 사람이 있군요......저....-_-;;)

    아마 이번(1)과 다음(2)으로 끝나지 않을까 생각합니다.

    IOCP로 채팅 서버를 만들자~

    ㄱ. IOCP의 기술에 대한 이해.

    1. 소켓 통신 방법 6가지.( sync, async, device, event, alertable I/O, IOCP)

    - 제일 먼저 Unix Network Programming의 그림 소개.
       Unix 계열에선 크게 5가지로 나누더군요. 일단 그림을 봐 주시죠.

    <그림을 보시면서, 생각하시면 좋은 것>
    1. 데이터가 왔는지 어케 알까?(그냥 함수에서 처리, select문 사용, OS가 직접 알려주기)
    2. OS에 온 데이터를 Application에서 그 내용을 어떻게 알것인가(일반적으로 recv를 사용. Application의 문자열에다 카피해옴)

    #그림 (제길...이런게 그림이라니...-_-;)

                  1.blocking     2.nonblocking    3.I/O multiplexing   4.signal-driven I/O   5.asynchronous I/O
                ---    |             check              check                                     initiate
                |      |             check                |                               
    wait        |      |             chack                |
    for         |      |b            check                |block
    data        |      |l            check                |
                |      |o            check                |
                ---    |c              |                ready             notification
                ---    |k              |b              initiate             initiate              (nothing)
    copy data   |      |e              |l                 |                    |
    from kernel |      |d              |o                 |                    |
    to user     |      |               |c                 |block               |block
                |      |               |k                 |                    |
                ---    *               *                  *                    *
                    complete       complete            complete             complete            notification
    일단 각각의 설명을 드리죠.
    1. blocking : 걍 readfrom()을 쓰면, 계속 기다리다가 데이터가 copy가 완성되면 return한다.
    2. nonblocking : 데이터가 있는지 계속 체크하면서 딴일하다가 데이터가 있으면, copy해 온다.(recvfrom)
    3. I/O multiplexing : select문을 쓰는 것으로 내부적으로 데이터가 왔는지 검사하다가 있으면 읽어온다.(select+recvfrom)
    4. signal-driven I/O : 데이터가 오면, OS자체에서 알려준다.(우리가 검사하지 않아도 된다)(OS에다 등록, recvfrom)
    5. asynchronous I/O : OS에다 "혹시 데이터가 오면, 이 공간에다 집어넣구 다 집어넣은 경우에만 나한테 알려라~" 라고 한다.(set, notify의 단계)

    그럼 여기서 어떤것이 왜 좋은지 볼까요??^^(좋기야 당연히 5번이 젤 좋지요)
    앞으로 크게 2부분에서 봅시다.
    1. 데이터가 왔는지 어떻게 아는 지와
    2. 데이터가 온 다음에 그 데이터를 써먹게 저희가 아는 곳에
    어떻게 저장시키는지 보지요.
    1. 다른 것들은 저희가(Application)에서 검사합니다.(select를 쓴다던가, recv()를 써서 성공여부를 검사한다던가...)
       But, Async에서는 OS가 알려줍니다.(딴것들은 OS가 알려주는 걸 체크하지요)
    2. 이미 내용이 컴퓨터안에 있는데, recv를 통해서 저희의 어플리케이션에다 copy해 옵니다.
       But, Async에서는 처음부터 저희가 지정해 준곳에다가 OS가 알아서, copy해 놓고 완료되면 저희에게 알려줍니다.

    - 윈도우에서 Async를 다루는 방법 4가지.(마지막이 IOCP입니다.

    윈도우에서 지원하는 Async는 크게 2가지 단계로 이루어져 있고, notify하는 방법이 4가지 입니다.
    1. OS에다가 "자료오면, 이따 써놔라~"(Set)
    2. 다쓰고 나면, OS가 어케 우리에게 "데이터를 다 써놨어요~^^"(Notification)

    1. 윈도우에서 Async의 방법 4가지다 Set하는 방법은 똑같습니다.
       ReadFile, WriteFile을 이용하죠, 마지막 인자인 OVERLAPPED* pOverlapped를 씁니다.
       이러면, "너 틈날때 내가 지정해준 작업(읽거나 쓰기) 해라~"고 OS에게 알려주는 것입니다.
       WriteFile( (HANDLE)m_sSocket, // 쓸 디바이스를 정해 줍니다.(당연히 소켓에서 읽어옵니다)
      (PVOID)g_stSend[m_i2].szSend,  // 쓸 내용이 들어있는 장소를 정해 줍니다.
      (DWORD)SEND_BUFFER,   // 쓸 크기를 정해 줍니다.
      (PDWORD)NULL,    // 실제 쓰여진 크기라 리턴 됩니다(IOCP에선 안 쓰입니다)
      (OVERLAPPED*)&g_stSend[m_i2]) // OVERLAPPED구조체를 넘깁니다.
       ReadFile((HANDLE)m_sSocket, // 읽어올 디바이스를 정해 줍니다. g_stRecv[m_i].szRecv, RECV_BUFFER, NULL, &g_stRecv[m_i])

    [overlapped 구조체]
    typedef struct _OVERLAPPED {
     DWORD Internal; // Error Code (Notify 될때 값이 채워져서 옵니다.)
     DWORD InternalHigh; // 전송된 크기(Notify 될때 값이 채워져서 옵니다.)
     DWORD Offset;  // 
     DWORD OffsetHigh; // 2개다 메모리 주소를 셋팅하는데, file i/o외엔 0으로 셋팅하라는 군요.
     HANDLE hEvent;  // IOCP에선 안 씁니다.
    } OVERLAPPED, *LPOVERLAPPED;
    이 overlapped로 notify시에 정보가 넘어오는데
    이 overlapped만으로 쓰기에는 가지고 있는 인자수가 작죠...예를들어 저희가 각 overlapped구조체마다 번호를 매긴다거나
    추가 정보를 덧붙여서 set해주고, notify시에 알고 싶을때가 있을 수 있습니다.
    그래서, 이 overlapped에서 상속 받아서 필요한 정보를 멤버변수로 설정해 주고, 그것의 pointer를 넘기는 방법이 있습니다.

    2. Notify하는 방법이 4가지가 서로 다른 데요.(딴거는 대충 이런 게 있나보다...만 하고 넘어가겠습니다.)
       1. Signaling a device kernel object : WaitForSingleObject를 사용(1인용...)
       2. Signaling an event kernel object : WaitForMultipleObject를 사용(이 함수자체가 64개가 끝)
       3. Using alertable I/O : CPU많으면 쓸모 없지만, 암튼 IOCP의 중간단계임.(죄송 설명이 귀찮아서..--;)
       4. Using I/O completion ports : Queue랑 Stack 같은 것을 사용.

    2. IOCP를 쓰는 이유(앞의 단점들을 보여주면서)

    IOCP에서는 데이터가 오면, 내부적으로 어떻게 처리하는 지 볼까요??^^(어떤 Struct들을 쓰는지 봐주세용^^)

    1. IOCP에서 쓰는 구조
     1. Device List : 관련된 소켓들을 이따가 기록해 놓습니다.
     2. I/O Completion Queue(FIFO) : I/O가 완료 됐을 때, 완료됐다는 메세지를 쌓아놓는 Queue입니다.
     3. Waiting Thread Queue(LIFO) : 대기중인 Thread 모아놓기.
     4. Released Thread List : 현재 돌아가구 있는 Thread들.
     5. Paused Thread List : 돌아가구 있다가 잠시 정지해 있는 Thread들.
    2. 돌아가는 거(개념적으로)
            1. 데이터가 오면, OS가 지정해 놓은 메모리 위치에 써놓구 notification을 2.I/O Completion Queue(IOCQ)에 올린다.
     2. IOCQ에 뭐가 들어오면, 3.Waiting Thread Queue(WTQ)에 대기된 Thread가 있는지 보고, 있다면
     3. WTQ에 대기된 Thread에 일을 맡긴다.
     4. 그 Thread는 WTQ -> Released Thread List(RTL)로 가게 된다.
     5. 혹시 작동중 Sleep등의 함수를 만나면, RTL->PTL로 이동했다가 RTL로 다시 돌아온다.
     6. 온 데이터에 대한 처리가 끝나면, 그 Thread는 다시 WTQ로 이동한다.

    그럼 여기까지가 이론적인 내용이었구요.

    실제로 IOCP기술을 이용하기 위해서, 알아야 할 함수들을 봅시다.
    1. IOCP를 1개 맹근다(리턴값이 IOCP HANDLE입니다.)
    m_hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, dwNumberOfConcurrentThreads);

    2. 1명 추가로 접속시마다 그 연결을 IOCP에 추가 시킨다.
    CreateIoCompletionPort((HANDLE)hSocket, m_hIOCP, dwCompKey, 0);

    3. Thread가 이 함수를 만나면, WTQ로 들어가고, data쓰기가 완료되면 OS에서 알아서 이 함수를 RTL로 보낸다.
    (lpOverlapped를 이용해서, 짝지워서 보내 줍니다.)
    GetQueuedCompletionStatus(m_hIOCP, // 어떤 IOCP에서 가져오냐?
       &dwIoSize,  // 얼만큼 가져 왔냐?
       &dwCompKey,  // CompKey
       &lpOverlapped, // 구조체 시작 주소 가져옴.
       INFINITE);

    * 실제로 코드에서 저는 이렇게 썼습니다.
    while(1)
    {
     bSuccess = GetQueuedCompletionStatus( m_hIOCP, // 어떤 IOCP에서 가져오냐?
          &dwIoSize,  // 얼만큼 가져 왔냐?
          &dwCompKey,  // CompKey
          &lpOverlapped, // 구조체 시작 주소 가져옴.
          INFINITE);
     // 이 GetQueueCompletionStatus에서 data의 읽기, 쓰기가 완료후 notify가 뜰때까지 기달립니다.

     lpOverlappedBasic = (OVERLAPPED_BASIC*)lpOverlapped; // 저희가 정한 구조체로 typecasting

     switch(lpOverlappedBasic->iMode) {
     case EVENT_READ: // Recv가 완료 됐을 때.
      // Recv 처리.
      break;
     case EVENT_WRITE: // Send가 완료 됐을 때.
      // Send 처리.
      break;
     default:
      break;
     }
     // 잠금 풀어줘야지~!
     lpOverlappedBasic->SetWriteableFlag(TRUE);
    }

    자세한 건 코드를 보시면 아실 껍니다...^^(앗 이런 무책임한 발언이...ㅠ_ㅠ)

    3. 조심할 점(메모리의 제대로 된 확보, Critical Section, Race condition)

    1. 메모리의 제대로 된 확보
    저희가 어떤 메모리를 OVERLAPPED를 통해서, 지정해 줄 때(set), set하는 시간이야 저희 코드안에 있지만,
    그 set한게 언제 끝날지 모르죠.
    틀린 예를 들어보겠습니다.
    VOID ReadData(HANDLE hfile) {
       OVERLAPPED o = {0};
       BYTE b[100];
       ReadFile(hfile, b, 100, NULL, &o);
    }
    원래는 o 라는 객체가 ReadFile이후에 계속 살아있어야 하는데, 함수가 끝나면, 사라지죠??
    글구, 저 함수에서는 Read하면, 그 메모리 주소에다가 쓸려고 할테고...런타임 에러 되겠습니다.
    (아무튼 함수가 불린 이후에도 메모리는 계속 살아있어야 하죠...)

    그렇다고...전역변수로 OVERLAPPED o = {0}라고 한다고 문제가 해결되는 거 아닙니다.
    확실히 메모리는 계속 확보가 되어있습니다만, 여러곳에서 o를 건드리면, 저희가 생각한 값이 아닌 값이
    들어있을 확률이 있죠.
    1. 저희가 WriteFile을 이용해서, o에다 data1의 시작 위치를 정해주고, 전송해라(set)합니다.
    2. 아직 전송이 안됐는데, WriteFile을 또 불러서, o에다 data2의 위치를 정해주고, 전송 시킵니다(set)
    3. 결국 실제로 데이터의 전송이 일어날때 보면, data1의 위치는 간데없고, data2가 2번 전송 됩니다.
    (각자 따로 o를 만들어서 안 쓰고, o를 1개 만들어서, 써서 문제가 일어나는 거겠죠)

    이 문제를 해결하는데 쓰인 저의 방법은 다음 문서에 올리겠습니다....^^(각자 생각해 보세요)
    (제가 쓴 방법보다 더 좋은 방법이 얼마든지 나울 수 있다고 생각합니다....^^)

    2. Critical Section
    위의 문제가 현재 o를 data1이 쓰고 있는데, 딴 놈이 건드린 경우죠??
    이런 경우를 막아주기 위해, CRITICAL_SECTION이란 것을 지원해 줍니다.
     CRITICAL_SECTION m_csListenSocket;  // 일단 1놈 만듭니다.

     InitializeCriticalSection(&m_csListenSocket); // 초기화 해줍니다.(걍 생성자에다가 넣어버리세요)
     DeleteCriticalSection(&m_csListenSocket); // 자원을 회수 합니다.(걍 소멸자에다가 넣어버리세요)
     EnterCriticalSection(&m_csListenSocket); // 이 놈을 쓸때 씁니다.
     LeaveCriticalSection(&m_csListenSocket); // 이 놈을 다 쓰고, 나올때 씁니다.
    예를 들어, 누가 Enter했는데, 딴 Thread가 어디서, Enter를 불렀다면, 뒤에 부른 놈은 먼저 부른 놈이 Leave를 불러서
    나오기까지 기다립니다.(쉽게 말해서, Leave를 제대로 안해주면, 프로그램이 멈출 수 있다는 겁니다.)

    3. Race Condition
    멀티 스레드로 돌아가다 보면, 동시에 1 스레드만 건드려야 할 것이 동시에 2개의 스레드가 자원을 공유하면서
    문제가 생길 수 있습니다. 값이 생각같이 안 나올 수 있죠.
    race condition : 동시에 2곳이 건드려서 문제가 생기는 것. 이라고 생각해 주세요(전 critical section을 써서 막아봤습니다)

    [출처] IOCP|작성자 multist


    And

    고민..

    |
    무언가 내가 하고싶은 부류를 하고 싶다는 것은 어떤 사람이든 같은 욕심일 것이다.
    여기 이번해 동안 할 수 있는 프로젝트들이 있다. 정말 멋진... 욕심나는...
    하지만 대학원에 적을 두고 있지 않고 하고 싶은걸 위해 그저 있는다는 것은 내 스스로에게 무책임한 것일까?
    뭐.. 원래 계획은 1년간 해외 봉사활동 및 배낭여행 그리고 리눅스 오픈 프로젝트 몇개 하고 싶은것들을 만들고 싶다는 것이었다.
    시간은 항상 무언가를 선택하게 만든다.
    부족한 영어실력.. 욕심나는 해외 대학원.. 그리고 무언가 만들어 보고 싶은 새로운 아이템들..
    주변에서 취업을 강요하는 듯한 지금의 분위기가 너무 싫고 힘들다.
    힘들다 힘들다 하지만.. 어디서 밥값 못한다고 생각 안하는 나이기에..
    항상 무언가를 찾아온 나..
    지금의 선택시점이 너무 힘들다.

    대학원.. 내 인상에 너무 많은 것들을 보게만든 메트릭스의 파란알약과 같은 존재이다.
    내 인생 장남이라는 현실의 책임이 솔찍히 크다.
    하지만 이 와중에 항상 도전의 선택에 힘을 보내주시는 부모님이 고맙고 미안하다.
    도전과 변화 그리고 창조와 성장이 늘 함께하는 인생이 되었으면 하기뿐이다.
    도전은 무섭지 않다. 실패도 무섭지 않다.
    다만 안주에 익숙해져 도태되고 합리화 되는게 두려울 뿐이다.

    선택! 그 어떤 길을 선택하던 내 머리의 끝에는 항상 태양이 존재하고 있을 것이기에
    난 그 길의 끝을 보며 꾸준히 걸을 것이다.

    짝누나 화이팅!!!! 힘들면 웃고 말자고~ 하하하하핫 ^^V



    'My_life > Prattle' 카테고리의 다른 글

    영화  (0) 2009.03.18
    웃긴.. 풋.. 미국 부부싸움 시리즈...  (0) 2009.02.03
    취업사이트  (0) 2009.01.28
    취업 면접시 필패(必敗)하는 질문 10개  (0) 2009.01.21
    자아검색  (0) 2009.01.11
    And
    prev | 1 | 2 | 3 | 4 | ··· | 43 | next