Swig
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : article>Swig



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Swig

Swig

À± »ó¹è

dreamyun@yahoo.co.kr



1절. swig ¿¡ ´ëÇØ¼­

swig ´Â C³ª C++ °ú ´Ù¸¥ ¿©·¯°¡Áö ¾ð¾îµéÀ» °£´ÜÇÏ°Ô ¿¬°á½ÃÄѼ­ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï µµ¿ÍÁÖ´Â ¾ð¾îÀÌ´Ù. Áï C³ª C++ ·Î ¸¸µé¾îÁø ¿©·¯°¡Áö ÄÚµåµéÀ» Perl, Python, Tcl, Ruby, Java µî¿¡¼­ »ç¿ë°¡´ÉÇϵµ·Ï ¸¸µé¾î ÁØ´Ù.

¿ì¸®°¡ ÀÚÁÖ»ç¿ëÇÏ´Â ½ºÅ©¸³Æ® ¾ð¾îÀÎ Perl, Python Àº ¸Å¿ì °­·ÂÇÏ±ä ±»ÀÌ C¿Í C++ À» ¼±ÅÃÇØ¼­ ÄÚµùÇϵµ·Ï ÇÏ´Â ¸î°¡Áö ´ÜÁ¡µéÀ» °¡Áö°í ÀÖ´Ù. Áï ÄÄÆÄÀϵÇÁö ¾Ê¾Æ¼­ ½î¾²Äڵ尡 º¸Àδٴ Á¡°ú, ¼Óµµ¿¡ ¸Å¿ì ¹Î°¨ÇÑ È¿À²ÀûÀÎ Äڵ带 ÀÛ¼ºÇÒ Çʿ䰡 ÀÖÀ»¶§ ¹®Á¦°¡ µÉ¼ö ÀÖ´Ù¶ó´Â Á¡ÀÌ´Ù.

¹°·Ð ²Ï ¿À·¡ÀüºÎÅÍ Perl, Python ÄÄÆÄÀÏ·¯°¡ Á¸ÀçÇÏÁö¸¸(»ó¿ë, °ø°³ ¸ðµÎ), À̵éÀÌ ¸¸µé¾î³½ ½ÇÇàÆÄÀÏÀº °ú¿¬ÀÌ°Ô È¿À²ÀûÀ¸·Î µ¹¾Æ°¥¼ö ÀÖÀ»·±Áö¸¦ Àǽɽº·´°Ô ¸¸µé Á¤µµ·Î ºñÁ¤»óÀûÀ¸·Î ½ÇÇàÆÄÀÏÀÌ Ä¿Áø´Ù. ¼Óµµ¹®Á¦ ¿ª½Ã ¸¶Âù°¡Áö´Ù. ¿©·¯°¡Áö ´Ù¾çÇÑ Á¶»ç¿Í ÀÌµé ½ºÅ©¸³Æ® ¾ð¾îÀÇ ¼º´É°³¼±À» ÅëÇØ¼­, ¶Ç´Â ÄÄÇ»ÅÍÀÇ ¼º´ÉÀÇ °³¼±À» ÅëÇØ¼­ ´ëºÎºÐÀÇ °æ¿ì ¸Å¿ì ÁÁÀº ¼º´ÉÀ» º¸¿©ÁÖ±ä ÇÏÁö¸¸ ¿©ÀüÈ÷ ÃÖÀûÈ­µÈ C/C++ º¸´Ù ³ªÀº ¼º´ÉÀ» ±â´ëÇϱâ´Â ¾î·Á¿ï°ÍÀ¸·Î º¸¿©Áø´Ù.

