6

보다 나은 코딩스타일을 위해..

두 달 안에 이 두 책을 마스터하리라 결심해봅니다.

codecompleterefactoring

뭔가 정형화된 코딩스타일이 필요하다고 느껴서, 사놓고 못보고 있던 이 책들을 다시 꺼내보기로 했어요.

디자인을 전공하고 프로그래밍을 하고 있는 사람으로써, 항상 이렇게 코딩하는게 과연 맞는 것인가라는 의문을 갖고 있습니다.

플래시 초창기부터 ActionScript를 다루던 분들 중에는 그저 플래시가 좋아서, 시작한 분들이 많을 겁니다.

저도 그 중 한 명이고, 2004년부터 지금까지 항상 이렇게 코딩하는 것이 과연 옳은 것일까라는 의문은 없어지지 않았습니다.

그간 다른 언어들(C++/Java/Objective-C)를 공부를 해온 이유도 어쩌면, 코딩스타일의 답을 찾고자 하는 이유가 큰것 같습니다. 혼자 작업을 해도 되는 규모의 프로젝트의 경우에는 코딩스타일이 사실 문제가 되지 않습니다.

자신만 알아 볼수 있어도, 버그가 생기면 직접 수정하면 되고, 대응이 가능하기 때문이죠.(전혀 문제가 아닐수는 없죠^^ 1달만 지나도 이게 뭔 코드인지 알아볼 수가 없는 경우도 있으니..)

최소 2명 이상이 같이 협업을 할 경우!! 이때 바로 이것이 문제입니다.

기본적인 OOP의 개념조차 지키지 않으며, 개발이 된 코드들을 볼 때면, 한숨부터 나옵니다.

개발하는 시간보다 소스를 분석하는 시간이 더 오래 걸리는 경우가 태반이죠.

강제로라도 스타일을 맞출 수 있을까 해서 MVC패턴도 적용해보고, 디자인패턴들도 이래저래 적용해보고…

사실 플래시작업에서 MVC패턴을 적용할 만큼 규모가 있는 프로젝트가 많지 않은 것도 한몫을 하는 것 같으나, 가장 큰 이유는 작업스펙에 비해 항상 확보할수 있는 작업기간이 부족하여, 막코딩을 자꾸 하게되는 것이 문제죠

아예 정형화된 코딩스타일이 몸에 베어버리면 이런 막코딩 조차도 어느정도 형식을 취할수 있겠다라는 생각에서 “CodeComplete 2/E” 와 “Refactoring” 이 두 권의 책을 열시미 마스터해보고자 합니다.

이들을 마스터 한 후에는..  소프트웨어공학 관련 서적을 좀 봐야겠습니다.

제가 짠 코드가 협업하는 동료에게 득이 되지 못할 망정, 해가 되는 일이 생기는 일은 절대로 생기지 않기를 바랍니다.

요즘 들어서는 ActionScript 자체에 대한 고민보다, 다른 언어를 학습하고 그의 장점을 취하고, 개발론 혹은 방법론에 대해 다시 돌아보고 있습니다.

HTML5의 등장과 Adobe의 대처방안에도 관심이 있으나, 저는 그저 상황에 적응해가며 새로운걸 해보는게 아직은 좋네요 ^^ (사실 지금까지 해논 것이 위협받는 건 짜증나는 일이지만요 ㅎ)

[C/C++] 소켓 프로그래밍 – socket API 레퍼런스

출처 : http://teamblog.joinc.co.kr/yundream/132
최신문서는 Joinc Wiki 를 통해서 확인하세요.

소켓옵션

완성이 되면 docbook에 추가될 것이다.

네트워크 환경은 매우 다양하며, 예측하기 힘든경우도 많이 발생한다. 때문에 네트워크프로그램의 종류에 따라서 소켓의 세부사항을 조절해야 하는 경우가 발생한다. 이러한 소켓옵션 설정을 위해서 소켓은 getsockopt()와 setsockopt()두개의 함수를 제공한다. 이름에서 알 수 있듯이 getsockopt는 현재의 소켓옵션값을 가져오기 위해서, setsockopt는 소켓옵션값을 변경하기 위해서 사용한다.

