{"id":108,"date":"2019-07-11T18:23:14","date_gmt":"2019-07-11T09:23:14","guid":{"rendered":"http:\/\/www.space4u.co.kr\/wp\/?p=108"},"modified":"2019-07-11T18:23:15","modified_gmt":"2019-07-11T09:23:15","slug":"bsd-%ec%86%8c%ec%bc%93-%ed%94%84%eb%a1%9c%ea%b7%b8%eb%9e%98%eb%b0%8dsocket-programming-%ec%98%88%ec%a0%9c","status":"publish","type":"post","link":"http:\/\/www.space4u.co.kr\/wp\/?p=108","title":{"rendered":"BSD \uc18c\ucf13 \ud504\ub85c\uadf8\ub798\ubc0d(Socket Programming) \uc608\uc81c"},"content":{"rendered":"\n<p><strong>\uc6d0\ubb38 :<\/strong>&nbsp;<a href=\"http:\/\/heart4u.co.kr\/pages\/551093\"><strong>http:\/\/kkamagui.springnote.com\/pages\/551093<\/strong><\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ub4e4\uc5b4\uac00\uae30 \uc804\uc5d0&#8230;<\/h2>\n\n\n\n<ul><li><strong>\uc774 \uae00\uc740 kkamagui\uc5d0 \uc758\ud574 \uc791\uc131\ub41c \uae00\uc785\ub2c8\ub2e4.<\/strong><\/li><li><strong>\ub9c8\uc74c\uaecf \uc778\uc6a9\ud558\uc2dc\uac70\ub098 \uc0ac\uc6a9\ud558\uc154\ub3c4 \ub429\ub2c8\ub2e4. \ub2e8 \ucd9c\ucc98(<a href=\"http:\/\/kkamagui.tistory.com\/\">http:\/\/kkamagui.tistory.com<\/a>,&nbsp;<a href=\"http:\/\/heart4u.co.kr\/pages\/404250#\">http:\/\/kkamagui.springnote.com<\/a>)\ub294 \ubc1d\ud600 \uc8fc\uc2ed\uc2dc\uc624.<\/strong><\/li><li><strong>\uae30\ud0c0 \uc0ac\ud56d\uc740 kkakkunghehe at daum.net \uc774\ub098<\/strong>&nbsp;<a href=\"http:\/\/kkamagui.tistory.com\/\"><strong>http:\/\/kkamagui.tistory.com<\/strong><\/a><strong>\uc73c\ub85c \ubcf4\ub0b4\uc8fc\uc2dc\uba74 \ubc18\uc601\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/strong><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">0.\uc2dc\uc791\ud558\uba74\uc11c&#8230;<\/h2>\n\n\n\n<p>&nbsp;BSD \uc18c\ucf13 \ud504\ub85c\uadf8\ub798\ubc0d\uc740 MFC \uc18c\ucf13\uc5d0 \ube44\ud558\uba74 \uc4f0\uae30\uac00 \uae4c\ub2e4\ub86d\uace0 \uc54c\uc544\uc57c\ud560 \ubd80\ubd84\uc774 \ub9ce\ub2e4. \ud2b9\ud788\ub098 \uc708\ub3c4\uc6b0 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud558\uba74 MFC \uc18c\ucf13\uc5d0 \uc775\uc219\ud574\uc9c0\uae30\ub54c\ubb38\uc5d0 \uae4c\uba39\uae30\uac00 \uc2ed\uc0c1\uc774\ub2e4.<\/p>\n\n\n\n<p>&nbsp;\uc774\ubc88\uc5d0 NDS \uc18c\ucf13 \ud504\ub85c\uadf8\ub798\ubc0d\uc744 \ud558\uba74\uc11c \uc6b0\uc5f0\ud788 \ub2e4\uc2dc \ubcfc \uae30\ud68c\uac00 \uc0dd\uaca8 \uc815\ub9ac\ud55c\ub2e4.<br><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1.\ucc38\uace0 \ud568\uc218\ub4e4<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">1.1 select \ud568\uc218<\/h3>\n\n\n\n<p>&nbsp;Single Thread\ub85c Multi-Socket\uc744 \ucee8\ud2b8\ub864 \ud558\ub294 \ubc29\ubc95\uc740 \uc5ec\ub7ec\uac00\uc9c0\uac00 \uc788\uaca0\uc9c0\ub9cc, \uac00\uc7a5 \ub300\ud45c\uc801\uc778 \uac83\uc774 select\uc774\ub2e4. select\ub294 \uc544\ub798\uc640 \uac19\uc740 \uc6d0\ud615\uc744 \uac00\uc9c0\uace0 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">int select(<br>\u00a0 int nfds,<br>\u00a0 fd_set FAR* readfds,<br>\u00a0 fd_set FAR* writefds,<br>\u00a0 fd_set FAR* exceptfds,<br>\u00a0 const struct timeval FAR* timeout<br>);<\/pre>\n\n\n\n<p><strong>&nbsp;select \ud568\uc218\ub294 nfds\uc5d0 \uc124\uc815\ub41c \uc18c\ucf13\uc758 \uc218\ub9cc\ud07c \uc18c\ucf13\uc744 \uccb4\ud06c\ud558\ubbc0\ub85c \ubc18\ub4dc\uc2dc \uac00\uc7a5 \ud070 \uc18c\ucf13 \ubc88\ud638 + 1\uc758 \ud06c\uae30\ub9cc\ud07c\uc744 nfds\ub85c \ub118\uaca8\uc918\uc57c \ud568\uc744 \uc78a\uc9c0 \ub9d0\uc790( ex: fd + 1 )<\/strong>&nbsp;<\/p>\n\n\n\n<p>&nbsp;return \uac12\uc740 \uc544\ub798\uc640 \uac19\uc740 \uc758\ubbf8\ub97c \uac00\uc9c4\ub2e4.<\/p>\n\n\n\n<ul><li>\uc591\uc218 : readfds or writefds or exceptfds \uc911\uc5d0 \uc591\uc218 \uac1c\uc758 fd\uac00 \uc774\ubca4\ud2b8\uac00 \ubc1c\uc0dd\ud588\ub2e4.<ul><li>fds\uc5d0 \uc774\ubca4\ud2b8\uac00 \ubc1c\uc0dd\ud55c fd\ub9cc \ud50c\ub798\uadf8\uac00 \uc124\uc815\ub418\ubbc0\ub85c FD_ISSET \ub9e4\ud06c\ub85c\ub97c \uc774\uc6a9\ud574\uc11c \ud574\ub2f9 socket\uc744 \ucc3e\uc744 \uc218 \uc788\ub2e4.<\/li><li>timeout\uc5d0 \ub0a8\uc740 \uc2dc\uac04\uc774 \uc800\uc7a5\ub418\ubbc0\ub85c \uc774\ub97c \ud65c\uc6a9\ud558\uba74 \ucd94\uac00\uc801\uc778 \ucc98\ub9ac\uac00 \uac00\ub2a5\ud558\ub2e4<\/li><\/ul><\/li><li>0 : timeout\uc774 \ub418\uc5c8\ub2e4. timeout \uac12\uc758 \uacbd\uc6b0 0\uc73c\ub85c \uc124\uc815\ub418\uba74 \ubb34\ud55c\ub300\ub85c \ub300\uae30\ud55c\ub2e4.<\/li><li>\uc74c\uc218 : readfds\uc5d0 \ub2eb\ud78c \uc18c\ucf13\uc774 \uc788\uac70\ub098 \uae30\ud0c0 \uc5d0\ub7ec\uac00 \ubc1c\uc0dd\ud588\ub2e4.<\/li><\/ul>\n\n\n\n<p>&nbsp;fd_set \ubc0f timeval\uc740 \uad6c\uc870\uccb4\ub85c \uc544\ub798\uc640 \uac19\uc740 \ud615\ud0dc\ub97c \uac00\uc9c4\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">typedef struct\u00a0<strong>fd_set<\/strong>\u00a0{\n\u00a0 u_int fd_count;\n\u00a0 SOCKET fd_array[FD_SETSIZE];\n} fd_set;\n\n struct\u00a0<strong>timeval<\/strong>\u00a0{\n\u00a0 long tv_sec;\u00a0 \/\/ second \ub2e8\uc704\n\u00a0 long tv_usec; \/\/ millisecond \ub2e8\uc704\n}; <\/pre>\n\n\n\n<p>&nbsp;timeval\uc740 \uc704\uc5d0\uc11c \ubcf4\ub294 \uac83 \uadf8\ub300\ub85c second\/millisecond \ub2e8\uc704\ub85c \uc124\uc815\ud574\uc11c \uc0ac\uc6a9\ud558\uba74 \ub41c\ub2e4.<br><\/p>\n\n\n\n<p>&nbsp;\ud558\uc9c0\ub9cc fd_set\uacfc \uac19\uc740 \uacbd\uc6b0 \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud574\uc57c\ud560\uc9c0 \uc880 \ub9c9\ub9c9\ud558\ub2e4. \ub2e4\ud589\uc774 \uc774\ub97c \ucc98\ub9ac\ud574\uc8fc\ub294 \ub9e4\ud06c\ub85c\uac00 \uc788\uc73c\ub2c8 \uc544\ub798\uc640 \uac19\ub2e4.<\/p>\n\n\n\n<ul><li>FD_ZERO( fd_set* fdset ) : &nbsp;fdset\uc744 \ucd08\uae30\ud654. \ucc98\uc74c\uc5d0\ub294 \ubc18\ub4dc\uc2dc \ud55c\ubc88 \ud638\ucd9c\ud574\uc57c \ud568<\/li><li>FD_SET( int fd, fd_set* fdset ) : fdset\uc5d0 fd \uc18c\ucf13\uc744 \ub4f1\ub85d\ud55c\ub2e4.<\/li><li>FD_CLR( int fd, fd_set* fdset ) : fdset\uc5d0 fd \uc18c\ucf13\uc744 \uc0ad\uc81c\ud55c\ub2e4.<\/li><li>FD_ISSET( int fd, fd_set* fdset ) : fdset\uc5d0 fd \uc18c\ucf13\uc774 \uc788\ub294\uac00 \ud655\uc778\ud55c\ub2e4.<\/li><\/ul>\n\n\n\n<p>&nbsp;\uc790\uc8fc \uc0ac\uc6a9\ud558\ub294 \ub9e4\ud06c\ub85c\uc774\ub2c8 \ud55c\ubc88\ucbe4\uc740 \uc77d\uc5b4\ub450\uc790. \uc790\uc138\ud55c \uc0ac\uc6a9 \ubc29\ubc95\uc740 \uc544\ub798\uc758 Linux \uc608\uc81c\ub97c \ubcf4\uba74 \ub41c\ub2e4.<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2.\uc708\ub3c4\uc6b0(Window) \ud658\uacbd<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">2.1 \uc11c\ubc84(Server)<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;winsock2.h>\n#include &lt;stdio.h>\n#include &lt;string.h>\n\n#define DEFAULT_PORT 2924\n#define DEFAULT_BUFFER_SIZE 4096 \n\n int main()\n{\n\u00a0 \u00a0 char Buffer[DEFAULT_BUFFER_SIZE + 1];\n\u00a0 \u00a0 WSAData wsd; \n\n \u00a0 \u00a0 if(WSAStartup(MAKEWORD(2, 2), &amp;wsd) != 0) {\n\u00a0 \u00a0 \u00a0 \u00a0 printf(\"Winsock \ucd08\uae30\ud654 \uc5d0\ub7ec!\\n\");\n\u00a0 \u00a0 \u00a0 \u00a0 return -1;\n\u00a0 \u00a0 } \n\n \u00a0 \u00a0 SOCKET ls = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); \n\n \u00a0 \u00a0 if (ls == INVALID_SOCKET) {\n\u00a0 \u00a0 \u00a0 \u00a0 printf(\"\uc18c\ucf13 \uc0dd\uc131 \uc2e4\ud328!\\n\");\n\u00a0 \u00a0 \u00a0 \u00a0 return -1;\n\u00a0 \u00a0 } \n\n \u00a0 \u00a0sockaddr_in service;\n\u00a0 \u00a0 memset(&amp;service, 0, sizeof(service));\n\u00a0 \u00a0 service.sin_family = AF_INET;\n\u00a0 \u00a0 service.sin_addr.s_addr = INADDR_ANY;\n\u00a0 \u00a0 service.sin_port = htons(DEFAULT_PORT);\n\u00a0 \u00a0\n\u00a0 \u00a0 if (bind(ls, (SOCKADDR*) &amp;service, sizeof(service)) == SOCKET_ERROR) {\n\u00a0 \u00a0 \u00a0 \u00a0 printf(\"bind \uc2e4\ud328!\\n\");\n\u00a0 \u00a0 \u00a0 \u00a0 return -1;\n\u00a0 \u00a0 }\n\u00a0 \u00a0\n\u00a0 \u00a0 if (listen(ls, 1) == SOCKET_ERROR) {\n\u00a0 \u00a0 \u00a0 \u00a0 printf(\"listen() \uc2e4\ud328!\\n\");\n\u00a0 \u00a0 \u00a0 \u00a0 return -1;\n\u00a0 \u00a0 } \n\n \u00a0 \u00a0 SOCKET as; \n \u00a0 \u00a0 printf(\"\ud074\ub77c\uc774\uc5b8\ud2b8 \uc5f0\uacb0 \ub300\uae30.\\n\"); \n\n \u00a0 \u00a0 while (1) {\n\u00a0 \u00a0 \u00a0 \u00a0 as = accept(ls, NULL, NULL);\n\u00a0 \u00a0 \u00a0 \u00a0 if (as == SOCKET_ERROR) continue;\n\u00a0 \u00a0 \u00a0 \u00a0 printf(\"\ud074\ub77c\uc774\uc5b8\ud2b8 \uc5f0\uacb0\ub428.\\n\"); \n\n \u00a0 \u00a0 \u00a0 \u00a0 int nbyte = recv(as, Buffer, DEFAULT_BUFFER_SIZE, 0); \n\n \u00a0 \u00a0 \u00a0 \u00a0 if (nbyte &lt;= 0) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 printf(\"recv \uc5d0\ub7ec!\\n\");\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 break;\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 Buffer[nbyte] = '\\0';\n\u00a0 \u00a0 \u00a0 \u00a0 printf(\"\uc5d0\ucf54 : %s\\n\", Buffer); \n\n \u00a0 \u00a0 \u00a0 \u00a0 send(as, Buffer, nbyte, 0); \n\n \u00a0 \u00a0 \u00a0 \u00a0 if (strncmp(Buffer, \"quit\", 4) == 0) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 printf(\"\ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc694\uccad\uc5d0 \uc758\ud574 \uc11c\ubc84 \uc885\ub8cc\\n\");\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 break;\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 closesocket(as);\n\u00a0 \u00a0 \u00a0 \u00a0 printf(\"\ud074\ub77c\uc774\uc5b8\ud2b8 \uc5f0\uacb0 \ud574\uc81c.\\n\uc0c8\ub85c\uc6b4 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc5f0\uacb0 \ub300\uae30.\\n\");\n\u00a0 \u00a0 } \n\n \u00a0 \u00a0 closesocket(ls);\n\u00a0 \u00a0 WSACleanup();\n\u00a0 \u00a0\n\u00a0 \u00a0 return 0;\n} <\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2.2 \ud074\ub77c\uc774\uc5b8\ud2b8(Client)<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;winsock2.h>\n#include &lt;stdio.h>\n#include &lt;string.h>\n#define DEFAULT_PORT 2924\n#define DEFAULT_BUFFER_SIZE 4096\nint main(int argc, char** argv)\n{\n\u00a0 \u00a0 char Buffer[DEFAULT_BUFFER_SIZE + 1];\n\u00a0 \u00a0 WSAData wsd;\n\u00a0 \u00a0 if (argc != 2) {\n\u00a0 \u00a0 \u00a0 \u00a0 printf (\"\uc0ac\uc6a9\ubc95 : %s [IP \uc8fc\uc18c]\\n\", argv[0]);\n\u00a0 \u00a0 \u00a0 \u00a0 return -1;\n\u00a0 \u00a0 }\n\u00a0 \u00a0\n\u00a0 \u00a0 if(WSAStartup(MAKEWORD(2, 2), &amp;wsd) != 0) {\n\u00a0 \u00a0 \u00a0 \u00a0 printf(\"Winsock \ucd08\uae30\ud654 \uc5d0\ub7ec!\\n\");\n\u00a0 \u00a0 \u00a0 \u00a0 return -1;\n\u00a0 \u00a0 }\n\u00a0 \u00a0\n\u00a0 \u00a0 SOCKET cs = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);\n\u00a0 \u00a0\n\u00a0 \u00a0 if (cs == INVALID_SOCKET) {\n\u00a0 \u00a0 \u00a0 \u00a0 printf(\"\uc18c\ucf13 \uc0dd\uc131 \uc2e4\ud328!\\n\");\n\u00a0 \u00a0 \u00a0 \u00a0 return -1;\n\u00a0 \u00a0 }\n\u00a0 \u00a0\n\u00a0 \u00a0 sockaddr_in client;\n\u00a0 \u00a0 memset(&amp;client, 0, sizeof(client));\n\u00a0\n\u00a0 \u00a0 client.sin_family = AF_INET;\n\u00a0 \u00a0 client.sin_addr.s_addr = inet_addr(argv[1]);\n\u00a0 \u00a0 client.sin_port = htons(DEFAULT_PORT);\n\u00a0 \u00a0\n\u00a0 \u00a0 if (connect(cs, (SOCKADDR *)&amp;client, sizeof(client)) == SOCKET_ERROR) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 printf(\"connect \uc5d0\ub7ec!\\n\");\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 return -1;\n\u00a0 \u00a0 }\n\u00a0 \u00a0 printf(\"\uc785\ub825 : \");\n\u00a0 \u00a0 gets(Buffer);\n\u00a0 \u00a0 send(cs, Buffer, strlen(Buffer), 0);\n\u00a0 \u00a0 int nbyte = recv(cs, Buffer, DEFAULT_BUFFER_SIZE, 0);\n\u00a0 \u00a0 Buffer[nbyte] = '\\0';\n\u00a0 \u00a0 printf(\"\uc5d0\ucf54 : %s\", Buffer);\n\u00a0 \u00a0 closesocket(cs);\n\u00a0 \u00a0 WSACleanup();\n\u00a0 \u00a0\n\u00a0 \u00a0 return 0;\n} <\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3.Linux or Unix or NDS<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">3.1 \uc11c\ubc84(Server)<\/h3>\n\n\n\n<p>&nbsp;\uc708\ub3c4\uc6b0\ucabd \uc18c\uc2a4\ub97c \uc870\uae08 \uc218\uc815\ud588\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;sys\/socket.h>\n#include &lt;netinet\/in.h>\n#include &lt;netdb.h>\nint main()\n{\n\u00a0 \u00a0 char Buffer[256 + 1];\n\u00a0 \u00a0 int ls = socket(AF_INET, SOCK_STREAM, 0);\n\u00a0 \u00a0 if (ls == INVALID_SOCKET) {\n\u00a0 \u00a0 \u00a0 \u00a0 printf(\"\uc18c\ucf13 \uc0dd\uc131 \uc2e4\ud328!\\n\");\n\u00a0 \u00a0 \u00a0 \u00a0 return -1;\n\u00a0 \u00a0 }\n\u00a0 \u00a0 sockaddr_in service;\n\u00a0 \u00a0 memset(&amp;service, 0, sizeof(service));\n\u00a0 \u00a0 service.sin_family = AF_INET;\n\u00a0 \u00a0 service.sin_addr.s_addr = INADDR_ANY;\n\u00a0 \u00a0 service.sin_port = htons(DEFAULT_PORT);\n\u00a0 \u00a0\n\u00a0 \u00a0 if (bind(ls, (SOCKADDR*) &amp;service, sizeof(service)) == SOCKET_ERROR) {\n\u00a0 \u00a0 \u00a0 \u00a0 printf(\"bind \uc2e4\ud328!\\n\");\n\u00a0 \u00a0 \u00a0 \u00a0 return -1;\n\u00a0 \u00a0 }\n\u00a0 \u00a0\n\u00a0 \u00a0 if (listen(ls, 1) == SOCKET_ERROR) {\n\u00a0 \u00a0 \u00a0 \u00a0 printf(\"listen() \uc2e4\ud328!\\n\");\n\u00a0 \u00a0 \u00a0 \u00a0 return -1;\n\u00a0 \u00a0 }\n\u00a0 \u00a0 int as;\n\u00a0 \u00a0 printf(\"\ud074\ub77c\uc774\uc5b8\ud2b8 \uc5f0\uacb0 \ub300\uae30.\\n\");\n\u00a0 \u00a0 while (1) {\n\u00a0 \u00a0 \u00a0 \u00a0 as = accept(ls, NULL, NULL);\n\u00a0 \u00a0 \u00a0 \u00a0 if (as == SOCKET_ERROR) continue;\n\u00a0 \u00a0 \u00a0 \u00a0 printf(\"\ud074\ub77c\uc774\uc5b8\ud2b8 \uc5f0\uacb0\ub428.\\n\");\n\u00a0 \u00a0 \u00a0 \u00a0 int nbyte = recv(as, Buffer, DEFAULT_BUFFER_SIZE, 0);\n\u00a0 \u00a0 \u00a0 \u00a0 if (nbyte &lt;= 0) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 printf(\"recv \uc5d0\ub7ec!\\n\");\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 break;\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 Buffer[nbyte] = '\\0';\n\u00a0 \u00a0 \u00a0 \u00a0 printf(\"\uc5d0\ucf54 : %s\\n\", Buffer);\n\u00a0 \u00a0 \u00a0 \u00a0 send(as, Buffer, nbyte, 0);\n\u00a0 \u00a0 \u00a0 \u00a0 if (strncmp(Buffer, \"quit\", 4) == 0) {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 printf(\"\ud074\ub77c\uc774\uc5b8\ud2b8\uc758 \uc694\uccad\uc5d0 \uc758\ud574 \uc11c\ubc84 \uc885\ub8cc\\n\");\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 break;\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0\n\u00a0 \u00a0 \u00a0 \u00a0 close(as);\n\u00a0 \u00a0 \u00a0 \u00a0 printf(\"\ud074\ub77c\uc774\uc5b8\ud2b8 \uc5f0\uacb0 \ud574\uc81c.\\n\uc0c8\ub85c\uc6b4 \ud074\ub77c\uc774\uc5b8\ud2b8 \uc5f0\uacb0 \ub300\uae30.\\n\");\n\u00a0 \u00a0 }\n\u00a0 \u00a0 close(ls);\n\u00a0 \u00a0\n\u00a0 \u00a0 return 0;\n} <\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3.2 \ud074\ub77c\uc774\uc5b8\ud2b8(Client)<\/h3>\n\n\n\n<p>&nbsp;NDS\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uc608\uc81c\ub97c \uc870\uae08 \uc218\uc815\ud588\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;sys\/socket.h>\n#include &lt;netinet\/in.h>\n#include &lt;netdb.h>\n\nint main(void)\n{ \n \u00a0 \u00a0 \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\u00a0 \u00a0 \/\/ Let's send a simple HTTP request to a server and print the results! \n\n \u00a0 \u00a0 \/\/ store the HTTP request for later\n\u00a0 \u00a0 const char * request_text =\n\u00a0 \u00a0 \u00a0 \u00a0 \"GET \/ HTTP\/1.1\\r\\n\\r\\n\";\n\/\/ \u00a0 \u00a0 \u00a0\u00a0 \"Host:\u00a0<a href=\"http:\/\/www.akkit.org\/r\/n\">www.akkit.org\\r\\n<\/a>\"\n\/\/ \u00a0 \u00a0 \u00a0\u00a0 \"User-Agent: Nintendo DS\\r\\n\\r\\n\"; \n\n \u00a0 \u00a0 \/\/ Find the IP address of the server, with gethostbyname\n\u00a0 \u00a0 \/\/ DNS\ub97c \uc774\uc6a9\ud574\uc11c Name\uc73c\ub85c IP\ub97c \uc5bb\ub294\ub2e4.\n\u00a0 \u00a0 \/\/ 2007\/10\/24 \ud604\uc7ac, \uc544\uc9c1 \uc798 \uc548\ub418\ub294 \uac83 \uac19\ub2e4.\n\u00a0 \u00a0 iprintf( \"DNS Resolve Start\\n\" );\n\u00a0 \u00a0 \/\/struct hostent * myhost = gethostbyname( \"<a href=\"http:\/\/www.google.org\/\">www.google.org<\/a>\" );\n\u00a0 \u00a0 \/\/iprintf(\"Found IP Address![www.google.org] [%08X]\\n\",\n\u00a0 \u00a0 \/\/ \u00a0 \u00a0 \u00a0\u00a0 myhost->h_addr_list[0] );\n\u00a0\n\u00a0 \u00a0 \/\/ Tell the socket to connect to the IP address we found, on port 80 (HTTP)\n\u00a0 \u00a0 struct sockaddr_in sain;\n\u00a0 \u00a0 sain.sin_family = AF_INET;\n\u00a0 \u00a0 sain.sin_port = htons(80);\n\u00a0 \u00a0 \/\/ Host Resolve\uac00 \ub05d\ub0ac\uc73c\uba74 \uc544\ub798\uc640 \uac19\uc774 \uc0ac\uc6a9\ud55c\ub2e4.\n\u00a0 \u00a0 \/\/sain.sin_addr.s_addr= *( (unsigned long *)(myhost->h_addr_list[0]) );\n\u00a0 \u00a0 \/\/ \uc544\ub798\ub294 google\uc758 IP \uc8fc\uc18c\uc774\ub2e4.\n\u00a0 \u00a0 sain.sin_addr.s_addr = inet_addr( \"72.14.235.99\" ); \u00a0\u00a0\n\u00a0 \u00a0\n\u00a0 \u00a0 \/\/ Create a TCP socket\n\u00a0 \u00a0 int my_socket;\n\u00a0 \u00a0 fd_set readfd;\n\u00a0 \u00a0 fd_set tempfd;\n\u00a0 \u00a0 struct timeval stTime;\n\u00a0 \u00a0 struct timeval stTempTime;\n\u00a0 \u00a0 int iRet;\n\u00a0 \u00a0\n\u00a0 \u00a0 stTime.tv_sec = 5;\n\u00a0 \u00a0 stTime.tv_usec = 0;\nRetry:\n\u00a0 \u00a0\n\u00a0 \u00a0 my_socket = socket( AF_INET, SOCK_STREAM, 0 );\n\u00a0 \u00a0 iprintf(\"Created Socket!\\n\");\n\u00a0 \u00a0\n\u00a0 \u00a0 iprintf( \"Try To Connect\\n\" );\n\u00a0 \u00a0 connect( my_socket,(struct sockaddr *)&amp;sain, sizeof(sain) );\n\u00a0 \u00a0 iprintf(\"Connected to server!\\n\"); \n\n \u00a0 \u00a0 \/\/ send our request\n\u00a0 \u00a0 send( my_socket, request_text, strlen(request_text), 0 );\n\u00a0 \u00a0 iprintf(\"Sent our request!\\n\"); \n\n \u00a0 \u00a0 \/\/ Print incoming data\n\u00a0 \u00a0 iprintf(\"Printing incoming data:\\n\"); \n\n \u00a0 \u00a0 int recvd_len;\n\u00a0 \u00a0 char incoming_buffer[256]; \n\n \u00a0 \u00a0 iprintf(\"Recv Start\\n\");\n\u00a0 \u00a0 FD_ZERO( &amp;readfd );\n\u00a0 \u00a0 FD_SET( my_socket, &amp;readfd );\n\u00a0 \u00a0 while( 1 )\n\u00a0 \u00a0 {\n\u00a0 \u00a0 \u00a0 \u00a0 tempfd = readfd;\n\u00a0 \u00a0 \u00a0 \u00a0 stTempTime = stTime;\n\u00a0 \u00a0 \u00a0 \u00a0 iRet = select( my_socket + 1, &amp;tempfd, NULL, NULL, &amp;stTempTime );\n\u00a0 \u00a0 \u00a0 \u00a0 if( iRet > 0 )\n\u00a0 \u00a0 \u00a0 \u00a0 {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 recvd_len = recv( my_socket, incoming_buffer, 255, 0 );\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 iprintf(\"Recv End Size[%d]\\n\", recvd_len );\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if( recvd_len > 0 )\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 { \/\/ data was received!\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 incoming_buffer[ recvd_len ] = 0; \/\/ null-terminate\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 iprintf( incoming_buffer );\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Time Expired\n\u00a0 \u00a0 \u00a0 \u00a0 else if( iRet == 0 )\n\u00a0 \u00a0 \u00a0 \u00a0 {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 iprintf( \"Time Expired If You Press B, Exit Receiving Process\\n\" );\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if( ~REG_KEYINPUT &amp; KEY_B )\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 break;\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 else\n\u00a0 \u00a0 \u00a0 \u00a0 {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 iprintf( \"Error~~!!\\n\" );\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 break;\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }\n\u00a0 \u00a0\n\u00a0 \u00a0 iprintf(\"Other side closed connection!\\n\"); \n\n \u00a0 \u00a0 shutdown(my_socket,0); \/\/ good practice to shutdown the socket. \n\n \u00a0 \u00a0 close(my_socket); \/\/ remove the socket.\n\u00a0 \u00a0\n\u00a0 \u00a0 iprintf( \"Press Any A Key To Retry\\n\" );\n\u00a0 \u00a0 while( REG_KEYINPUT &amp; KEY_A ) ;\n\u00a0 \u00a0\u00a0\n\u00a0 \u00a0 goto Retry; \n\n \u00a0 \u00a0 while(1); \n\n \u00a0 \u00a0 return 0;\n} <\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">4.\ub9c8\uce58\uba74\uc11c&#8230;<\/h2>\n\n\n\n<p>&nbsp;\uac04\ub2e8\ud558\uac8c\ub098\ub9c8 \ucf54\ub4dc \uc870\uac01\uc744 \uc815\ub9ac\ud574 \ubcf4\uc558\ub2e4. \uc774\uc81c \uad6c\uae00\ub9c1\ud560 \ud544\uc694\uc5c6\uc774 \ubc14\ub85c \ubd99\uc5ec\ub123\uace0 \uc4f0\uba74\ub41c\ub2e4. \ub2e4\uc2dc\ud55c\ubc88 \ub124\ud2b8\uc6cc\ud06c\uc758 \uc138\uacc4\ub85c \ube60\uc838\ubcf4\uc790.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc6d0\ubb38 :&nbsp;http:\/\/kkamagui.springnote.com\/pages\/551093 \ub4e4\uc5b4\uac00\uae30 \uc804\uc5d0&#8230; \uc774 \uae00\uc740 kkamagui\uc5d0 \uc758\ud574 \uc791\uc131\ub41c \uae00\uc785\ub2c8\ub2e4. \ub9c8\uc74c\uaecf \uc778\uc6a9\ud558\uc2dc\uac70\ub098 \uc0ac\uc6a9\ud558\uc154\ub3c4 \ub429\ub2c8\ub2e4. \ub2e8 \ucd9c\ucc98(http:\/\/kkamagui.tistory.com,&nbsp;http:\/\/kkamagui.springnote.com)\ub294 \ubc1d\ud600 \uc8fc\uc2ed\uc2dc\uc624. \uae30\ud0c0 \uc0ac\ud56d\uc740 kkakkunghehe at daum.net \uc774\ub098&nbsp;http:\/\/kkamagui.tistory.com\uc73c\ub85c \ubcf4\ub0b4\uc8fc\uc2dc\uba74&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"http:\/\/www.space4u.co.kr\/wp\/?p=108\">\ub354 \uc77d\uae30<span class=\"screen-reader-text\">BSD \uc18c\ucf13 \ud504\ub85c\uadf8\ub798\ubc0d(Socket Programming) \uc608\uc81c<\/span> <i class=\"fas fa-angle-right\"><\/i><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[53,68,71,70],"aioseo_notices":[],"_links":{"self":[{"href":"http:\/\/www.space4u.co.kr\/wp\/index.php?rest_route=\/wp\/v2\/posts\/108"}],"collection":[{"href":"http:\/\/www.space4u.co.kr\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.space4u.co.kr\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.space4u.co.kr\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.space4u.co.kr\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=108"}],"version-history":[{"count":1,"href":"http:\/\/www.space4u.co.kr\/wp\/index.php?rest_route=\/wp\/v2\/posts\/108\/revisions"}],"predecessor-version":[{"id":109,"href":"http:\/\/www.space4u.co.kr\/wp\/index.php?rest_route=\/wp\/v2\/posts\/108\/revisions\/109"}],"wp:attachment":[{"href":"http:\/\/www.space4u.co.kr\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=108"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.space4u.co.kr\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=108"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.space4u.co.kr\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=108"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}