수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1694961
  • Today | 706
  • Yesterday | 606

Embedded2005/10/08 14:06

임베디드 MSN 메신저 서버로의 여행-3

정지용

친구 리스트 처리하기
암호 인증이 끝난 이후 처리해야 할 또 다른 관문이 있다. 친구 리스트 처리하기가 바로 그것이다. 수많은 데이터가 연속해서 들어오기 때문에 더 어렵고 하나 하나 연결 리스트로 만들어서 추가시켜야 하기 때문에 더 힘들다. 게다가 버전에 따라 조금씩 바뀌기 때문에 버전별 처리를 별도로 해야 한다. 기본적인 맥락을 보고 하나씩 자세히 살펴보자.

SYN TrID 0


앞과 같이 TrID에 해당하는 명령어 순번을 넣어주고 NS로 메시지를 보내게 되면 NS에서 상당량의 데이터를 보내올 것이다. 그 정보 중 대표적인 것에는 그룹 리스트, 친구 리스트가 있는데 그룹 리스트는 해당 그룹 이름과 그룹의 고유 번호를 저장하고 있으면 된다. 친구 리스트는 다음 네 가지의 리스트로 나뉜다.

① Forward List(FL) : 가장 기본이 되는 리스트. 사용자의 전화번호와 닉네임 등의 정보가 나온다. 최대 150명까지 입력할 수 있다(2003년 3월 23일 이후).
② Reverse List(RL) : 상대방이 승낙했을 때 처리되는 리스트. 임의로 추가 또는 삭제가 불가능하다. 임의 추가 삭제를 시도할 경우 에러 메시지없이 즉시 접속이 끊어진다.
③ Allow List(AL) : 대화 수락 리스트
④ Block List(BL) : 대화 차단 리스트


4개의 리스트 데이터를 모두 받아온 다음, 분류에 따라 처리를 해야 한다. BL에 포함된 친구에게는 사용자의 접속 상태를 비롯하여 각종 메시지가 전달되지 않는다. 물론 대화를 시도하려고 해도 오프라인으로 표시되어 대화를 할 수 없다. 당연한 이야기겠지만 AL과 BL에 동시에 동일한 ID가 포함될 수는 없다. 만약 동일한 ID를 입력하게 된다면 다음과 같은 오류를 발생시킨다.

[송신] ADD 15 AL example@passport.com example@passport.com
[수신] ADD 15 AL 108 example@passport.com Mike
[송신] ADD 16 BL example@passport.com example@passport.com
[수신] 219 16


수신의 명령어 라인에 ‘219’라는 에러 번호를 수신하게 되는 것이다. 이처럼 친구 리스트를 관리할 때는 각별한 주의를 필요로 한다. 네 개의 리스트가 서로 얽히지 않게 분류하는 것이 가장 중요하다. 필자의 경우 C 언어의 싱글 링크드 리스트를 이용하여 구성했다. 친구가 많은 경우 이 데이터의 양은 방대해진다. 임베디드 시스템에서의 프로그래밍이라면 이런 부분에 좀 더 민감하게 처리할 필요가 있다. 필자는 다음과 같이 4개의 친구 리스트 구조를 약간 변경하여 하나의 리스트처럼 처리하는 방식을 이용했다.

int sock;
char* id;
char* name;

int status;
int group_eid;
int forward;
int reverse;
int allow;
int block;

MSN_LIST*next;


4개의 리스트를 모두 만든다면 ID 값과 별명 등의 정보는 중복된다. 특히 이들을 저장하기 위한 구조체는 더욱 복잡해진다. 4개의 리스트를 하나로 줄이면 친구 리스트를 저장하기 위한 메모리를 최소 50% 이상 절약할 수 있다. 앞과 같은 구조로 제작하여 FL, RL, AL, BL 중 하나라도 데이터가 있다면 해당 구조체가 생성되고 해당하는 변수를 ‘1’로 설정하면 된다. 조금 더 메모리를 절약하기 위해서는 비트(bit) 단위의 처리를 해도 무방하나 가독성을 위해 정수형으로 처리하였다. 각 구조체는 ‘싱글 링크드 리스트’로 연결하여 정보를 저장하게 되면 친구 리스트의 구성은 완료된다.

URL Encoding/Decoding
인터넷을 검색하다 보면 흔히 다음과 같은 주소를 발견할 수 있다.
http://wwl68.daum.net/Mail-bin/hm_frame.cgi?url=/Mail-bin/mail_list?dummy =232323643&FOLDER=%B9%DE%C0%BA%C6%ED%C1%F6%BA%B8%B0%FC%C7%D4&_top_hm=w_up_inbox

다른 것들은 직접적으로 읽을 수 있는 부분인데 ‘%B9%DE...’ 부분은 읽을 수 없다. 이는 바이너리 데이터를 직접 표시하지 않고 퍼센트 기호와 함께 헥사 코드(Hexadecimal code)를 표시한 것이다. 이 코드 세 자리를 한 자리의 바이너리 코드로 변환하면 간단하게 처리할 수 있다. MSN에서도 이러한 URL-Encoding/Decoding이 필요한데, 인증 과정에서부터 필요한 것이기 때문에 사전에 모듈화시켜 둘 필요가 있다.