예를 들자면 동일한 네트워 프로그램이라고 하더라도 ATM망에서 작동하는 것과 인터넷망 PPP에서 작동하는 것은 환경에 있어서 차이가 생길 수 밖에 없을 것이다. 소켓버퍼의 크기를 예로 들자면, 일반적으로 (대역폭 * 지연율) * 2의 공식에 따를 경우 최적의 효과를 보여준다고 한다. 다음은 이들 함수의 사용방법이다.

  • s : 소켓지정번호
  • level : 소켓의 레벨로 어떤 레벨의 소켓정보를 가져오거나 변경할 것인지를 명시하며, SOL_SOCKETIPPROTO_TCP 중 하나를 사용할 수 있다.
  • optname : 설정을 위한 소켓옵션의 번호
  • optval : 설정값을 저장하기 위한 버퍼의 포인터
  • optlen : optval 버퍼의 크기

설정값을 void * 로 넘기는 이유는 설정하고자 하는 소켓옵션에 따라서, boolean, interger, 구조체등 다양한 크기를 가지는 데이터형이 사용되기 때문이다. 만약 변경하고자 하는 소켓옵션이 boolean을 따른다면, 0혹은 1이 사용될 것이다.

SOL_SOCKET레벨에서 사용할 수 있는 옵션과 데이타형은 다음과 같다.

옵션값 데이터형 설명
SO_BROADCAST BOOL 브로드캐스트 메시지 전달이 가능하도록 한다.
SO_DEBUG BOOL 디버깅 정보를 레코딩 한다.
SO_DONTLINGER BOOL 소켓을 닫을때 보내지 않은 데이터를 보내기 위해서 블럭되지 않도록 한다.
SO_DONTROUTE BOOL 라우팅 하지 않고 직접 인터페이스로 보낸다.
SO_GROUP_PRIORITY int 사용하지 않음
SO_KEEPALIVE BOOL Keepalives를 전달한다.
SO_LINGER struct LINGER 소켓을 닫을 때 전송되지 않은 데이터의 처리 규칙
SO_RCVBUF int 데이터를 수신하기 위한 버퍼공간의 명시
SO_REUSEADDR BOOL 이미 사용된 주소를 재사용 (bind) 하도록 한다.
SO_SNDBUF int 데이터 전송을 위한 버퍼공간 명시

IPPROTO_TCP레벨에서 사용할 수 있는 옵션과 데이터형이다.

TCP_NODELAY BOOL Nagle 알고리즘 제어

SO_REUSEADDR

간단한 예로, 소켓을 이용한 서버프로그램을 운용하다 보면 강제종료되거나 비정상 종료되는 경우가 발생한다. 테스트를 목적으로 할 경우에는 특히 강제종료 시켜야 하는 경우가 자주 발생하는데, 강제종료 시키고 프로그램을 다시 실행시킬경우 다음과 같은 메시지를 종종 보게 된다.

이는 기존 프로그램이 종료되었지만, 비정상종료된 상태로 아직 커널이 bind정보를 유지하고 있음으로 발생하는 문제다. 보통 1-2분 정도 지나만 커널이 알아서 정리를 하긴 하지만, 그 시간동안 기달려야 한다는 것은 상당히 번거로운 일이 될 것이다. 이 경우 다음과 같은 코드를 삽입함으로써 문제를 해결할 수 있다.

이렇게 하면 커널은 기존에 bind로 할당된 소켓자원을 프로세스가 재 사용할 수 있도록 허락하게 된다.

다음은 소켓버퍼의 크기를 가져오고 설정하는 완전한 코드다.

TCP_NODELAY

