ÀÚ¹Ù¿Í C/C++ °£ÀÇ µ¥ÀÌÅÍ Åë½Å
author : Yoon Kyung Koo(yoonforh@yahoo.com)
Copyright (c) 1999-2000 Yoon Kyung Koo, All rights reserved.
ÀÚ¹Ù ÇÁ·Î±×·¥°ú C/C++ ÇÁ·Î±×·¥ »çÀÌ¿¡ µ¥ÀÌÅÍ Åë½Å(ÁÖ·Î ¼ÒÄÏÀ» »ç¿ëÇÏ°ÚÁö¿ä...)À» ÇÒ ¶§¿¡´Â
ÀÚ¹ÙÀÇ °´Ã¼ ½ºÆ®¸²(java.io.Serializable or java.io.ExternalizableÀ» ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ°í
ObjectInput/OutputStream »ç¿ë)À» »ç¿ëÇÒ ¼ö°¡ ¾ø½À´Ï´Ù.
ÀÚ¹ÙÀÇ °´Ã¼ ½ºÆ®¸²Àº ÀÚ¹Ù¿¡ °íÀ¯ÇÑ Çü½ÄÀ» »ç¿ëÇϱ⠶§¹®¿¡ C/C++ ÇÁ·Î±×·¥ÀÌ ÀÌÇØÇÒ ¼ö ¾ø±â
(¾î·Æ±â?) ¶§¹®ÀÔ´Ï´Ù.
µû¶ó¼ ÀÚ¹Ù¿Í C/C++ ÇÁ·Î±×·¥ »çÀÌ¿¡¼ µ¥ÀÌÅ͸¦ ÁÖ°í ¹ÞÀ¸·Á¸é ±âº» À¯ÇüÀ¸·Î º¯È¯ÇÏ¿©
ÁÖ°í ¹ÞÀ» ¼ö¹Û¿¡ ¾ø½À´Ï´Ù.
¿¹¸¦ µé¾î ´ÙÀ½°ú °°Àº Çʵåµé·Î ±¸¼ºµÈ Àڹ٠Ŭ·¡½º¸¦ C/C++ ÇÁ·Î±×·¥°ú ÁÖ°í ¹Þ´Â´Ù°í
»ý°¢Çغ¾½Ã´Ù.
class TestData {
byte[] bytes = new byte[100] ;
char c; // assume this char value will not excced one byte (i.e. cannot use Hangul char)
boolean val;
String string;
}
´ëÀÀµÇ´Â C/C++ µ¥ÀÌÅÍ ±¸Á¶Ã¼¸¦ ´ÙÀ½°ú °°ÀÌ »ý°¢ÇÒ ¼ö ÀÖ°Ú½À´Ï´Ù.
typedef struct {
char bytes[100];
char c; // ¹°·Ð ÀÌ·¸°Ô ±¸ÇöÇÏ¸é ¾ÈµË´Ï´Ù. CÀÇ ±¸Á¶Ã¼ alignment¿¡ µû¶ó
// »ç¿ëµÇÁö ¾Ê´Â ¸î ¹ÙÀÌÆ®°¡ ä¿öÁö°Ô µË´Ï´Ù.
bool val; // º¸Åë C++ÀÇ bool À¯ÇüÀº intó·³ 4¹ÙÀÌÆ®Áö¸¸ ÄÄÆÄÀÏ·¯¿Í O/S¿¡ µû¶ó ´Ù¸¨´Ï´Ù.
// ¿¹¸¦ µé¾î 64ºñÆ® ¸Ó½ÅÀÎ µðÁöÅÐ À¯´Ð½º 4.0ÀÇ g++ 2.95¿¡¼ boolÀº 8¹ÙÀÌÆ®¸¦
// Â÷ÁöÇÕ´Ï´Ù. (°°Àº ±â°è¿¡¼ cxxÀÇ °æ¿ì 4¹ÙÀÌÆ®¸¦ Â÷ÁöÇÕ´Ï´Ù.)
int str_length; // ¹®ÀÚ¿ÀÇ ±æÀÌ
char * string;
} Object ;
ÀÌ·² °æ¿ì¿¡ ¹ß»ýÇÏ´Â ¹®Á¦´Â ¿©·¯ °¡Áö°¡ ÀÖÀ» ¼ö ÀÖ½À´Ï´Ù.
1. C/C++¿¡¼ structure°¡ Â÷ÁöÇÏ´Â °¢ ÇʵåµéÀÇ ¹ÙÀÌÆ® ¼ö...
À§ÀÇ °æ¿ìó·³ char°¡ Áß°£¿¡ È¥ÀÚ µé¾î°¡°Ô µÇ¸é 3¹ÙÀÌÆ®°¡ µ¡ºÙ´Â °æ¿ì°¡ »ý±â°Ô µË´Ï´Ù.
2. °¢ ±âº» À¯ÇüµéÀÇ µ¥ÀÌÅÍ ±æÀÌ...
ÀÚ¹Ù´Â °íÁ¤µÇ¾î ÀÖÁö¸¸ C/C++ÀÇ °æ¿ì¿¡´Â ÄÄÆÄÀÏ·¯¿Í O/S µî¿¡ µû¶ó Â÷ÀÌ°¡ ³³´Ï´Ù.
¿¹¸¦ µé¾î longÀÇ °æ¿ì ÀÚ¹Ù´Â 8¹ÙÀÌÆ®ÀÌÁö¸¸ C/C++ÀÇ °æ¿ì ¿î¿µ üÁ¦¿¡ µû¶ó 4¹ÙÀÌÆ®¿Í 8¹ÙÀÌÆ®°¡
°¢°¢ »ç¿ëµÉ ¼ö ÀÖ½À´Ï´Ù.
GNUÀÇ C/C++ ÄÄÆÄÀÏ·¯¸¦ »ç¿ëÇϸé 8¹ÙÀÌÆ® À¯ÇüÀÎ long long¸¦ »ç¿ëÇÏ¿© ÀÚ¹ÙÀÇ
long¿¡ ´ëÀÀ½Ãų ¼ö ÀÖ½À´Ï´Ù.
À§ ¿¹Á¦¿¡¼´Â bool À¯Çü(º¸Åë 4¹ÙÀÌÆ®Áö¸¸ ¾î¶² ÄÄÆÄÀÏ·¯/¿î¿µÃ¼Á¦¿¡¼´Â 8¹ÙÀÌÆ®·Î ó¸®),
int À¯Çü(16ºñÆ® ¿î¿µÃ¼Á¦¿¡¼´Â 2¹ÙÀÌÆ®·Î ó¸®), char *¿Í °°Àº ÁÖ¼Ò À¯Çü(CPU Á¾·ù¿¡ µû¶ó
2¹ÙÀÌÆ®, 4¹ÙÀÌÆ®, 8¹ÙÀÌÆ® µîÀ¸·Î ó¸®) µîÀÌ C/C++ ÂÊ¿¡¼ ÁÖÀÇÇØ¾ß ÇÒ À¯ÇüÀÔ´Ï´Ù.
3. short, int, long µîÀÇ ¹ÙÀÌÆ® ¼ø¼
ÀÚ¹Ù´Â ³×Æ®¿÷ ¼ø¼(ºò ¿£µð¾È)·Î °íÁ¤µÇ¾î ÀÖÁö¸¸ C/C++ÀÇ °æ¿ì¿¡´Â CPU À¯Çü¿¡ µû¶ó
´Þ¶óÁö¹Ç·Î ¹Ýµå½Ã º¸Á¤ÇØÁà¾ß ÇÕ´Ï´Ù.
¸¸¾à ÀÚ¹ÙÂÊ¿¡¼ ¸®Æ² ¿£µð¾ÈÀ¸·Î º¯È¯ÇÏ¿© º¸³»·Á¸é htonl/htons ±â´ÉÀ» ÇÏ´Â ¸Þ¼Òµå¸¦
±¸ÇöÇÏ¿©¾ß ÇÕ´Ï´Ù.
Âü°í : ÀÚ¹Ù ±âº» À¯ÇüÀÇ ¹ÙÀÌÆ® ¼ø¼ º¯È¯
4. charÀÇ ÀÎÄÚµù...
ÀÚ¹Ù´Â StringÀ» ³»ºÎÀûÀ¸·Î À¯´ÏÄڵ带 »ç¿ëÇÏ´Ï±î ¹ÙÀÌÆ®·Î º¯È¯ÇÏ¿© C/C++¿Í ÁÖ°í¹Þ¾Æ¾ß ÇÕ´Ï´Ù.
ƯÈ÷ Çѱ۰ú °°Àº 2¹ÙÀÌÆ® ¹®ÀÚ¸¦ »ç¿ëÇÒ ¶§¿¡´Â ´õ¿í Áß¿äÇÕ´Ï´Ù.
DataOutput ȤÀº ObjectOutputÀÇ void writeBytes(String)°ú °°Àº ¸Þ¼Òµå´Â
¹«Á¶°Ç ¹®ÀÚ¸¦ 1¹ÙÀÌÆ®·Î ó¸®ÇÏ¿© ¾²¹Ç·Î 2¹ÙÀÌÆ® ¹®ÀÚ°¡ »ç¿ëµÉ °æ¿ì¿¡´Â »ç¿ëÇÏÁö ¸»¾Æ¾ß ÇÒ
¸Þ¼ÒµåÀÔ´Ï´Ù.
(StringÀÇ length()¿Í ¹®ÀÚ¿À» ¹ÙÀÌÆ®¿·Î º¯È¯ÇÑ byte[]ÀÇ length °ªÀÌ ´Ù¸¦ ¼ö ÀÖ´Ù´Â °Ç ¾Æ½ÃÁö¿ä?)
´ÙÀ½Àº °£´ÜÇÑ ¿¹Á¦ÀÔ´Ï´Ù. °£´ÜÇÏ°Ô ÆÄÀÏÀ» »ç¿ëÇÑ ¿¹ÀÔ´Ï´Ù.
ÀÚ¹Ù ÇÁ·Î±×·¥ÀÌ µ¥ÀÌÅ͸¦ ÆÄÀÏ·Î ¾²°í, C++ ÇÁ·Î±×·¥ÀÌ ±× ÆÄÀÏÀ» Àд °ÍÀÌÁö¿ä.
C++ ÇÁ·Î±×·¥Àº À§¿¡¼ ¸»¾¸µå¸° ¿©·¯ °¡Áö ÀÌÀ¯·Î ¿î¿µ üÁ¦¿¡ µû¶ó ¼öÁ¤ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.
Á¦°¡ Å×½ºÆ®ÇÑ ¿î¿µÃ¼Á¦´Â ¼Ö¶ó¸®½º 2.6ÀÔ´Ï´Ù.
ÄÄÆÄÀÏ
javac -encoding EUC_KR FileIOTest.java
g++ -o tester FileIOTest.C
½ÇÇà
java FileIOTest file.dat
tester file.dat
½ÇÇà °á°ú
´ÙÀ½ ÆÄÀÏÀ» ÂüÁ¶Çϼ¼¿ä...
result.txt
´ÙÀ½Àº °£´ÜÇÑ ¼ÒÄÏ ¿¹Á¦ÀÔ´Ï´Ù. ¼¹ö¸¦ À¯´Ð½º¿¡¼ c·Î ÀÛ¼ºÇÑ ÇÁ·Î±×·¥À» »ç¿ëÇÏ°í Ŭ¶óÀ̾ðÆ®¸¦ ÀÚ¹Ù·Î ÀÛ¼ºÇÕ´Ï´Ù.
C ÇÁ·Î±×·¥Àº À§¿¡¼ ¸»¾¸µå¸° ¿©·¯ °¡Áö ÀÌÀ¯·Î ¿î¿µ üÁ¦¿¡ µû¶ó ¼öÁ¤ÇÒ ÇÊ¿ä°¡ ÀÖ½À´Ï´Ù.
Á¦°¡ Å×½ºÆ®ÇÑ ¿î¿µÃ¼Á¦´Â ¼Ö¶ó¸®½º 7ÀÔ´Ï´Ù.
ÄÄÆÄÀÏ
javac -encoding EUC_KR TestClient.java
gcc -o test_server test_server.c -lsocket -lnsl
½ÇÇà
(¼Ö¶ó¸®½º) test_server 10001 (ÀÎÀÚ´Â Æ÷Æ® ¹øÈ£ÀÔ´Ï´Ù.)
(Àڹ٠Ŭ¶óÀ̾ðÆ®) java TestClient hostname 10001 (hostnameÀº ½ÇÁ¦ ¼¹ö°¡ Àִ ȣ½ºÆ® À̸§)
½ÇÇà °á°ú
´ÙÀ½ ÆÄÀÏÀ» ÂüÁ¶Çϼ¼¿ä...
(¼¹öÂÊ)server_result.txt
(Ŭ¶óÀ̾ðÆ®ÂÊ)client_result.txt
ÀÌ ÆäÀÌÁö´Â 1999³â 9¿ù 10ÀÏ¿¡ óÀ½ ¸¸µé¾îÁö°í 2000³â 2¿ù 12ÀÏ¿¡ ÃÖÁ¾ °»½ÅµÇ¾ú½À´Ï´Ù.
Æ©Å丮¾ó ÆäÀÌÁö·Î µ¹¾Æ°¡±â
Last modified: Sat Feb 12 15:24:24 2000