<리스트 1>은 최초 접속하여 초기 인증을 완료하는 과정까지 보여주고 있다. 인증 과정 중 2번 URL-Decoding이 필요한데 패스포트 서버 접속 직전과 인증과정의 마지막에서 필요하다. 마지막의 명령을 보면 ‘example%20display%20name’이라 되어 있는데 헥사 코드 20은 ‘ ’(공백)을 의미한다. 즉, example display name과 동일한 의미이다. 다만 MSN 프로토콜 자체에서 공백을 파라미터 구분 단위로 인식하므로 이를 방지하기 위한 수단일 수도 있다. 필자는 이 부분의 구현시 % 기호를 인식하는 필터 함수를 만들었다. 이는 매우 유용하게 이용할 수 있는데 입력받은 데이터 중에서 % 기호가 있다면 그 다음 두 바이트의 값을 계산하여 하나의 바이너리로 만드는 함수를 필요한 곳에 넣기만 하면 된다.

문자열을 토큰화하기
<리스트 1>을 살펴보면 알 수 있듯이 MSN 프로토콜은 공백을 단위로 구분한다. 게다가 한 명령줄에 다수의 파라미터가 오는 경우 모두 잘라서 보관하고 있어야 한다. 이를 위해서 간단한 함수를 만들어서 이용하면 편리하다. <리스트 3>을 보면 2개의 함수가 있는데 하나는 공백을 단위로 토큰화시키는 함수이고 다른 하나는 할당된 메모리를 해제하는 함수이다. 임베디드 프로그래밍에서는 효율성이 매우 중요하다. 특히 메모리 효율이 더욱 중요한데 한번 사용한 메모리를 돌려주는 것을 절대 잊어서는 안된다. 그리고 상당 수의 버그들은 메모리 관리를 철저하게 하지 않아서 생기는 것들이다. 메모리 관리를 위해서는 함수 내에서 메모리를 할당하는 것을 피해야 하지만 편의성이 매우 뛰어나기 때문에 함수 내에서 메모리를 할당하고 추후 별도로 해제시켜 주는 함수를 제작해 이용했다.
필자가 MSN 메신저를 제작하면서 디버그 기간을 최소화할 수 있었던 가장 큰 요인은 바로 이 메모리 해제에 있다. 완벽할 수는 없지만 한번 사용한 메모리 중 필요가 없는 부분은 그 즉시 해제시킴으로써 프로그래밍 중간에 발생할 수 있는 다양한 버그를 미연에 방지했다. 특히 최종 디버깅 작업을 할 때 메모리 할당 함수와 해제 함수가 짝을 이루어 사용함으로써 메모리 누수 등의 버그를 상당히 많이 해결할 수 있었다.
"Embedded" 카테고리의 다른 글
  • Windows CE용 CAB 파일 만드는 법 (1) (0)2007/01/09
  • 임베디드 MSN 메신저 서버로의 여행-4 (0)2005/10/08
  • 임베디드 MSN 메신저 서버로의 여행-3 (0)2005/10/08
  • 임베디드 MSN 메신저 서버로의 여행-2 (0)2005/10/08
  • 임베디드 MSN 메신저 서버로의 여행-1 (0)2005/10/08
2005/10/08 14:06 2005/10/08 14:06
Posted by webdizen
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/1565

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1 ... 1599 1600 1601 1602 1603 1604 1605 1606 1607 ... 3009  Next»

RSS HanRSS
Blog Image
webdizen
이곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (3009)
Webdizen (141)
Life (6)
Diary (16)
Blog (9)
IDEA (2)
Travel (10)
Book (16)
Photo (7)
Movie (8)
Music (14)
Leisure Sports (10)
Funny (6)
Hardware (121)
Software (120)
Windows (5)
Unix & Linux (120)
Installation (5)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (804)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (2)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (4)
Network (66)
Web (79)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • TCP/IP
  • 게스트하우스
  • 법과대학
  • Huffman
  • Datasheet
  • Copy constructor
  • 에너지 버스
  • 기본 명령어
  • 데이타 바인딩
  • Xindesk
  • 집현관
  • EJB
  • TED
  • 다이어트
  • GetProcAddress
  • 그랜드캐년
  • processor
  • 음악 치료
  • Desktop
  • RAISERROR

Recent Articles

  • 트위터(Twitter)의 시작!.
  • 청년 리더의 조건.
  • 애플의 타블렛 PC - 아이패드....
  • 미래의 인터페이스 - 육감 기....
  • 기초발성법 동영상 강좌.

Recent Comments

  • 경청... 너무나 중요한데.......
    webdizen 14:59
  • 학교 과제물중 쓰레드에 대하....
    장진혁 03/17
  • 관리자만 볼 수 있는 댓글입....
    비밀방문자 03/12
  • 상대방의 이야기를 열심히 경....
    DoNuts 03/03
  • 좋은글 잘 보고 갑니다..
    Und_hacker 01/08

Recent Trackbacks

  • printf,scanf를 이용한 형식....
    yundream의 프로그래밍 이야기 03/10
  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 2009
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007

Archive

  • 2010/02 (1)
  • 2010/01 (6)
  • 2009/12 (5)
  • 2009/09 (3)
  • 2009/08 (1)

Calendar

«   2010/03   »
일 월 화 수 목 금 토
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Polarux - Linuxing
      • Rodman®
      • 까만 나비
      • 나를 가꾸는 시간.
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.