이 옵션을 이해하려면 Nagle알고리즘에 대해서 이해를 해야 한다. Nagle 알고리즘이 적용되면, 운영체제는 패킷을 ACK가 오기를 기다렸다가 도착하면, 그 동안 쌓여있던 데이터를 한꺼번에 보내게 된다. 이러한 방식을 사용하게 되면, 대역폭이 낮은 WAN에서 빈번한 전송을 줄이게 됨으로 효과적인 대역폭활용이 가능해진다.

대부분의 경우에 있어서 Nagle 알고리즘은 효율적으로 작동하긴 하지만, 빈번한 응답이 중요한 서비스의 경우에는 적당하지 않은 경우가 발생한다. 예를 들어 X-Terminal을 이용할 경우 마우스 이벤트는 즉시 전달될 필요가 있는데, Nagle알고리즘을 사용하면 아무래도 반응시간이 떨어지게 될 것이다. 실시간적인 반응이 중요한 온라인 게임역시 Nagle 알고리즘을 제거하는게 좋을 것이다.

아래의 이미지는 nagle이 적용되었을 때와 그렇지 않을 때, 어떻게 데이터 전송이 일어나는지를 보여주고 있다.

nagle.png

SO_LINGER

SO_LINGER은 소켓이 close()되었을 때, 소켓버퍼에 남아있는 데이터를 어떻게 할 것이지를 결정하기 위해서 사용한다. 다음은 SO_LINGER 옵션에 사용되는 데이터구조체이다.

  • l_onoff : linger 옵션을 끌것인지 킬 것인지 결정
  • l_linger : 기다리는 시간의 결정

위의 두개의 멤버변수의 값을 어떻게 하느냐에 따라 3가지 close방식을 결정되어 진다.

  1. l_onoff == 0 : 이 경우 l_linger의 영향을 받지 않는다. 소켓의 기본설정으로 소켓버퍼에 남아 있는 모든 데이터를 보낸다. 이때 close()는 바로 리턴을 하게 되므로 백그라운드에서 이러한 일이 일어나게 된다. 우아한 연결 종료를 보장한다.
  2. l_onoff > 0 이고 l_linger == 0 : close()는 바로 리턴을 하며, 소켓버퍼에 아직 남아있는 데이터는 버려 버린다. TCP 연결상태일 경우에는 상대편 호스트에 리셋을 위한 RST 패킷을 보낸다. hard 혹은 abortive 종료라고 부른다.
  3. l_onoff > 0 이고 l_linger > 0 : 버퍼에 남아있는 데이터를 모두 보내는 우아한 연결 종료를 행한다. 이때 close()에서는 l_linger에 지정된 시간만큼 블럭상태에서 대기한다. 만약 지정된 시간내에 데이터를 모두 보냈다면 리턴이 되고, 시간이 초과되었다면 에러와 함께 리턴이 된다.

고친 과정
고침 0.9 2004년 8월 19일
입출력함수/도메인 이름변환/바이트오더 관련 함수 추가

Socket 은 유닉스의 파일 기술자를 통해서 다른 프로그램간의 정보교환을 가능하도록 해주는 방법으로, 같은 시스템에 있는 프로그램들간의 정보교환을 위한목적, 혹은 다른 시스템(네트웍 상으로 멀리떨어져있는) 들간의 정보교환을 위한 목적으로 사용된다.
그런데 왜 Layer 라고 부르는가 그 이유는 TCP/IP 4계층의 응용계층(applicaton layer)과 전송계층(transmission layer) 중간에 존재하기 때문이다. 아래의 그림을 보라

그림 1. 소켓 계층

