Linux HighPerformance Network Server
| ¹®¼»óÅÂ
|
ÀÛ¼º: ÀÌÈ«±â(orinmir _at_ chonga _dot_ pe _dot_ kr)
ÀÛ¼ºÀÏ: 2001³â 6¿ù 10ÀÏ
¹®¼¹öÀü: 0.1.2
ÀúÀÛ±Ç: GPL
¼öÁ¤ÀÏ:
v0.1.0 ; 2001-06-10; ¹®¼ ÃÊ¾È ¿Ï¼º
v0.1.1 ; 2001-06-12; RT signal concurrent echo server example
v0.1.2 ; 2004-06-06; ÀϺΠ¿ÀÀÚ ¼öÁ¤
Æ÷±â°¢¼: ÀÌ ¹®¼´Â °³ÀÎÀûÀÎ ÀÚ·á Á¤¸®ÀÇ ¿ëµµ·Î ÀÛ¼ºµÇ¾úÀ¸¸ç, ÀÌ ¹®¼ÀÇ ³»¿ë¿¡ ´ëÇÑ ¸ðµç ±Ç¸®¸¦ Æ÷±âÇÔ. ¶ÇÇÑ ÀúÀ۱ǿ¡ ´ëÇÑ ºÐÀï ¹ß»ý½Ã, ÇØ´ç ³»¿ëÀº »èÁ¦Åä·Ï ÇÑ´Ù.
TODO: ÀÌ ¹®¼´Â ¾ÆÁ÷ draft»óÅ¿¡ ÀÖÀ¸¸ç, ´ëºÎºÐÀÇ ÀúÀÛÀÚ¿¡ ´ëÇÑ Á¤º¸¸¦ linkÇÏ·Á°í ÇÑ´Ù. ¹°·Ð ºüÁø ºÎºÐÀº º¸°ÇØ ³ª°¡°íÀÚÇÑ´Ù. Á»´õ À¯¿ëÇÑ ¿¹Á¦µéÀ» À§ÁÖ·Î °»½ÅÇÒ ¿¹Á¤ÀÌ´Ù.
|
| °³¿ä
|
Linux¿¡¼ÀÇ TCP/IP Socket ±â¹Ý °í¼º´É ¼¹ö¸¦ Á¦ÀÛÇÏ´Â ¹æ¹ý¿¡´Â °íÀüÀûÀÎ multiplexing
io(select, poll)¸¦ °¡Àå ¸¹ÀÌ »ç¿ëÇϴµ¥, ÀÌ´Â ¸Å¹ø kernel·ÎºÎÅÍ Àüü file descriptor ¸¦
Á¶»çÇÏ¿© setÀ» ¸¸µé¾î ¸®ÅÏÇϵµ·Ï ÇÏ´Â ¹æ½ÄÀ¸·Î high load Àϼö·Ï CPUÁ¡À¯À²°ú ÀÀ´ä½Ã°£ÀÌ
±æ¾îÁö´Â ´ÜÁ¡ÀÌ ÀÖ´Ù. ¹°·Ð À̸¦ »ç¿ëÇÏ¿© ¼¹öÇÁ·Î±×·¥À» Á¦ÀÛÇÏ¿©µµ 1000-3000¸í ¸¹°Ô´Â
5000°³ÀÇ Å¬¶óÀÌ¾ðÆ® Á¢¼ÓÀ» ó¸®ÇÒ ¼ö´Â ÀÖ´Ù°í º¸°íµÇ°í ÀÖ´Ù.
¿À´Ã³¯¿¡ ¿Í¼´Â ¿©·¯°¡Áö ¼º´ÉÇâ»óÀ» À§ÇÑ ½Ãµµ°¡ ÀÌ·ç¾îÁö°í Àִµ¥, ±âÁ¸ÀÇ poll¿¡
´ëÇÑ ¼º´ÉÇâ»óÀ» ²ÒÇÏ¿© /dev/poll¾Æ °°ÀÌ ÀåÄ¡ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÏ´Â ¹æ¹ý(solaris 8¿¡ µµÀԵǾú´Ù)°ú
±âÁ¸ÀÇ SIGIO¸¦ ÀÌ¿ëÇÑ °íÀüÀûÀÎ ¹æ¹ýÀ̿ܿ¡µµ Realtime(RT) signalÀ» ÀÌ¿ëÇÑ IO Completion signal
¹æ½ÄÀ¸·Î high load¿¡¼ÀÇ ³·Àº CPU Á¡À¯À²°ú
ºü¸¥ ÀÀ´ä½Ã°£, inactive client Á¢¼ÓÀÌ ¸¹¾ÆÁö´õ¶óµµ 󸮿¡ ¹®Á¦°¡ ¾øµµ·Ï Çϱâ À§ÇÑ ¹æ½ÄµéÀÌ
¿¬±¸µÇ°í ±¸ÇöµÇ°í ÀÖ´Ù.
Ÿ ¿î¿µÃ¼Á¦¿¡¼´Â FreeBSDÀÇ kqueue/kevent¿Í Windows°è¿ÀÇ IOCP(IO Completion Port)
µîÀÌ ÀÖÀ¸¸ç OS kernel³»¿¡ °ü½ÉÀÖ´Â ¼ÒÄϵ鿡 ´ëÇØ À̺¥Æ®¸¦ µî·ÏÇØ³õ°í kernel·ÎºÎÅÍ signalÀ»
±â´Ù¸®´Â ¹æ¹ýÀ¸·Î ±× ³»¿ëÀº °ÅÀÇ ´ëµ¿¼ÒÀÌÇÏ´Ù.
º» ¹®¼¿¡¼´Â ¸®´ª½º¿¡¼ÀÇ Linux(kernel 2.2.x ÀÌ»ó)¿¡¼ »ç¿ëÇÒ ¼ö ÀÖ´Â RT signal°ú
±âÁ¸ÀÇ pollÀ» °³¼±ÇÑ /dev/poll¿¡ ´ëÇØ À̾߱âÇØº¸°í
½ÇÁ¦ °í¼º´É ¼¹öÀÇ ¼ÒÄÏ ¸ðµ¨¿¡ ´ëÇØ¼µµ »ìÆìº¸±â·ÎÇÑ´Ù.
|
| select vs. poll
|
°íÀüÀûÀÎ bsd socketÀÇ multiplex io ó¸® ¹æ½ÄÀº select()¿Í poll()¿¡ ´ëÇÑ À̾߱â·Î´Â
poll()¹æ½ÄÀÌ select()¿¡ ºñÇØ Á»´õ ³·Àº CPUÁ¡À¯À²°ú ºü¸¥ ÀÀ´ä¼Óµµ·Î °í¼º´ÉÀÇ ¼¹öÇÁ·Î±×·¥¿¡¼
»ç¿ëµÇ°í ÀÖ´Ù´Â À̾߱âµéÀÌ ÀϹÝÀûÀÌ´Ù.
linuxÀÇ °æ¿ì 2.0Àü¿¡´Â poll()ÀÌ ±¸ÇöµÇ¾î ÀÖÁö ¾Ê¾Æ select() system callÀ» ¸ÅÇÎÇÏ¿© poll()À»
±¸ÇöÇÏ¿´À¸¸ç, 2.0ÀÌÈÄ¿¡´Â poll()ÀÌ ±¸ÇöµÇ¾î ¹Ý´ë·Î select()°¡ poll()ÀÇ ¸ÅÇÎ system call·Î
¹Ù²î¾ú´Ù.
±×·¸´Ù¸é ¿Ö? poll()¹æ½ÄÀÌ ´õ select()º¸´Ù È¿À²ÀûÀΰ¡? ½±°Ô »ý°¢Çϸé poll()ÀÌ Á»´õ
low levelÀÇ Ã³¸®·Î system callÀÇ È£ÃâÀÌ select()º¸´Ù Àû±â ¶§¹®ÀÌ´Ù. selectÀÇ °æ¿ì´Â ó¸®ÇϰíÀÚ
ÇÏ´Â socket¸¸À» °¨½ÃÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, max filedescriptor¸¸ÅÀ» Ç×»ó loop¸¦ µ¹¸ç ó¸®ÇؾßÇϰí
pollÀº ÀÌ¿¡ ºñÇØ ¿øÇÏ´Â ¸¸Å¸¸ max·Î ÁöÁ¤Çؼ ´Ã¾î³ª´Â ¸¸Å loop¸¦ µ·´Ù. ÇÏÁö¸¸ select()°¡ poll()
º¸´Ù »ç¿ëÇϱⰡ Á¶±Ý´õ ½±°í poll()À» ÀÌ¿ëÇÏ¿© select()¸¦ ±¸ÇöÇϱ⵵ ÇÑ´Ù.
pollÀÌ selectº¸´Ù È¿À²ÀûÀÌÁö¸¸ Á¢¼Ó¼ö°¡ ´Ã¾î³ª¸é ¿ÀÈ÷·Á fd´ç üũ ¸¶½ºÅ©ÀÇ Å©±â°¡ select´Â 3bitÀε¥
ºñÇØ, pollÀº 6Byte(À̺κРȮ½ÇÇÏÁø ¾ÊÀ½)Á¤µµÀ̹ǷΠ¾çÀÌ ¸¹¾ÆÁö¸é ¿ÀÈ÷·Á selectº¸´Ù ´õ ¸¹Àº overhead°¡
Á¸ÀçÇÏ¿© ¼º´ÉÀÌ ´õ ¶³¾îÁø´Ù´Â ÀÌ¿¡ ´ëÇÑ º¥Ä¡¸¶Å·µµ Á¸ÀçÇÑ´Ù. ƯÈ÷ ¸®´ª½º¿¡¼´Â ±×·¸´Ù´Â ¾ê±äµ¥,
ÀÌ·Î ÀÎÇØ ±×¸® ÁÁÀº ¼Ò¸®´Â µè°í ÀÖÁö ¸øÇϱäÇÏ´Ù.
°íÀüÀûÀÎ select/poll¿¡¼ÀÇ ¼º´É Çâ»ó ¹æ¹ýÀ¸·Î´Â multiple accept°¡ ÀÖ´Ù. ÀÌ ¹æ¹ýÀº
process fork¹æ½Ä¿¡¼ ¿¹¸¦ µéÀÚ¸é child¸¦ spawning½ÃÄÑ(listen poolÇü¼º), accept¸¦ ¹Þ¾Æ recv/send¸¦ ÇØÁÖ°í
²÷¾îÁÖ´Â ÀϹÝÀûÀÎ request-response-close·Î À̾îÁö´Â webserver styleÀÇ ±¸Çö ¹æ½ÄÀ̸ç, À̸¦
ÀÌ¿ëÇÑ º¥Ä¡¸¶Å·¿¡¼ ÁÁÀº È¿À²À» º¸À̰í ÀÖ´Ù.
¶ÇÇÑ °íÀüÀûÀÎ select, poll ÀÚü¿¡ ´ëÇÑ ¼º´É Çâ»ó ÆÐÄ¡µµ ¹°·Ð Á¸ÀçÇϰí ÀÖ´Ù.
examples: Unix Network Programming 2eÀÇ poll°ú select ±¸Çö¿¹Á¦, multiple accept, multiple accept2
articles: Select() vs. Poll(),
|
| /dev/poll
|
/dev/pollÀº poll()ÀÇ Ã³¸® ¹æ½ÄÀÌ kernel³»ÀÇ file descriptor ¸¦ ¸ðµÎ µÚÁ®¼ ÀÀ´ä setÀ»
±¸¼ºÇÏ´Â ¹æ½ÄÀÇ ºñÈ¿À²¼ºÀ» ±Øº¹Çϱâ À§ÇØ ³ª¿Â ¹æ½ÄÀ¸·Î ±âº»ÀûÀ¸·Î event driven¹æ½ÄÀ¸·Î
ÀÌ·ç¾îÁø pollÀÇ ¼º´É °³¼±¹æ½ÄÀÌ´Ù. pollÀ» ÀåÄ¡ ÀÔÃâ·Â ¹æ½ÄÀ¸·Î ¹Ù²Ù¾î³õÀº °ÍÀ̶ó°í º¼
¼ö ÀÖ´Ù. º¥Ä¡¸¶Å·¿¡¼ linux /dev/pollÀÌ ¼º´ÉÀÌ Á¦´ë·Î ³ª¿ÀÁö ¾Ê´Â ÀÌÀ¯´Â, /dev/pollÀÇ
±¸Çö¿¡ ¹ö±×°¡ ÀÖ´Ù´Â À̾߱⵵ ÀÖ´Ù.
patches: dev_poll kernel patch(kernel 2.2.14,/ kernel 2.4.3) from here
|
| RT Signal
|
Ä¿³Î 2.2¿¡¼ºÎÅÍ RealTime Signal(Posix RealTime Signal)À» Áö¿øÇϱ⠽ÃÀÛÇß´Ù.
±âÁ¸¿¡ signalÀ» ÀÌ¿ëÇÑ ³»¿ëÀ¸·Î sigio¸¦ ÀÌ¿ëÇÑ async io(Ÿ ¿î¿µÃ¼Á¦¿¡¼´Â aio_* function
calls·Î µÈ °Íµµ ÀÖÀ½)
¿¡¼ ¾²¿´°í 2.2°¡ ³ª¿À±âÀü±îÁö´Â ÆÐÄ¡¸¦ ÅëÇØ ºñµ¿±â io¸¦ »ç¿ëÇÒ ¼ö´Â ÀÖ¾ú´Ù.
sigio¸¦ ÀÌ¿ëÇÑ signal ±â¹Ý ¼ÒÄÏ ¼¹öÀÇ ¿¹Á¦µµ stevensÀÇ Unix Network Programming°°Àº ¼ÀûÀ»
ÅëÇØ¼µµ
¼Ò°³µÈ ¹ÙÀÖ´Ù. LinuxÀÇ RT signal¹æ½ÄÀº ±âÁ¸ signal ±â¹Ý ÇÁ·Î±×·¥µéº¸´Ù´Â Á»´õ Á¢±ÙÇϱ⠽¬¿î
¹æ¹ýÀ¸·Î PollÀ» ´ëüÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀÌ´Ù. (poll()¿¡¼ »ç¿ëÇÏ´Â POLL_IN, POLL_OUT, POLL_ERR µîÀ» ±×´ë·Î »ç¿ëÇÑ´Ù.)
RT SignalÀÇ ÀåÁ¡(ȤÀº sigio·Î ¸¸µé¾îÁø °ÍµéÀÇ ÀåÁ¡Àϼöµµ ÀÖ´Ù.)À̶ó¸é, signalÀ» µî·ÏÇØ³õ°í
ÇØ´çÇÏ´Â À̺¥Æ®°¡ ¹ß»ýÇϱâ Àü±îÁö´Â
µÇ°í sigwaitinfo system callÀ» ÅëÇØ ´ë±âÇϰí ÀÖ´Ù°¡, À̺¥Æ®°¡ ¹ß»ýÇϸé, Á¤ÇصРsignal handler¸¦
ÅëÇØ 󸮸¦ ÇÏ´Â ¹æ½ÄÀÌ´Ù.(¶ÇÇÑ timeoutµµ Áö¿øÇÑ´Ù.) ¹°·Ð ±âÁ¸ÀÇ ±¸Çö ¹æ½Ä¿¡ ºñÇØ ³·Àº
CPUÁ¡À¯À²°ú ºü¸¥ ÀÀ´ä ¼Óµµ, high load¿¡¼µµ
¾ÈÁ¤µÇ°í ÀϰüµÈ ¼º´ÉÀ» À¯ÁöÇϰí ÀÖ´Ù.
5000°³ÀÇ ¼ÒÄÏ Á¢¼Ó°ú high load¿¡¼µµ ±²ÀåÈ÷ ÁÁÀº ¼º´ÉÀ» ³»°í ÀÖ´Ù´Â º¸°í°¡ ÀÖ´Ù.
ÇÏÁö¸¸ RT SignalÀÇ ´ÜÁ¡Àº Á¦ÇÑµÈ signal resource·Î ÀÎÇØ, signal overflow°¡ µÇ¸é ´õÀÌ»ó
»õ·Î¿î Á¢¼ÓÀ» ó¸®ÇÒ ¼ö ¾ø°Ô µÈ´Ù. ÀÌ ¶§¿¡´Â ±âÁ¸ÀÇ poll()ÂÊÀ¸·Î 󸮸¦ µ¹·Á ÇØ°áÇÏ´Â
È¥ÇÕµÈ ±¸Çö ¹æ¹ýÀ» ¾²±âµµ ÇÑ´Ù.
À̸¦ ÇØ°áÇϱâÀ§ÇØ Vitaly¶ó´Â »ç¶÷ÀÌ Signal-per-fd¶ó´Â kernel patch¸¦ ³»³õ¾ÒÀ¸¸ç
±âÁ¸ÀÇ kernelÀÇ signal queue°¡ fdº°·Î multiple event¸¦ ¹Þ¾Æ³»¾î¾ß ÇϹǷÎ, high load½Ã¿¡
overflow°¡ ÀϾ ¼ö ÀÖ´Ù´Â ´ÜÁ¡¿¡ Âø¾È, fdº°·Î ´Ü ÇϳªÀÇ signal event¸¸À» °¡Áú ¼ö ÀÖµµ·Ï
°íÃÆ´Ù°í ÇÑ´Ù. À̸¦ ÀÌ¿ëÇÏ¿© ±âÁ¸ÀÇ ¹æ½Äµé°úÀÇ ¼º´É ºÐ¼®À» ÇÑ paper´Â ¾Æ·¡¿¡ ÀÖ´Ù.
ÇÑÆí, Linux RT Signal·Î ±¸ÇöµÈ °ÍÀ¸·Î´Â phhttpd°¡ ÀÖ´Ù.
ÃÖ±Ù ÇÊÀÚ°¡ Linux RT Signal(signal-per-fd´Â ¾ÆÁ÷ Ãß°¡ ±¸ÇöÁß)·Î ¸¸µç, ¿Ïº®ÇÑ(???) Concurrent Echo Server ¿¹Á¦¸¦ ¾Æ·¡(rtsig_echoserver.cpp)¿¡ ¸µÅ©Çسõ¾Ò´Ù.
examples: rtsig_echoserver.cpp, sigio_example
articles: Signal-per-fd release document,
patches: Signal-per-fd kernel 2.4.4 patch,
dynhash kernel patch
papers:
A scalable and explicit event delivery mechanism for UNIX [usenix99],
Scalability of Linux Event-Dispatch Mecanism [Signal-per-fd],
Linux Kernel Hash Table Behavior [ring buffer],
Scalable Network IO in Linux.pdf [RTsig]
Analyzing_the_Overload_Behavior_of_a_Simple_Web_Server[sigwaitinfo4]
|
| Server Frameworks
|
½ÇÁ¦·Î Socket ¼¹ö¸¦ Á¦ÀÛÇÒ ¶§¿¡´Â UNIX Network ProgrammingÃ¥À» º¸¸é, ¿©·¯°¡Áö ¼¹ö ¸ðµ¨ÀÌ
³ª¿À´Âµ¥, ±×Áß¿¡¼µµ °¡Àå ¸¹ÀÌ Âü°íÇÏ´Â ÂÊÀº concurrent socket serverÀÏ °ÍÀÌ´Ù. ÀÌ¿¡ ´ëÇÑ
±¸Çö ¹æ½ÄÀº ¼¹öÀÇ ¼º°Ý°ú ÆÐŶÀÇ ¼Û¼ö½Å ÇüÅ µî¿¡ µû¶ó, ±× ±¸Á¶¸¦ ¾î¶»°Ô °¡Á®°¡´À³Ä¿¡
¸¹Àº °ü½ÉÀÌ ÀÖÀ» °ÍÀÌ´Ù.
usenet newsgroupÀÇ comp.programing.threads³ª comp.unix.programmer µîÀ» °Ë»öÀ» ÇØº¸°Å³ª Áú¹®À»
¿Ã·Áº¸¸é, ´ëºÎºÐÀÇ ´äº¯Àº ´ÙÀ½°ú °°ÀÌ Á¤¸®µÉ ¼ö ÀÖ´Ù°í º»´Ù.
1. linux¿¡¼´Â 1000+ÀÇ Å¬¶óÀÌ¾ðÆ® Ã³¸®¿¡µµ ¹®Á¦°¡ ¾øÀ¸¸ç, ´ÜÁö ¹®Á¦°¡ µÈ´Ù¸é, RAMÀÇ Å©±âÀÌ´Ù.
2. linuxÀÇ ¼ÒÄÏ ¸ðµ¨Àº ÀϹÝÀûÀ¸·Î multiplexing io¸¦ »ç¿ëÇÏ¿©, select()º¸´Ù´Â poll()ÀÌ ´Ù¼Ò 󸮰¡
¸Å²ô·´°í ºü¸£´Ù. 3000°³ µ¿½Ã Á¢¼Ó Ŭ¶óÀ̾ðÆ®À̳»¶ó¸é
ÀÌ ±¸Á¶¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. ¸¸¾à 8000+Á¤µµ¸¦ ó¸®ÇؾßÇÑ´Ù¸é sigio¸¦ °í·ÁÇØº¼¸¸ ÇÏ´Ù.
3. ó¸® ¹æ½Ä¿¡ ÀÖ¾î, readÀü¿ë multiplexing io 1thread¿Í ´Ù¼ö°³ÀÇ writeÀü¿ë thread°¡ Á»´õ È¿À²ÀÌ
ÁÁ´Ù.
4. sigio³ª ¼º´É °³¼±µÈ poll()À» ¾²´Â °ÍÀÌ CPU »ç¿ëÀ²À̶ó´øÁö È¿À²ÀûÀÎ ¸®¼Ò½º »ç¿ëÀ»
À§Çؼ´Â ÁÁÀ» ¼öµµ ÀÖ´Ù. ÇÏÁö¸¸ linuxÀÇ /dev/poll ±¸Çö¿¡¼ ¹ö±×°¡ ÀÖ´Ù.
articles: 1000+ Client¿¡¼ °í·ÁÇÒÁ¡,
Which_is_more_faster_socket_model,
How can I multiple read() with threads
papers: Design Framework For highly Concurrent Systems, ACE frameworks
|
| Other Tuning Points
|
Linux¿¡¼´Â Beowulf Super Clustering Server ¿¡¼ »ç¿ëµÈ channel bondingÀ» kernel 2.4ºÎÅÍ´Â
Á¤½ÄÀ¸·Î Æ÷ÇÔ½ÃÄ×´Ù. channel bondingÀº ÇѸ¶µð·Î 2°³ÀÇ NICÀ» ÇϳªÀÇ NICó·³ »ç¿ëÇϵµ·Ï ÇÏ´Â
°ÍÀÌ´Ù. ±×¸®°í 2°³ÀÌ»óÀÇ NIC¸¦ »ç¿ëÇÏ´Â °æ¿ì, °Á¦·Î IRQ¸¦ sharingÀ» Çϵµ·Ï ÇÏ¸é ¼º´ÉÀÌ
³ª¾ÆÁø´Ù´Â ¼³ÀÌ Àִµ¥, ÀÌ¿¡ ´ëÇÑ ¹®ÇåÀº Á»´õ ã¾Æº¼ ¿¹Á¤ÀÌ´Ù. ¾Æ·¡´Â ÀÌ ¹®¼³»¿¡¼ ´Ù·çÁö
¾ÊÀº ¶Ç´Ù¸¥ Æ©´×¿¡ °ü·ÃµÈ »çÇ×À» ´Ù·ç°íÀÚÇÑ´Ù.
patches: fast socket close kernel 2.2.x patch,
improved malloc patch
tunning: zeus server os tunning guide
articles: How many thread can I use with Linux
|
| Patched Packages
|
KERNEL 2.4.5 with /dev/poll and signal-per-fd patched
: û¾Æ¿¡¼ »ç¿ëµÈ kernel 2.4.5 tarballÀÌ´Ù.
tarball: linux-2.4.5-chonga1.tar.gz
GLIBC v2.2.2 with pthread mysql tunning
: MAX_PTHREAD_NUM=4096, rpm4.0
: mysql siteÀÇ linux glibc-2.2.2 patch Àû¿ëÇØ¼ ´Ù½Ã ÆÐŰ¡Çß´Ù.
srpms: glibc-2.2.2-10.src.rpm
rpms: glibc-2.2.2-10.i386.rpm,
glibc-common-2.2.2-10.i386.rpm,
glibc-profile-2.2.2-10.i386.rpm,
glibc-devel-2.2.2-10.i386.rpm,
nscd-2.2.2-10.i386.rpm
|
| Other Links
|
Chuck Lever's Linux Scalability March/Aprial 2000 Status Report
Usenix symposium
Client 10000 project
linux¿¡¼ÀÇ dummy client socket Á¢¼Ó Å×½ºÆ®
|
|
|