±×·¡¼­ ¸¸µé¾îÁø°Ô swig ÀÌ´Ù. Áï ÀÎÅÍÆäÀ̽º ºÎºÐÀº ¸Å¿ì ºü¸£°í ¼Õ½±°Ô °³¹ßÀÌ °¡´ÉÇÑ Perl, Python µîÀ¸·Î °³¹ßÀ» Çϰí Äڵ带 ¼û°Ü¾ß µÇ°Å³ª ȤÀº ³ªÀº ¼º´ÉÀ» ÇÊ¿ä·Î ÇÏ´Â ºÎºÐÀº C ·Î ÀÛ¼ºÇϵµ·Ï ÇØ¼­ ¼­·Î ¿¬°á ½ÃŰ´Â °ÍÀÌ´Ù. À̸¦Å׸é GUI ÇÁ·Î±×·¥À» ¸¸µéÀû¿¡ ¹è¿ì°í »ç¿ëÇϱ⠱î´Ù·Î¿î QT, GTK ´ë½Å wxpython À» »ç¿ëÇÏ°í ½ÇÁö ÀÛµ¿ÇÏ´Â ºÎºÐÀ» C/C++ ·Î ÀÛ¼ºÇÑ´ÙÀ½ ¼­·Î ¿¬°á ½ÃŰ´Â °ÍÀÌ´Ù. ÀÌ·¸°Ô ÇÔÀ¸·Î½á °³¹ß¼Óµµ Çâ»ó, È¿À²¼º, ÄÚµå ¼û±èÀÇ 2¸¶¸® Åä³¢¸¦ µ¿½Ã¿¡ ÀâÀ»¼ö ÀÖ°Ô µÈ´Ù.

ÀÌ ¹®¼­´Â swig ÀÇ »ç¿ë¿¡ ´ëÇÑ ¹®¼­ÀÌ´Ù. swig ÀÇ ¾ÆÁÖ ¼¼¼¼ÇÑ ºÎºÐÀ» ¾ð±ÞÇÏÁö´Â ¾ÊÀ¸¸ç, ÁÖ·Î ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö¿¡ ÃÐÁ¡À» ¸ÂÃß°Ô µÉ°ÍÀÌ´Ù. swig °¡ Áö¿øÇÏ´Â ¿©·¯°¡Áö ¾ð¾îÁß¿¡¼­ Python °ú Perl À» C,C++ °ú ¿¬°á½ÃŰ´Â ¹æ¹ý¿¡ ´ëÇØ¼­¸¸ ´Ù·ê°ÍÀÌ´Ù. ÀÌ¿ÜÀÇ ÀÚ¼¼ÇÑ Á¤º¸µéÀº swig ȨÆäÀÌÁö ¸¦ Âü°íÇϱ⠹ٶõ´Ù.

Âü°í·Î swig °¡ Áö¿øÇÏ´Â ¾ð¾î´Â Perl, Python, Java, Guile, Ruby, Php, Tcl µîÀÌ ÀÖ´Ù. À̵éÁß Perl °ú Python À» ´Ù·ç´Â ÀÌÀ¯´Â ÇÊÀÚ°¡ Perl °ú Python ¿¡ Á»´õ Àͼ÷Çϱ⠶§¹®ÀÌ´Ù.


2절. swig ¸¦ »ç¿ëÇÑ ÇÁ·Î±×·¡¹Ö

2.1절. swig ¼³Ä¡Çϱâ

¿ì¼±Àº swig ¸¦ ´Ù¿î¹Þ¾Æ¼­ ¼³Ä¡ÇØ¾ß ÇÒ°ÍÀÌ´Ù. swig ´Â ÇöÀç(2002³â 7¿ù 20ÀÏ) 1.3.12 ¹öÁ¯ ±îÁö ³ª¿Í ÀÖ´Ù. swig ȨÆäÀÌÁö ¿¡¼­ ´Ù¿î ¹Þµµ·Ï ÇÏÀÚ. ÃֽŹöÁ¯ÀÎ 1.3.12 ´Â C++ namespace ¿Í C++ templates ±îÁö Ãß°¡·Î Áö¿øÇÑ´Ù. ¶ÇÇÑ À©µµ¿ìÁîµµ Áö¿øÇÑ´Ù. ¿©±â¿¡¼­´Â linux ¹öÁ¯À» Áß½ÉÀ¸·Î ¼³¸íÇϰڴÙ.