위의 그림은 TCP/IP 개요에서 이미 본적이 있는 그림일 것이다. 그때의 그림과 달라진 점이 있다면, 응용계층과 전송계층에 Socket Layer 가 존재한다는 것이다. 이 Socket Layer 가 응용계층과 전송계층 사이에 존재하게 됨으로 우리 프로그래머들은 복잡하게 TCP 를 직접 제어할 필요없이, Socket Layer 에서 제공하는 다양한 함수(Socket API)를 이용해서 간단하게 인터넷 네트웍 프로그래밍 작업을 하게 되는것이다.
Socket Layer 은 응용계층에서 받은 메시지를 하부 Socket API 를 이용해서 전송계층으로 보낸다. 전송계층에는 2가지 대표적인 프로토콜 이 있는데 바로 TCP 와 UDP 이다. 그럼으로 우리 프로그래머들은 TCP 프로토콜을 사용할것인지 UDP 프로토콜을 사용할것인지만 결정해주면된다.


일상 생활에서 소켓레이어와 비슷한게, 전화기라고 볼수 있을것이다. 우리는 상대편에서 전화를 걸기 위해서 상대편전화의 지리적 위치가 어디인지, 어떤 전화국에서 관리하는지, 언어를 신호로 변환 시키기 위해서 어떠한 작업을 해야하는지, 어떻게 보내야 하는지 전혀 알필요가 없다. 그냥 수화기 들고 전화 번호만 누르면 그걸로 끝이다. 즉 전화기 라는게 있음으로 그 내부에서 일어나는 여러가지 복잡한 통신 프로세스를 모르고도 상대편과 전화통화를 할수 있게 된다.
Socket Layer 이 존재함으로써, 우리는 TCP/UDP 헤더를 어떻게 만들어야 하는지, 구조가 어떻게 되는지, 어떻게 커널에 전달해야 하는지 신경쓸필요 없이 네트웍 프로그램을 만들수 있게 된다.


“Socket 이라뇨 우리는 위에서 Socket Layer를 이미 다루었는데요 ?” 라고 의문을 가질수도 있을것이다. Socket Layer 과 Socket 는 엄연히 다르다. Socket Layer 는 계층을 나타내는 것이다. 즉 Socket 를 다루기 위한 계층이다. 이는 TCP가 전송계층이 아닌것과 마찬가지이다. 우리는 Socket Layer 에서 제공하는 다양한 API를 통해서 Socket 를 제어하게 된다.
그럼 Socket 이란 무엇인가. 소켓이란 유닉스 파일 지시자 를 이용하여 다른 프로그램과 정보교환을 하는 방법(혹은 도구) 이다. 일반적으로 유닉스 상에서 정보교환은 파일지시자를 통한다는걸 알고 있을것이다. 마찬가지로 Socket 를 이용한 지역 혹은 네트웍으로 연결된 프로그램 간의 정보교환 역시 파일지시자를 통해서 이루어진다.
다중연결서버 만들기(1) 의 zipcode_multi.c 를 이용해서 소켓이 어떻게 작동하는지 알아보도록 하겠다. 먼저의 위의 프로그램을 컴파일 시키고 작동을 시켜보자. 작동을 시켰다면 ps 로 zipcode_multi 프로그램의 pid 를 확인해보고 /proc/pid/fd 디렉토리로 이동해서 어떠한 파일 지시자를 가지고 있는지 확인해보도록 하자.

pid가 2473 이므로 이 프로그램의 /proc/2473/fd 로 이동해서 ls해보면 프로그램에서 사용하고있는 파일지시자들에 대해서 알수 있다.

0, 1, 2 는 각각 표준입력, 표준출력, 표준에러를 가리키는 파일지시자 라는것은 이미 알고 있을것이다. 3 은 프로그램이 연 파일을 가리킨다. 마지막 4가 바로 socket 통신을 위해 만들어진 파일 지시자이다. 다른 것들이 터미널이나 파일을 가리키는것과는 달리 socket 를 가리 키고 있음을 알수 있다.
여기에 새로운 클라이언트가 접근을하면 (telnet 이나 전용클라이언트 를 이용해서) 다음과 같은 파일 지시자가 하나 추가 될것이다.

1


이번에는 socket 레이어에서 제공하는 소켓 관련 함수들을 설명하도록 하겠다.


socket(2) 함수

