¼ÒÄÏÀº ÇÁ·Î¼¼½º°£¿¡ ÀڷḦ ±³È¯ÇÏ´Â ¼ö´ÜÀÌ´Ù. ÇÁ·Î¼¼½º´Â °°Àº ÄÄÇ»ÅÍ¿¡ Àְųª ³×Æ®¿÷À¸·Î ¿¬°áµÈ ¼·Î ´Ù¸¥ ÄÄÇ»ÅÍ¿¡ ÀÖÀ» ¼ö ÀÖ´Ù. ¼ÒÄÏÀÌ ¿¬°áµÇ¸é ÇÑÂÊÀÌ ¿¬°áÀ» ´ÝÀ» ¶§±îÁö ¾çÆí ¸ðµÎ ÀڷḦ º¸³¾ ¼ö ÀÖ´Ù.
³ª´Â ÀÛ¾÷ÁßÀÎ ÇÁ·ÎÁ§Æ®¿¡ ¼ÒÄÏÀÌ ÇÊ¿äÇؼ ¼ÒÄÏ API ÇÔ¼ö¸¦ °¨½Î´Â C++ Ŭ·¡½º¸¦ °³¹ßÇÏ°í ´Ùµë¾ú´Ù. ÀϹÝÀûÀ¸·Î ÀڷḦ ¿äûÇÏ´Â ÇÁ·Î±×·¥À» Ŭ¶óÀ̾ðÆ®, ¿äû¿¡ ÀÀ´äÇÏ´Â ÇÁ·Î±×·¥À» ¼¹ö¶ó°í ÇÑ´Ù. ³»°¡ ¸¸µç ClientSocket°ú ServerSocket, ÁÖµÈ µÎ Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© Ŭ¶óÀ̾ðÆ®¿Í ¼¹ö°¡ ¼·Î ÀڷḦ ±³È¯ÇÒ ¼ö ÀÖ´Ù.
ÀÌ ±ÛÀÇ ¸ñÇ¥´Â ÇÁ·Î±×·¥¿¡¼ ClientSocket°ú ServerSocket Ŭ·¡½º¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» ¾Ë¸®´Â °ÍÀÌ´Ù. ¸ÕÀú Ŭ¶óÀ̾ðÆ®¿Í ¼¹ö°£ Åë½Å¿¡´ëÇØ °£´ÜÈ÷ ´Ù·é ´ÙÀ½, ÀÌ µÎ Ŭ·¡½º¸¦ »ç¿ëÇÏ¿© °£´ÜÇÑ ¼¹ö¿Í Ŭ¶óÀ̾ðÆ® ¿¹Á¦¸¦ ¸¸µé °ÍÀÌ´Ù.
ÄÚµå·Î µé¾î°¡±âÀü¿¡ ÀüÇüÀûÀΠŬ¶óÀ̾ðÆ®¿Í ¼¹ö°£ ¿¬°á ´Ü°è¸¦ °£´ÜÈ÷ »ìÆ캸ÀÚ. ´ÙÀ½ Ç¥´Â ´Ü°èµéÀ» º¸¿©ÁØ´Ù.
¼¹ö | Ŭ¶óÀ̾ðÆ® |
1. ±â´Ù¸®´Â ¼ÒÄÏ(listening socket)À» ¸¸µé°í Ŭ¶óÀ̾ðÆ®¿¡¼ ¿¬°áÀ» ±â´Ù¸°´Ù. | |
2. Ŭ¶óÀ̾ðÆ® ¼ÒÄÏÀ» ¸¸µé°í ¼¹ö·Î ¿¬°áÀ» ½ÃµµÇÑ´Ù. | |
3. Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á ½Ãµµ¸¦ ¹Þ¾ÆµéÀδÙ. | |
4. ÀڷḦ ÁÖ°í¹Þ´Â´Ù. | 4. ÀڷḦ ÁÖ°í¹Þ´Â´Ù. |
5. ¿¬°áÀ» ´Ý´Â´Ù. | 5. ¿¬°áÀ» ´Ý´Â´Ù. |
±âº»ÀûÀ¸·Î´Â ÀÌ·¸´Ù. ¸ÕÀú ¼¹ö°¡ ±â´Ù¸®´Â ¼ÒÄÏÀ» ¸¸µé°í Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á ½Ãµµ¸¦ ±â´Ù¸°´Ù. Ŭ¶óÀ̾ðÆ®°¡ ÀÚü ¼ÒÄÏÀ» ¸¸µé°í ¼¹ö¿Í ¿¬°áÀ» ½ÃµµÇÑ´Ù. ¼¹ö´Â ¿¬°áÀ» ¹Þ¾ÆµéÀÌ°í, ÀÚ·á ±³È¯ÀÌ ½ÃÀ۵ȴÙ. ¼ÒÄÏ ¿¬°áÀ» ÅëÇØ ¸ðµç ÀÚ·á°¡ Àü´ÞµÇ¸é ¾çÂÊ Áß Çϳª°¡ ¿¬°áÀ» ´Ý´Â´Ù.
ÀÌÁ¦ ÄÚµå·Î µé¾î°¥ ½Ã°£ÀÌ´Ù. ÀÌÁ¦ºÎÅÍ °³¿ä¿¡¼ ´Ù·é ´Ü°è¸¦ ¸ðµÎ ¼öÇàÇϴ Ŭ¶óÀ̾ðÆ®¿Í ¼¹ö¸¦ ¸¸µç´Ù. ¿ì¸®´Â ÀϹÝÀûÀ¸·Î ÀϾ´Â ¼ø¼´ë·Î - ¿¹¸¦ µé¾î ¸ÕÀú ¼ÒÄÏÀ» ±â´Ù¸®´Â ¼¹ö ºÎºÐÀ» ¸¸µç ´ÙÀ½ ¼¹ö·Î ¿¬°áÇϴ Ŭ¶óÀ̾ðÆ® ºÎºÐÀ» ¸¸µå´Â µî - ±¸ÇöÇÑ´Ù. Àüü ÄÚµå´Â simple_server_main.cpp¿Í simple_client_main.cpp¿¡¼ º¼ ¼ö ÀÖ´Ù.
¹Ì¸® ¼Ò½ºÄڵ带 »ìÆ캸°í ½ÇÇàÇغ¸·Á¸é ¿©±â¸¦ ÀоîºÁ¶ó. ÇÁ·ÎÁ§Æ® ÆÄÀÏ ¸ñ·Ï°ú ¾î¶»°Ô ÄÄÆÄÀÏÇÏ°í Å×½ºÆ®ÇÏ´ÂÁö¸¦ ¼³¸íÇÑ´Ù.ù¹ø° ÇÒ ÀÏÀº Ŭ¶óÀ̾ðÆ®¿¡¼ µé¾î¿À´Â ¿äûÀ» ±â´Ù¸®´Â °£´ÜÇÑ ¼¹ö¸¦ ¸¸µå´Â °ÍÀÌ´Ù. ´ÙÀ½Àº ¼¹ö ¼ÒÄÏÀ» ¸¸µå´Â ÄÚµåÀÌ´Ù.
¸ñ·Ï 1 : ¼¹ö ¼ÒÄÏ ¸¸µé±â ( simple_server_main.cppÀÇ ÀϺΠ)#include "ServerSocket.h" #include "SocketException.h" #include <string> int main ( int argc, int argv[] ) { try { // Create the server socket ServerSocket server ( 30000 ); // rest of code - // accept connection, handle request, etc... } catch ( SocketException& e ) { std::cout << "Exception was caught:" << e.description() << "\nExiting.\n"; } return 0; }
À̰͸¸À¸·Î ³¡³µ´Ù. ServerSocket Ŭ·¡½ºÀÇ »ý¼ºÀÚ´Â ±â´Ù¸®´Â ¼ÒÄÏÀ» ¸¸µå´Âµ¥ ÇÊ¿äÇÑ ¼ÒÄÏ API¸¦ ºÎ¸¥´Ù. ÀÚ¼¼ÇÑ »çÇ×À» °¨Ã߱⶧¹®¿¡ ·ÎÄà Æ÷Æ®¿¡ ±â´Ù¸®±âÀ§ÇØ ÀÌ Å¬·¡½º °´Ã¼¸¦ »ý¼ºÇϱ⸸ ÇÏ¸é µÈ´Ù.
try/catch ¹®À» ÁÖ¸ñÇ϶ó. ServerSocket°ú ClientSocket Ŭ·¡½º´Â C++ÀÇ ¿¹¿Üó¸® ±â´ÉÀ» »ç¿ëÇÑ´Ù. Ŭ·¡½º ÇÔ¼ö°¡ ¾î¶² ÀÌÀ¯¿¡¼°Ç ¹®Á¦°¡ »ý±â¸é SocketException.h¿¡ Á¤ÀÇµÈ SocketException ÇüÀÇ ¿¹¿Ü¸¦ ¹ß»ýÇÑ´Ù. ÀÌ ¿¹¿Ü¸¦ ó¸®ÇÏÁö ¾ÊÀ¸¸é ÇÁ·Î±×·¥ÀÌ ³¡³ª±â¶§¹®¿¡ ó¸®ÇØÁÖ´Â °ÍÀÌ ÁÁ´Ù. À§¿¡¼Ã³·³ SocketExceptionÀÇ description() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ¿À·ù¹®À» ¾òÀ» ¼ö ÀÖ´Ù.
ÀüÇüÀûÀΠŬ¶óÀ̾ðÆ®¿Í ¼¹ö°£ ¿¬°áÀÇ µÎ¹ø° ´Ü°è´Â Ŭ¶óÀ̾ðÆ®°¡ ¼¹ö·Î ¿¬°áÀ» ½ÃµµÇÏ´Â ÀÏÀÌ´Ù. ÄÚµå´Â ¹æ±Ý Àü¿¡ º» ¼¹ö ÄÚµå¿Í ºñ½ÁÇÏ´Ù.
¸ñ·Ï 2 : Ŭ¶óÀ̾ðÆ® ¼ÒÄÏ ¸¸µé±â ( simple_client_main.cppÀÇ ÀϺΠ)#include "ClientSocket.h" #include "SocketException.h" #include <iostream> #include <string> int main ( int argc, int argv[] ) { try { // Create the client socket ClientSocket client_socket ( "localhost", 30000 ); // rest of code - // send request, retrieve reply, etc... } catch ( SocketException& e ) { std::cout << "Exception was caught:" << e.description() << "\n"; } return 0; }
ClientSocket Ŭ·¡½º °´Ã¼¸¦ ¸¸µé±â¸¸ÇÏ¸é ¸®´ª½º ¼ÒÄÏÀ» ¸¸µé¾î¼ »ý¼ºÀÚ¿¡ ÁÖ¾îÁø È£½ºÆ®¿Í Æ÷Æ®·Î ¿¬°áÇÑ´Ù. ServerSocket Ŭ·¡½º¿Í °°ÀÌ »ý¼ºÀÚ°¡ ¾î¶² ÀÌÀ¯¿¡¼°Ç ¹®Á¦°¡ »ý±â¸é ¿À·ù°¡ ¹ß»ýÇÑ´Ù.
Ŭ¶óÀ̾ðÆ®¿Í ¼¹ö°£ ¿¬°áÀÇ ´ÙÀ½ ´Ü°è´Â ¼¹ö¿¡¼ ÀϾÙ. ¼¹ö°¡ Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á ½Ãµµ¸¦ ¹Þ¾ÆµéÀ̸é, µÎ ¼ÒÄÏ ¾ç´Ü°£ Åë½Å ä³ÎÀÌ ¿¸°´Ù.
¿ì¸®´Â °£´ÜÇÑ ¼¹ö¿¡ ÀÌ ±â´ÉÀ» Ãß°¡ÇØ¾ß ÇÑ´Ù. ´ÙÀ½Àº ¼öÁ¤µÈ ¹öÀüÀÌ´Ù.
¸ñ·Ï 3 : Ŭ¶óÀ̾ðÆ® ¿¬°á ¹Þ¾ÆµéÀ̱â ( simple_server_main.cppÀÇ ÀϺΠ)#include "ServerSocket.h" #include "SocketException.h" #include <string> int main ( int argc, int argv[] ) { try { // Create the socket ServerSocket server ( 30000 ); while ( true ) { ServerSocket new_sock; server.accept ( new_sock ); // rest of code - // read request, send reply, etc... } } catch ( SocketException& e ) { std::cout << "Exception was caught:" << e.description() << "\nExiting.\n"; } return 0; }
¿¬°áÀ» ¹Þ¾ÆµéÀ̱âÀ§ÇØ accept ÇÔ¼ö¸¦ È£ÃâÇÏ¸é µÈ´Ù. ÀÌ ÇÔ¼ö´Â ¿¬°á ½Ãµµ¸¦ ¹Þ¾ÆµéÀÌ°í, ¿¬°á¿¡ ´ëÇÑ ¼ÒÄÏ Á¤º¸¸¦ new_sock¿¡ ä¿î´Ù. ¿ì¸®´Â ´ÙÀ½ Àý¿¡¼ ¾î¶»°Ô new_sockÀ» »ç¿ëÇÏ´ÂÁö º¼ °ÍÀÌ´Ù.
ÀÌÁ¦ ¼¹ö´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á ¿äûÀ» ¹Þ¾Æµé¿´°í, ¼ÒÄÏ ¿¬°áÀ» ÅëÇØ ÀڷḦ ÁÖ°í¹ÞÀ» ½Ã°£ÀÌ´Ù.
C++ÀÇ °í±Þ ±â´ÉÁß Çϳª°¡ ¿¬»êÀÚ¸¦ ¿À¹ö·ÎµùÇÏ´Â - °£´ÜÈ÷ ¸»Çؼ, ¿¬»êÀÚ°¡ ƯÁ¤ ÀÛ¾÷À» Çϵµ·Ï ¸¸µå´Â - ´É·ÂÀÌ´Ù. ³ª´Â ClientSocket°ú ServerSocket Ŭ·¡½ºÀÇ <<¿Í >> ¿¬»êÀÚ¸¦ ¿À¹ö·ÎµùÇÏ¿©, ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¿© ¼ÒÄÏ¿¡¼ ÀڷḦ ÀÐ°í¾µ ¼ö ÀÖ°Ô ¸¸µé¾ú´Ù. ´ÙÀ½Àº °£´ÜÇÑ ¼¹öÀÇ ¼öÁ¤µÈ ¹öÀüÀÌ´Ù.
¸ñ·Ï 4 : °£´ÜÇÑ ¼¹ö ±¸Çö ( simple_server_main.cppÀÇ ÀϺΠ)#include "ServerSocket.h" #include "SocketException.h" #include <string> int main ( int argc, int argv[] ) { try { // Create the socket ServerSocket server ( 30000 ); while ( true ) { ServerSocket new_sock; server.accept ( new_sock ); try { while ( true ) { std::string data; new_sock >> data; new_sock << data; } } catch ( SocketException& ) {} } } catch ( SocketException& e ) { std::cout << "Exception was caught:" << e.description() << "\nExiting.\n"; } return 0; }
new_sock º¯¼ö´Â ¸ðµç ¼ÒÄÏ Á¤º¸¸¦ ÀúÀåÇÏ°í ÀÖ¾î¼, Ŭ¶óÀ̾ðÆ®¿Í ÀڷḦ ±³È¯Çϴµ¥ »ç¿ëÇÑ´Ù. "new_sock >> data;" ÁÙÀº "new_sock¿¡¼ ÀڷḦ ÀÐ¾î¼ 'data'¶ó´Â ¹®ÀÚ¿ º¯¼ö¿¡ ÀúÀåÇÑ´Ù"´Â ¶æÀÌ´Ù. ºñ½ÁÇÏ°Ô ´ÙÀ½ ÁÙÀº 'data'¿¡ ÀÖ´Â ÀڷḦ ¼ÒÄÏÀ» ÅëÇØ Å¬¶óÀ̾ðÆ®·Î º¸³½´Ù.
ÁÖÀǸ¦ ±â¿ï¿´´Ù¸é ¿©±â¼ ¸¸µç °ÍÀÌ echo ¼¹öÀÓÀ» ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. Ŭ¶óÀ̾ðÆ®°¡ º¸³½ ÀÚ·á´Â ¸ðµÎ ´Ù½Ã Ŭ¶óÀ̾ðÆ®¿¡°Ô ±×´ë·Î µÇµ¹·ÁÁø´Ù. ¿ì¸®´Â ÀڷḦ º¸³»°í ¼¹öÀÇ ÀÀ´äÀ» Ãâ·ÂÇϴ Ŭ¶óÀ̾ðÆ®¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.
¸ñ·Ï 5 : °£´ÜÇÑ Å¬¶óÀ̾ðÆ® ±¸Çö ( simple_client_main.cppÀÇ ÀϺΠ)#include "ClientSocket.h" #include "SocketException.h" #include <iostream> #include <string> int main ( int argc, int argv[] ) { try { ClientSocket client_socket ( "localhost", 30000 ); std::string reply; try { client_socket << "Test message."; client_socket >> reply; } catch ( SocketException& ) {} std::cout << "We received this response from the server:\n\"" << reply << "\"\n";; } catch ( SocketException& e ) { std::cout << "Exception was caught:" << e.description() << "\n"; } return 0; }
¿ì¸®´Â ¹®ÀÚ¿ "Test Message."¸¦ ¼¹ö·Î º¸³»°í, ¼¹öÀÇ ÀÀ´äÀ» Ç¥ÁØÃâ·ÂÀ¸·Î Ãâ·ÂÇÑ´Ù.
¿ì¸®´Â ClientSocket°ú ServerSocket Ŭ·¡½ºÀÇ ±âº»ÀûÀÎ »ç¿ë¹ýÀ» »ìÆìºÃ´Ù. ÀÌÁ¦ ÇÁ·ÎÁ§Æ® Àüü¸¦ ÄÄÆÄÀÏÇÏ¿© Å×½ºÆ®Çغ¸ÀÚ.
¿¹Á¦´Â ¾Æ·¡ ÆÄÀϵé·Î ±¸¼ºµÈ´Ù.
ÄÄÆÄÀÏÀº °£´ÜÇÏ´Ù. ¸ÕÀú ¸ðµç ÇÁ·ÎÁ§Æ® ÆÄÀÏÀ» ÇÏÀ§µðÅطθ®¿¡ ÀúÀåÇÏ°í, ¸í·ÉÇà ÇÁ·ÒÇÁÆ®¿¡ ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù.
prompt$ cd directory_you_just_created prompt$ make
±×·¯¸é ÇÁ·ÎÁ§Æ®ÀÇ ¸ðµç ÆÄÀÏÀ» ÄÄÆÄÀÏÇÏ¿© simple_server¿Í simple_client Ãâ·Â ÆÄÀÏÀ» ¸¸µç´Ù. µÎ Ãâ·Â ÆÄÀÏÀ» Å×½ºÆ®ÇϱâÀ§ÇØ ÇÑ ¸í·ÉÇà ÇÁ·ÒÇÁÆ®¿¡¼ ¼¹ö¸¦ ½ÇÇàÇÏ°í, ´Ù¸¥ ¸í·ÉÇà ÇÁ·ÒÇÁÆ®¿¡¼ Ŭ¶óÀ̾ðÆ®¸¦ ½ÇÇàÇÑ´Ù.
ù¹ø° ÇÁ·ÒÇÁÆ®: prompt$ ./simple_server running.... µÎ¹ø° ÇÁ·ÒÇÁÆ®: prompt$ ./simple_client We received this response from the server: "Test message." prompt$
Ŭ¶óÀ̾ðÆ®´Â ¼¹ö·Î ÀڷḦ º¸³»°í, ÀÀ´äÀ» ÀÐ¾î¼ À§¿¡¼Ã³·³ Ç¥ÁØÃâ·ÂÀ¸·Î Ãâ·ÂÇÑ´Ù. Ŭ¶óÀ̾ðÆ®¸¦ ¿øÇϴ¸¸Å ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ¼¹ö´Â ¸Å ¿äû¿¡ ÀÀ´äÇÑ´Ù.
¼ÒÄÏÀº ÇÁ·Î¼¼½º°£¿¡ ÀڷḦ º¸³»´Â °£´ÜÇÏ°í È¿À²ÀûÀÎ ¹æ¹ýÀÌ´Ù. ÀÌ ±Û¿¡¼ ¿ì¸®´Â ¼ÒÄÏ Åë½ÅÀ» »ìÆ캸°í ¼¹ö¿Í Ŭ¶óÀ̾ðÆ® ¿¹Á¦¸¦ ¸¸µé¾îºÃ´Ù. ÀÌÁ¦ ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡ ¼ÒÄÏ Åë½ÅÀ» Ãß°¡ÇÒ ¼ö ÀÖ´Ù!