ÀÏ´Ü ´Ù¿î ¹Þ¾ÒÀ¸¸é Àû´çÇÑ µð·ºÅ丮·Î ¿Å±â°í ÄÄÆÄÀÏ ÈÄ ¼³Ä¡Çϵµ·Ï ÇÑ´Ù. ./configure, make, make install ÀÇ ÀüÇüÀûÀÎ ¼³Ä¡ ¹æ¹ýÀ» µû¸£¸é µÈ´Ù. Ưº°È÷ ¿É¼ÇÀ» ÁÖÁö ¾Ê°í ./configure ½ºÅ©¸³Æ®¸¦ µ¹¸°ÈÄ ¼³Ä¡Çß´Ù¸é /usr/local/bin ¹Ø¿¡ swig ½ÇÇà ÆÄÀÏÀÌ ¼³Ä¡µÉ °ÍÀÌ´Ù.


2.2절. ¿¹Á¦¸¦ ÅëÇÑ swig ÀÇ °£´ÜÇÑ »ç¿ë¹æ¹ý

C ÄÚµå¿Í python À» °áÇÕÇÏ´Â °£´ÜÇÑ ¿¹Á¦¸¦ ÅëÇØ¼­ swig ÀÇ »ç¿ë¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

¿ì¸®°¡ C ·Î ¸¸µéÇÔ¼ö´Â "hello world" ¸¦ Ãâ·ÂÇØÁÖ´Â ÇÔ¼öÀÌ´Ù. ½î½ºÆÄÀÏÀÇ À̸§Àº hello.c ·Î ÇÏÀÚ.