이러한 소켓 은 socket(2) 함수를 이용해서 만들어진다. 최초 socket 함수를 이용해서 소켓을 생성하면 커널은 통신을 위한 종점(end point,즉 통신연결상황을 체크하는)을 생성하고, 여기에 대한 파일 지시자를 되돌려준다. 프로그램은 socket 함수를 이용해서 생성한 파일 지시자에 새로운 연결이 들어오는 지를 확인하게 된다.
위에 있는 TCP/IP 4계층을 보면 Socket Layer 아래에는 최소한 2개 이상의 사용가능한 데이타 그램의 타입이 있음을 알수 있다. 이러한 데이타 그램의 타입에는 TCP, UDP, RAW 등이 있다. TCP 소켓, UDP 소켓, RAW 소켓이라고 부르기도 한다. 또한 다양한 소켓 주소패밀리(군)를 제공한다.

표 1. 소켓주소 패밀리

UNIX 유닉스 도메인 소켓, IPC 용으로 많이 사용한다.
INET TCP/IP 프로토콜을 이용한 인터넷주소 패밀리, 보통의 네트웍프로그래밍시 주로 사용
IPX 노벨의 IPX 프로토콜, 게임을 좋아한다면 많이 들어봤음직한
AX25 아마추어 라디오 X.25
X25 X.25 프로토콜

그러므로 socket 함수는 위의 소켓 주소 패밀리와 소켓 타입 지정이 가능해야 한다.

첫번째 아규먼트가 소켓주소 패밀리 지정을 위해서 사용되며, 두번째 아규먼트가 소켓 타입지정을 위해서 사용된다. 소켓주소 패밀리는 주로 INET(AF_INET), UNIX(AF_UNIX) 가 사용되며, 소켓타입은 TCP(SOCK_STREAM), UDP(SOCK_DGRAM), RAW(SOCK_RAW) 가 사용된다.
즉 인터넷 프로토콜을 이용하는 TCP 소켓을 만들기 원한다면 socket(AF_INET, SOCK_STREAM, 0) 과 같이 사용하면 된다.
socket 함수가 성공적으로 수행되면, 사용가능한 소켓을 가르키는 파일 지시자를 되돌려주며, 이 파일지시자는 endpoint(연결 확인 통로) 로써 사용된다.


bind(2) 함수

socket 함수를 이용해서 만들어진 소켓에 이름을 부여한다.
라고 번역된 man 페이지혹은 관련된 번역서에서 설명을 하고 있지만, 소켓에 특성을 부여(소켓과 특성을 묶는다(bind))한다 라는게 좀더 적당한 설명이 아닐까 싶다.

인자로 주어진 sockfd 에대해서 sockaddr 을 이용해서 특성을 묶어준다. bind 함수를 통해서 우리는 sockfd 가 사용할 포트번호(port), 그리고 연결을 받아들일 IP 주소 특성등을 묶어줄수 있다. IP 주소는 IPv4, IPv6 등이 사용될수 있을것이다.
bind 함수는 보통 서버에서 사용된다. 그 이유는 대부분의 서비스(HTTP, FTP..)들이 지정된 포트번호를 통해서 서비스 되기 때문이다. 반면 클라이언트의 경우 커널에서 할당한 임의의 포트번호를 이용해서 서버와 연결하기 때문에 bind 를 사용할 필요가 없다.


connect(2) 함수

이것은 클라이언트측 에서 사용되며, struct sockaddr 구조체에 세팅된 내용대로 서버측에 연결한다. sockaddr 구조체에는 연결될 서버에 대한 정보들, 즉 주소 패밀리 IP 번호와 PORT 번호 등이 들어가 있으며, connect 함수는 sockaddr 정보를 이용해서 서버측에 연결을 하며 서버와의 통신을 위한 endpoint 와 sockfd 를 연결시킨다. sockfd 는 socket 함수를 이용해서 만들어진 소켓 지정 번호이다.


listen(2) 함수

서버측에서 사용되며 socket 함수를 이용해서 만들어진 sockfd 에 대해서, 들어 오는 연결을 기다린다. backlog 는 아직 완전히 연결되지 않은 연결들이 대기할 queue 의 길이를 명시하기 위해서 사용된다.


accept(2) 함수

listen 을 통해서 만들어진 미연결의 대기열에서 가장 앞에 있는 연결의 내용을 가져와서 새로운 연결 소켓을 만들어준다. 새로만들어진 연결소켓은 파일 지시자를 할당하여서 리턴해주게 되며, 우리는 리턴된 파일 지시자를 이용해서 새로만들어진 소켓과 통신을 할수 있게 된다.


유닉스에서 소켓은 파일과 동일하게 취급 되기 때문에 read(), write()와같은 시스템 함수를 이용해도 대부분의 입출력을 다룰 수 있다. 그러나 이들 시스템 함수들은 네트워크의 특성을 고려하지 않고 만들었기 때문에 네트워크 정보를 필요로 하는 작업을 하기에는 적당하지 않은 점이 있다.
예를들어 UDP를 이용해서 통신을 할경우 읽기는 문제없지만 쓰기에는 문제가 생길 수 있다. UDP는 연결 소켓을 만들지 않기 때문에 쓸때 연결된 호스트의 정보를 알 수가 없기 때문에 write()함수로는 데이터를 전송할 수 없게 된다. 이럴경우에는 소켓 API를 사용해서 통신을 해주어야 한다.


소켓으로 부터 데이터를 받기 위해서 사용한다.

소켓 지정자 s로 부터 데이터를 읽는 일을 한다. 둘다 연결지향 소켓과 비연결지향 소켓 모두에 사용할 수 있다. 보통 recvfrom()함수가 사용하기에 직관적인 관계로 쉽게 사용할 수 잇다. 소켓으로 부터 len 만큼 데이터를 읽어와서 buf에 저장한다. 또한 5번째 인자인 from를 통해서 데이터를 보낸 호스트의 인터넷 정보를 얻어 올 수 있다. 그러므로 비연결 지향 소켓을 사용하더라도 이 인터넷 정보를 통해서 데이터를 수신할 목적지 호스트를 결정할 수 있게 된다. fromlen는 sockaddr 구조체의 길이다. 나머지 자세한 내용은 recvform(2)의 맨페이지를 참고하기 바란다.


소켓으로 데이터를 보내기 위해서 사용한다.

역시 직관적인 sendto를 널리 사용한다. 소켓 지정자 slen크기만큼 buf의 내용을 보낸다. to를 이용해서 데이터를 받을 호스트를 명시할 수 있다. sendto()와 recvfrom()함수의 사용예는 UDP 소켓 프로그래밍 을 참고하기 바란다.


인터넷 주소 자체가 인간이 인지하기 어려운 수로 되어 있다 보니 이것을 관리하기 쉽도록 점박이 3형제 스타일의 인터넷 주소체계를 만들어서 관리하고 여기에 또 도메인 이름을 줘서 쉽게 기억할 수 있도록 하고 있다. 프로그래머나 사용자는 보통 도메인 이름이나 점박이 3형제 스타일의 인터넷 주소를 사용하게 되는데, 실제 네트워크 프로그램에서는 32bit 주소 형태로 변환 시켜줘야할 필요가 있다.
여기에서는 이들 주소간 변환과 관련된 함수를 소개한다.


inet_addr(3), inet_aton(3), inet_network(3), inet_ntoa(3) 의 함수를 이용해서 인터넷 주소와 32bit 주소간 변환을 할 수 있다. inet_addr(3)과 inet_network(3)함수는 점박이 3형재 스타일 인터넷 주소로 부터 32bit 주소를 얻기 위해서, inet_aton(3)과 inet_ntoa(3)그 반대의 변환 값을 얻기 위해서 사용한다. 자세한 내용은 man 페이지를 참고하기 바란다(그냥 함수 링크를 클릭하면 된다).