void echo()
{
	printf("Hello World!!
");
}
			


2.2.1절. Interface file Á¦ÀÛ

ÀÌÁ¦ À§ÀÇ C ÇÔ¼ö¸¦ À§ÇÑ interface ÆÄÀÏÀ» ¸¸µé¾î¾ß ÇÑ´Ù. ÀÌÆÄÀÏÀº swig°¡ C ÇÔ¼ö¸¦ ´Ù¸¥ ¾ð¾î¿Í ¿¬°á½Ã۱â À§ÇÑ Á¤º¸ÆÄÀÏÀ» ¸¸µé±â À§Çؼ­ ÀÌ¿ëµÈ´Ù. Interface file Àº ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºµÈ´Ù.

%module sample 
%{
%}

extern void echo();
				
ÀÌ ÆÄÀÏÀ̸§Àº hello.i ·Î ÀúÀåÇÏÀÚ.


2.2.2절. Python module ¸¸µé±â

ÀÌÁ¦ À§ÀÇ ÀÎÅÍÆäÀ̽º ÆÄÀÏÀÎ hello.i ¸¦ ÀÌ¿ëÇØ¼­ Python ¸ðµâÀ» ¸¸µé¸é µÈ´Ù.

[root@localhost swig]# swig -python hello.i
				
±×·¯¸é ÇöÀç µð·ºÅ丮¿¡ hello_wrap.c ¶ó´Â ÆÄÀÏÀÌ »ý±æ°ÍÀÌ´Ù. ÀÌÁ¦ ¹Ì¸®¸¸µé¾î ³õÀº hello.c ¿Í hello_wrap.c ¸¦ ÀÌ¿ëÇØ¼­ ¶óÀ̺귯¸®¸¦ ¸¸µéµµ·Ï ÇÑ´Ù. include µð·ºÅ丮´Â ½Ã½ºÅÛ¿¡ µû¶ó¼­ ´Ù¸¦¼ö ÀÖ´Ù.
[root@localhost swig]# gcc -c hello.c hello_wrap.c -I/usr/include/python1.5 -I/usr/lib/python1.5/config
				
±×·¯¸é hello.o ¿Í hello_wrap.o ÆÄÀÏÀÌ ¸¸µé¾î Á³À»°ÍÀÌ´Ù. ¸¸µé¾îÁø object ÆÄÀÏÀ» ld ¸í·É¾î¸¦ ÀÌ¿ëÇØ¼­ °øÀ¯¶óÀ̺귯¸® ÇüÅ·Π¸¸µéÀÚ
[root@localhost swig]# ld -shared hello.o hello_wrap.o -o hellomodule.so
				
ÀÌ·Î½á ¸ðµç ÀÛ¾÷ÀÌ ³¡³µ´Ù. ÀÌÁ¦ python ¿¡¼­ ¸ðµâ·Î½á »ç¿ë°¡´ÉÇÏ´Ù.
[root@localhost swig]# python
Python 1.5.2 (#1, Oct 13 2001, 09:06:03)  [GCC 2.96 20000731 (Red Hat Linux 7.1 2 on linux-i386
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import hello
>>> hello.echo()
Hello World!!
				
¾î¶²°¡ ³Ê¹« °£´ÜÇÏÁö ¾ÊÀº°¡ ? ÀÌ·¸°Ô ÇØ¼­ ¾ÆÁÖ °£´ÜÇÏ°Ô C ÀÇ ÇÔ¼ö¸¦ python ¿¡¼­ »ç¿ë°¡´ÉÇÑ ¸ðµâ·Î ¸¸µé¾ú´Ù.


2.2.3절. Perl module ¸¸µé±â

Perl module ¿ª½Ã Python module ¸¦ ¸¸µå´Â°Í°ú °°Àº ¼ø¼­·Î ¸¸µé¼ö ÀÖ´Ù.

[root@localhost swig]# swig -perl5 hello.i 
[root@localhost swig]# gcc -c hello.c hello_wrap.c -I/usr/lib/perl5/5.6.0/i386-linux/CORE
[root@localhost swig]# ld -G hello.o hello_wrap.o -o hello.so
				
½ÇÁ¦·Î Perl ¿¡¼­ À̿밡´ÉÇÑÁö È®ÀÎÇØ º¸µµ·Ï ÇÏÀÚ.
[root@localhost swig]# perl
use hello
hello::echo();
Hello World!!
...
				
¿ª½Ã Á¦´ë·Î Àß ÀÛµ¿ÇÑ´Ù.


2.2.4절. C++ À» module ·Î ¸¸µé±â

2.2.4.1절. Class ÀÇ »ç¿ë

C++ ÀÇ °æ¿ì´Â C ¿Í´Â ´Þ¸® ¸î°¡Áö ½Å°æ½áÁà¾ß ÇÒ°ÍÀÌ ÀÖ´Ù. ƯÈ÷ class ÀÇ °æ¿ì¿¡´Â ´Ü¼øÈ÷ ÇÔ¼ö¸¸ È£ÃâÇÑ´Ù°í µÇ´Â°Ô ¾Æ´Ï°í, class ¸¦ ÀÌ¿ëÇØ¼­ °´Ã¼¸¦ »ý¼ºÇÏ°í °´Ã¼ÀÇ ¸Þ¼­µå¸¦ ºÒ·¯¿Í¾ß µÈ´Ù.

¸Ó ±×·¸´Ù°í ÇØ¼­ Interface ¸¦ ¸¸µé°Å³ª module ¸¦ ¸¸µå´Â ¹æ¹ýÀÌ Å©°Ô Â÷À̰¡ ³ª´Â°Ç ¾Æ´Ï´Ù. ÀÏ´Ü ´ÙÀ½°ú Äڵ带 python module ·Î ¸¸µé¾îº¸µµ·Ï ÇÏÀÚ.

¿ì¸®°¡ ¸¸µé C++ ÄÚµå´Â 2°³ÀÇ ¼ýÀÚ¸¦ ÀԷ¹޾Ƽ­ ¸â¹öº¯¼ö·Î ÀúÀåÇÏ°í °¢°¢ µ¡¼À, °ö¼À, »¬»ùÀ» ÇÏ´Â 3°³ÀÇ ¸Þ¼­µå¸¦ ÀÌ¿ëÇØ¼­ °¢ ¿¬»êÀÇ °á°ú °ªÀ» µÇµ¹·ÁÁÖ´Â ÀÏÀ» ÇÑ´Ù. ÀÌ ÇÁ·Î±×·¥Àº 2°³ÀÇ ÆÄÀÏ·Î ±¸¼ºµÈ´Ù. ÆÄÀÏÀ̸§Àº °¢°¢ cal.h ¿Í cal.cc ·Î ÇϰڴÙ. ¸ÕÀú cal.h ÀÌ´Ù.

class Cal
{
    private:
        int a, b;
    public:
        Cal(){;}
        void Set(int, int);
        int  Sum();
        int  Mul();
        int  Min();
};
				
´ÙÀ½Àº cal.cc ÆÄÀÏÀÌ´Ù.
#include "hello.h"

void Cal::Set(int d1, int d2)
{
    a = d1;
    b = d2; 
}

int Cal::Sum()
{
    return a +  b;
}

int Cal::Mul()
{
    return a * b;
}

int Cal::Min()
{
    return a - b;
}
					
ÀÌÁ¦ cal.i ¶ó´Â À̸§À» °¡Áö´Â interface ÆÄÀÏÀ» ¸¸µé¾î º¸ÀÚ.
[root@localhost c++]# swig -c++ -python cal.i 
					
ÀÌÁ¦ ÄÄÆÄÀÏ °úÁ¤À» °ÅÃļ­ calmodule.so ¶ó´Â À̸§ÀÇ ¶óÀ̺귯¸®¸¦ »ý¼ºÇϵµ·Ï ÇÏÀÚ.
[root@localhost c++]# g++ -c -fpic cal.cc cal_wrap.cxx -I/usr/include/python1.5 
-I/usr/lib/python1.5/config
[root@localhost c++]# g++ -shared hello.o hello_wrap.o -o calmodule.so
					

ÀÌ·¸°Ô ÇØ¼­ ¿ì¸®´Â python ¸ðµâÀ» ¸¸µé¾ú´Ù. ÀÌÁ¦ ½ÇÁ¦·Î Å×½ºÆ®¸¦ ÇØº¸µµ·Ï ÇÏÀÚ.

[root@localhost c++]# python
Python 1.5.2 (#1, Oct 13 2001, 09:06:03)  [GCC 2.96 20000731 (Red Hat Linux 7.1 2 on linux-i386
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import cal
>>> c = cal.new_Cal()
>>> cal.Cal_Set(c, 100, 200) 
>>> print cal.Cal_Min(c)
-100
>>> print cal.Cal_Sum(c)
300
>>> print cal.Cal_Mul(c)
20000
>>> 
					
À§ÀÇ python Äڵ带 º¸¸é ¾Ë°ÚÁö¸¸ ±âÁ¸ÀÇ C ¿Í´Â ¾à°£ ´Ù¸£´Ù´Â°É ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù. ¿ì¼± Cal class ÀÇ °´Ã¼¸¦ ¸¸µé¾î¾ß Çϴµ¥, new_classname ÀÇ Çü½ÄÀ¸·Î ÀÛ¼ºµÈ´Ù. ¿ì¸®°¡ ¸¸µé¾î¾ßÇÒ °´Ã¼ÀÇ class À̸§Àº CalÀÓÀ¸·Î new_Cal() °ú°°Àº ¹æ¹ýÀ¸·Î ¸¸µé¾î¾ß ÇÒ°ÍÀÌ´Ù. ÀÌ·¸°Ô ÇØ¼­ c ·Î Cal Ŭ·¡½º¸¦ ÇÒ´ç¹Þ¾Ò´Ù. ÀÌÁ¦ Ŭ·¡½º ¸â¹öÇÔ¼öµéÀ» »ç¿ëÇØ¾ß Çϴµ¥ »ç¿ë¹æ¹ýÀº classname_methodname(°´Ã¼º¯¼ö, ¾Æ±Ô¸ÕÆ®) ÀÌ µÈ´Ù. ±×·¯¹Ç·Î CalÀÇ Set ¸Þ¼­µå¸¦ »ç¿ëÇϱâ À§Çؼ­´Â Cal_Set(c, 100, 200) ÀÌ·±½ÄÀ¸·Î »ç¿ëÇØ¾ß ÇÒ°ÍÀÌ´Ù.

c++ Ŭ·¡½ºÀÇ °æ¿ì »ç¿ë¹æ¹ýÀÌ ¾à°£ ƯÀÌÇϱä ÇÏÁö¸¸ »ç¿ëÇϴµ¥ Å©°Ô ¾î·Á¿òÀº ¾øÀ»°ÍÀÌ´Ù.


2.2.4.2절. ÀÌ¿ÜÀÇ °Íµé

STL°ú, ±¸Á¶Ã¼, enum °ú °°Àº ÀÚ·áÇüÀ» ¾î¶»°Ô ½á¾ßÇÏ´ÂÁö´Â swig ¸Þ´º¾óÀ» ã¾Æº¸±â ¹Ù¶õ´Ù. swig ¸¦ ¹ÞÀ¸¸é Example ÆÄÀϵéÀÌ ÀÖÀ¸¸ç, ¿©±â¿¡´Â ÀÌ·¯ÇÑ °¢°¢ÀÇ ÀڷᱸÁ¶¿Í ¶óÀ̺귯¸®¸¦ ¾î¶»°Ô ÇØ¼­ python À̳ª Perl µî¿¡¼­ »ç¿ëÇÒ¼ö ÀÖ´ÂÁö¿¡ ´ëÇÑ ¹æ¹ýÀ» ¿¹¸¦µé¾î¼­ ¼³¸íÇϰí ÀÖ´Ù.


3절. Pop üũÇÁ·Î±×·¥À» ¸¸µé¾î º¸ÀÚ

À̹ø¿¡´Â swig ¸¦ ÀÌ¿ëÇÑ º»°ÝÀûÀÎ ÀÀ¿ëÀ» ÇØº¸µµ·Ï ÇϰڴÙ. À̹ø¿¡ ¸¸µé ÀÀ¿ëÀº pop3 ¼­¹ö¿¡ ¸î°³ÀÇ ¸ÞÀÏÀÌ µµÂøÇß´ÂÁö¸¦ È®ÀÎÇÏ´Â ÇÁ·Î±×·¥Àε¥, ¿ì¸®´Â ÀÌ¹Ì POP3 ¸ÞÀÏ Ã¼Å© ÇÁ·Î±×·¥ ¸¸µé±â ¿¡¼­ ´Ù·ç¾îº»ÀûÀÌ ÀÖ´Ù.

À§ÀÇ ¿¹Á¦ ÇÁ·Î±×·¥Àº C ¿Í Python À» ¿¬°á½Ã۱â À§Çؼ­ pipe ¸¦ »ç¿ëÇߴµ¥, ¿ØÁö ¿¬°áÀÌ Á» ºÒ¿ÏÀüÇØ º¸ÀδÙ. ±×·¡¼­ C ¿¡¼­ ¸ÞÀϼýÀÚ °¡Á®¿À´Â ºÎºÐÀ» ¾Æ¿¹ python ¸ðµâ·Î ¸¸µé¾î¼­ python °ú ºÎµå·´°Ô ¿¬°áÇϵµ·Ï ÇÒ°ÍÀÌ´Ù. ÀÌ ¿¬°áÀº swig ¸¦ ÀÌ¿ëÇÒ°ÍÀÌ´Ù.


3.1절. pop üũ¸¦ À§ÇÑ python ¸ðµâ Á¦ÀÛ

¿ì¼± ¸ÞÀÏ ¼ýÀÚ¸¦ °¡Á®¿À±â À§ÇÑ C Äڵ带 ¸¸µé¾î¾ß ÇÑ´Ù. ÀÌ ÄÚµå´Â pop.h ¿Í pop.c 2°³ÀÇ ÆÄÀÏ·Î ÀÌ·ç¾îÁø´Ù.

pop.h

#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
    
int get_mail_num(char *address, int port, char *id, char *passwd);
int put_command(char *command, FILE *fp_in);
		

pop.c

#include "pop.h"

char buf_in[255];
int get_mail_num(char *address, int port, char *id, char *passwd)
{
    int client_len;
    int client_sockfd;
    int mail_num;
    FILE *fp_in;
    char command[255];
    char blank[25];
    
    struct sockaddr_in clientaddr;

    client_sockfd = socket(AF_INET, SOCK_STREAM, 0);
    clientaddr.sin_family = AF_INET;
    clientaddr.sin_addr.s_addr = inet_addr(address);
    clientaddr.sin_port = htons(port);
    client_len = sizeof(clientaddr);

    if (connect(client_sockfd, (struct sockaddr *)&clientaddr, client_len)<0)
    {
        return -1;
    }
    fp_in = fdopen(client_sockfd, "r+");
    if(put_command(NULL, fp_in) != 1) 
    {
        printf ("Á¢±Ù ¿¡·¯
");
    }

    memset(command, 0x00, 255);
    sprintf(command, "user %s
", id);

    if (put_command(command, fp_in) != 1)
        return -2;

    sprintf(command, "pass %s
", passwd);
    if (put_command(command, fp_in) != 1)
        return -2;

    if (put_command("stat
", fp_in) != 1) 
        return -3;

    sscanf(buf_in,"%s%d",blank,&mail_num);
    return mail_num;    
}

int put_command(char *command, FILE *fp_in)
{
    if (command != NULL)
        fputs(command, fp_in);

    fgets(buf_in, 255, fp_in);
    if (strncasecmp(buf_in, "+ok", 3) == 0)
        return 1;
    return 0;
}
			

ÀÌÁ¦ swig ¸¦ ÀÌ¿ëÇØ¼­ python ¸ðµâÀ» ¸¸µé¾î º¸µµ·ÏÇÏÀÚ.

/* pop.i */
%module pop

%{
#include "pop.h"
%}

%include "pop.h"
			
[root@localhost pop]# swig -python pop.i 
[root@localhost pop]# gcc -c -fpic pop.c pop_wrap.c  -I/usr/include/python1.5 -I/usr/lib/python1.5/config
[root@localhost pop]# gcc -shared pop.o pop_wrap.o -o popmodule.so
			

ÀÌÁ¦ python À» ÀÌ¿ëÇØ¼­ Å×½ºÆ® ÇØº¸µµ·Ï ÇÏÀÚ. ¹°·Ð Å×½ºÆ®ÇÒ¼ö ÀÖ´Â pop °èÁ¤ÀÌ ÁغñµÇ¾îÀÖ¾î¾ß ÇÒ°ÍÀÌ´Ù. ÇÊÀÚÀÇ °æ¿ì´Â Linux ¹Ú½º¿¡ qpopper À» ¼³Ä¡Çؼ­ Å×½ºÆ® ÇØº¸¾Ò´Ù.

[root@localhost pop]# python
Python 1.5.2 (#1, Oct 13 2001, 09:06:03)  [GCC 2.96 20000731 (Red Hat Linux 7.1 2 on linux-i386
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import pop
>>> print pop.get_mail_num("127.0.0.1", 110, "yundream", "1234")
1
			
Á¦´ë·Î ÀÛµ¿ÇÔÀ» ¾Ë¼ö ÀÖ´Ù. ±×·¸´Ù¸é ÀÌÁ¨ wxpython À» ÀÌ¿ëÇØ¼­ pop ¸ÞÀÏÀ» °¡Á®¿À´Â GUI ÀÀ¿ë ÇÁ·Î±×·¥À» ¸¸µé¾î º¸µµ·Ï ÇϰڴÙ.


3.2절. wxpython À» ÀÌ¿ëÇÑ GUI ÇÁ·Î±×·¡¹Ö

´ÙÀ½Àº ¿ÏÀüÇÑ ÇÁ·Î±×·¥Àº ¾Æ´Ï´Ù. ÇÁ·Î±×·¥ Á¾·á½Ã ¾²·¹µå¸¦ ¾î¶»°Ô ó¸®ÇØ¾ß ÇÒÁö¸¦ ¸í½ÃÇÏÁö ¾Ê¾Ò´Ù. ¾Æ¸¶µµ EVENT ¸¦ ÀÌ¿ëÇØ¼­ ȤÀº Á» º¹ÀâÇÏ°Ô ÇÑ´Ù¸é mutex Àá±ÝµîÀ» ÀÌ¿ëÇØ¼­ ÇØ°á°¡´ÉÇϰÚÁö¸¸ À̰ÍÀÇ Ã³¸®´Â °¢ÀÚÀÇ ¸òÀ¸·Î ³²°Ü ³õ°Ú´Ù.

#!/usr/bin/python
from wxPython.wx import * 
from threading import *
import time, sys, os, pop 

EVT_RESULT_ID = wxNewId()

def EVT_RESULT(win, func):
	win.Connect(-1, -1, EVT_RESULT_ID, func)

class ResultEvent(wxPyEvent):
	def __init__(self, data):
		wxPyEvent.__init__(self)
		self.SetEventType(EVT_RESULT_ID)
		self.data = data 

class MainFrame(wxFrame):
	def __init__(self, parent, id):
		wxFrame.__init__(self, parent, id, 'pop test', size=(100, 20))
		self.status = wxStaticText(self, -1, '', pos=(0, 100))
		EVT_RESULT(self, self.OnResult)
		EVT_CLOSE(self, self.OnExit)

		self.worker=MyThread(self)
		self.worker=None

	def OnResult(self, event):
		self.status.SetLabel('µµÂøÇѸÞÀÏ: %d' % pop.get_mail_num("127.0.0.1", 110, "yundream", "1234"))

	def OnExit(self, event):
		self.Destroy()

class MyThread(Thread):
	def __init__(self, notify_window):
		Thread.__init__(self)

		self._notify_window = notify_window
		self.start()

	def run(self):
		while 1:
			wxPostEvent(self._notify_window,ResultEvent(1))
			time.sleep(1)


class MainApp(wxApp):
	def OnInit(self):
		self.frame = MainFrame(NULL, -1)
		self.frame.Show(true)
		self.SetTopWindow(self.frame)
		return true;

app = MainApp(0)
app.MainLoop()

			


4절. °á·Ð

ÀÌ»ó swig ¿¡ ´ëÇÑ ³»¿ëÀ» ¼ö¹Ú °ÑÇӱ⠽ÄÀ¸·Î ÈÈ¾î º¸¾Ò´Ù. ±×·¸±ä ÇÏÁö¸¸ swig ¸¦ ¾î¶³¶§ À¯¿ëÇÏ°Ô »ç¿ëÇÒ¼ö ÀÖÀ»·±Áö¿¡ ´ëÇÑ °¨À» Àâ¾ÆÁֱ⿡´Â ÃæºÐÇÑ Á¤µµÀÇ ³»¿ëÀ̶ó°í »ý°¢µÈ´Ù.

swig ¸¦ ÀÌ¿ëÇÏ¸é ´Ù¸¥ À¯¿ëÇÑ ½ºÅ©¸³Æ® ¾ð¾îµé°ú C, C++ À» °áÇÕÇÏ¿©, ºü¸£°í ¼Õ½±°Ô ÀÛ¼ºÇÒ¼ö ÀÖÀ¸¸é¼­µµ C/C++ ¾ð¾îÀÇ Æ¯Â¡ÀÎ È¿À²¼º°ú ½î½ºÄÚµå °¨ÃãµîÀÇ ±â´É±îÁöµµ °¡Áö´Â ÇÁ·Î±×·¥ÀÇ Á¦ÀÛÀÌ °¡´ÉÇÏ´Ù.

ÀÌ ±â»çÀÇ ³»¿ëÀ» °¡Áö°í ¾î¶»°Ô ½ÇÁ¦ ȯ°æ¿¡¼­ ½á¸Ô°í, °¡Áö°í ³î°ÇÁö´Â ¿©·¯ºÐÀÇ Çϱ⳪¸§¿¡ ´Þ·ÁÀÖ´Ù°í »ý°¢µÈ´Ù. ¾Æ¹«ÂÉ·Ï swig ¸¦ Àß ÀÌ¿ëÇØ¼­ ¸ÚÁø °³¹ßȯ°æÀ» Çѹø ±¸ÃàÇØ º¸±æ ¹Ù¶ó´Â ¹ÙÀÌ´Ù.

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.