점박이 3형제 스타일의 인터넷 주소는 확실히 관리하기 좋고 외우기에 좀더 편하긴 하지만 숫자로 되어 있다는 것 때문에 인터넷 서비스를 위한 호스트 주소로 사용하기엔 적당하지 않다. 그래서 인터넷 주소에 이름을 주는 서비스가 만들어지게 되었는데 도메인 서비스이다. 도메인 서비스는 도메인 이름에 대한 인터넷 주소를 되돌려 주는 일을 한다. 자세한 내용은 인터넷 주소 변환문서를 참고하기 바란다.


도메인 이름에서 인터넷 주소를 얻어오는 일을 한다. 자세한 내용은 gethostbyname(3)과 getbyaddr(3)의 맨페이지를 참고 하기바란다.


네트워크 통신을 하다보면 CPU의 바이트 오더가 다른 이유로 이를 표준 바이트 오더인 네트워크 바이트 오더로 변환해서 보내고, 받아들인 데이터는 호스트의 바이트 오더에 맞게 다시 변경시켜주는 작업이 필요하다. 이러한 작업을 위해서 소켓은 몇 개의 함수들을 제공한다. 바이트 오더에 대한 자세한 내용은 endian에 대해서 를 참고하기 바란다.


htonl(3), htons(3) 함수를 사용한다. 전자는 4byte 데이터, 후자는 2byte 데이터를 네트워크 바이트 오더를 따르도록 변환한다.


ntohl(3), ntohs(3) 함수를 사용한다. 전자는 4byte데이터, 후자는 2byte데이터를 호스트 바이트 오더를 따르도록 변환한다.


이건 보너스다. 현재 CPU의 바이트 오더 방식을 알려 주는 간단한 함수다.


다음은 서버측의 소켓 생성 순서를 나열한 것이다.

  1. 서버측의 소켓 생성순서는 최초 socket 함수를 이용해서 endpoint 소켓, 즉 클라이언트의 연결을 듣기 위한 소켓을 생성하게 된다. 이 소켓은 서버가 종료될때까지 남아있게 된다.
  2. bind 함수를 호출하여 소켓특성을 묶어준다. 이 함수를 이용하여 port 번호를 지정해주며, 받아들일 IP주소에 대한 설정을 한다.
  3. listen 함수를 이용하여 듣기 소켓(socket 함수를 통해서 만들어진) 에 연결이 있는지 기다린다. 만약 연결이 있다면, 연결 대기열(queue)에 쌓아놓는다.
  4. accept 함수를 이용하여 연결 대기열에 대기중인 연결이 있다면 해당 연결에 대하여 새로운 소켓을 만들고 만들어진 소켓에 대한 파일 지시자를 되돌려준다. 이 소켓은 읽기/쓰기로 만들어진다. 만약 연결 대기열에 대기중인 연결이 없다면 (기본적으로) 해당 영역에서 봉쇄(block)된다.
  5. read, write 등의 함수를 이용해서 통신을 한다.

다음은 클라이언트측의 소켓 생성 순서를 나열한 것이다. 서버측에 비하여서 훨신 간단하게 이루어짐을 알수 있다.

  1. 최초 socket 를 이용하여 endpoint 소켓을 생성한다. 클라이언트 이므로 이것은 듣기 소켓이 아니고, 연결 소켓이 될것이다. (이름만 다를뿐 사실 듣기 소켓과 연결 소켓의 구분은 없다)
  2. connect 를 이용하여 서버에 연결한다.
  3. read, write 등의 함수를 이용해서 서버와 통신한다.

이상 Socket Layer 의 개념과 Socket Layer 에서 제공하는 Socket API 에 대한 간단히 알아 보았다. 여기에 있는 API 들은 가장 기본적인(통신을 위해서 필요한) 함수들이다. 나머지 좀더 세밀한 함수들에 대해서는 Unix NetWork Programming 등의 서적을 참고하기 바란다.
여기에 있는 소켓 API 들의 사용예는 이 사이트에서 충분히 찾아볼수 있을것이다.

IE Tester (IE브라우저 버젼별 테스트)

IETester is a free WebBrowser that allows you to have the rendering and javascript engines of IE8, IE7 IE 6 and IE5.5 on Vista and XP, as well as the installed IE in the same process.
New in v0.3.2 : IE8 final version !


This is an alpha release, so feel free to post comments/bugs on the IETester forum or contact me directly.
Minimum requirement : Windows Vista or Windows XP with IE7 (Windows XP/IE6 config has some problems and IE8 instance do not work under XP without IE7)


Download IETester v0.3.2 (24MB)
(IETester v0.3.2 zipped intaller for people unable to download .exe files due to proxy limitations)


Known problems and limitations :



  • The Previous/Next buttons are not working properly

  • Focus is not working properly

  • Java applets are not working

  • Flash is not working on IE6 instance in user mode : A solution is to launch IETester as admin user and Flash will work.

  • CSS Filters are not working correctly in user mode : A solution is to launch IETester as admin user and CSS Filters will work.



    http://www.my-debugbar.com/wiki/IETester/HomePage

Subversion Client 설치 및 사용법 (for Windows)

규모가 있는 프로젝트를 진행할때나, 여러 작업자간의 co-work이 이루어 지는 개발 프로젝트의 경우에는 프로그램 Source Code에 대한 관리가 필요하다. 이때 많이 사용 되는 프로그램으로 CVS / Subversion이 있다.

Subversion을 사용하여 SourceCode관리를 하기 위한 SVN Client설치,사용법을 설명한다.





– Subversion Client Program Download



클라이언트 다운로드URL : http://tortoisesvn.tigris.org/



사용자 삽입 이미지



(현재 설치되어있는 OS환경에 맞추어 32Bit / 64Bit 중에 선택하여 설치하면 됨.)

위에서 TortoiseSVN-1.6.0.15855-win32-svn-1.6.0.msi 파일을 다운받아 설치했음.



또한, 서버에서 서브버젼기능 사용을 위해 Repository를 설정하고, 프로젝트를 생성한다.





– TortoiseSVN의 사용법



사용자 삽입 이미지



아무것도 세팅하지않은 상태에서 우클릭을 하면 이런 화면이 나온다.



새로운 폴더를 생성한후 create repository here를 눌러서 repository를 생성한후,

check Out을 눌러서 “http://papervision3d.googlecode.com/svn/trunk/“같은 SVN repository를 설정해준다.



사용자 삽입 이미지



정상적으로 세팅했을경우 이처럼 Add하는 과정이 진행된다.



사용자 삽입 이미지



우클릭후 Add 했을경우에는 Meta정보만 반영된 것이기 때문에, Commit을 수행해주어야 정확히

서버에 반영됨.




작고 가벼운 패킷 분석 프로그램, Smart Sniff






패킷분석프로그램이란, 간단히 말하여 다운로드 주소를 따오는 프로그램입니다. (깊숙히 들어가면 매우 전문적인 영역이므로 설명을 제하겠습니다.) 그런 패킷분석프로그램 중 가장 작고 가볍다는 평을 받는 것이 이 smart sniff입니다.


사용법은 옵션 – 캡처옵션에서 자신의 네트워크어댑터만 바로 설정후 캡쳐버튼(▶)을 누르면 컴퓨터로 다운되고 있는 정보(패킷)의 주소를 얻을수 있습니다.

– 강력한 패킷 스니퍼링 도구이다.

– winPcap 캡쳐 드라이버가 필수적이다.
http://www.winpcap.org/install/default.htm

– 캡처 데이터를 export 해준다.

– 아스키 127 로 출력 해준다.

– 각종 필터링 기능을 제공한다.

– 라이브 모드 기능을 제공한다.

– 프로세스 정보 보기 기능을 제공한다.

– 한국어 뿐만아니라 다국적 언어를 제공한다.


smart sniff


smart sniff 한글패치 (설치폴더로 복사하세요)