ํ์ด์ง์ ์ปจํ
์ธ ๋ฅผ ๋ณด์ํ๋, ๋ฐ๋ก ํ์ด์ง๋ฅผ ๋ฝ์๋ด๋ ๋ ๊ฒ ๊ฐ์ ๋ฌธ์๊ตฌ์กฐ์กฐ์ ํ์์ต๋๋ค. ์๋ ํ์ด์ง ์ด๋ฆ์ ๋ฐ๋ธ์ค์บ ํ2005/Socket Programming in Unix/Windows Implementation์์ต๋๋ค. - ์์ธํ
์ฃผ์ : Socket Programming์ ๊ธฐ์ด์ ์ธ ๋ถ๋ถ์ ์์๋ณธ๋ค.
Contents
1.1. Socket ¶
โป ์์ผ์ด๋?
~cpp #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); // ์ฑ๊ณต ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ, ์คํจ ์ -1 ๋ฆฌํด
1.1.1. domain: ¶
PF_INET : ์ธํฐ๋ท ํ๋กํ ์ฝ ์ฒด๊ณ ์ฌ์ฉ
PF_INET6 IPv6 : ํ๋กํ ์ฝ ์ฒด๊ณ ์ฌ์ฉ
PF_UNIX : ์ ๋์ค ๋ฐฉ์์ ํ๋กํ ์ฝ ์ฒด๊ณ ์ฌ์ฉ (ํ๋ก์ธ์ค๊ฐ ํต์ )
PF_NS XEROX : ๋คํธ์ํฌ ์์คํ
์ ํ๋กํ ์ฝ ์ฒด๊ณ ์ฌ์ฉ
PF๋ Protocol Family
PF๋์ AF๋ฅผ ์ฌ์ฉํด๋ ๋ฌด๋ฐฉ. (ex. PF_INET -> AF_INET)
PF๋์ AF๋ฅผ ์ฌ์ฉํด๋ ๋ฌด๋ฐฉ. (ex. PF_INET -> AF_INET)
1.1.2. type: ์๋น์ค ํ์ ¶
โป TCP/IP, UDP๋?
SOCK_STREAM : ์คํธ๋ฆผ ๋ฐฉ์์ ์์ผ ์์ฑ (TCP/IP)
1.1.3. protocol: ํ๋กํ ์ฝ ¶
IPPROTO_TCP : TCP ๊ธฐ๋ฐ. ๊ฐ์ 0์ด๋ค.
IPPROTO_UDP : UDP ๊ธฐ๋ฐ. ๊ฐ์ 0์ด๋ค.
// ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ํ๋กํ ์ฝ์ธ TCP, UDP๊ฐ 0์ด๋ฏ๋ก 0์ผ๋ก ์จ๋ ๋ฌด๋ฐฉํ๋ค.
// ๊ตฌ์ฒด์ ์ธ ํ๋กํ ์ฝ์ ์ ํํ ๋ ์ฌ์ฉํ๋๋ฐ ๋๋ถ๋ถ์ ์์ฉ ํ๋ก๊ทธ๋ ์์๋ 0์ผ๋ก ์ง์ ํ๋ฉด ๋๋ค.
// ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ํ๋กํ ์ฝ์ธ TCP, UDP๊ฐ 0์ด๋ฏ๋ก 0์ผ๋ก ์จ๋ ๋ฌด๋ฐฉํ๋ค.
// ๊ตฌ์ฒด์ ์ธ ํ๋กํ ์ฝ์ ์ ํํ ๋ ์ฌ์ฉํ๋๋ฐ ๋๋ถ๋ถ์ ์์ฉ ํ๋ก๊ทธ๋ ์์๋ 0์ผ๋ก ์ง์ ํ๋ฉด ๋๋ค.
~cpp ์์ ) main(){ int sockfd; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) fprintf(stderr, "socket ํจ์์์ ์๋ฌ"), exit(1); // ์๋ฌ๊ฐ ๋ฌ์๊ฒฝ์ฐ( sockfd == -1) ์๋ฌ๋ฅผ ์ถ๋ ฅํ๊ณ ํ๋ก๊ทธ๋จ ์ข ๋ฃ. }
1.2. ๋คํธ์ํฌ ์ ๋ณด ¶
~cpp struct sockaddr { u_short sa_family; /* address family */ char sa_data[14]; /* ์ฃผ์(IP ์ฃผ์ + ํฌํธ ๋ฒํธ) */ };
~cpp struct sockaddr_in { short sin_family; // ์ฃผ์ ์ฒด๊ณ๋ฅผ ๋ํ๋ธ๋ค. u_short sin_port; // port ๋ฒํธ struct in_addr sin_addr; // ip ์ฃผ์ char sin_zero[8]; // ์ฐ์ง ์๋ ์ฃผ์ };
โป ์ sockaddr๊ณผ sockaddr_in์ structure๊ฐ ๊ฐ์๊น?
1.2.1. sin_family: // ์ฃผ์์ฒด๊ณ ¶
AF_INET : ์ธํฐ๋ท ์ฃผ์ ์ฒด๊ณ
AF_UNIX : ์ ๋์ค ํ์ผ ์ฃผ์ ์ฒด๊ณ
AF_NS XEROX : ์ฃผ์ ์ฒด๊ณ
// sockaddr_in ์ TCP/IP์ฒด์ ์ด๋ฏ๋ก AF_INET๋ง ์ฌ์ฉํ๋ค. -> TCP/IP๋ ์ธํฐ๋ท ๊ธฐ๋ฐ์ด๋ฏ๋ก.
// AF_INET/PF_INET -> ์ธํฐ๋ท ํ๋กํ ์ฝ ์ฒด๊ณ ์ฌ์ฉ.
// AF_INET/PF_INET -> ์ธํฐ๋ท ํ๋กํ ์ฝ ์ฒด๊ณ ์ฌ์ฉ.
~cpp ๋ฐ์ดํฐ๋ฅผ Big-Endian์ผ๋ก ๋ณํ ์์ผ์ฃผ๋ ์ฒด๊ณ. unsigned short integer ๋ณํ (2๋ฐ์ดํธ ํฌ๊ธฐ) htons(): host-to-network ๋ฐ์ดํธ ๋ณํ (Big-Endian์ผ๋ก ๋ณํ) ntohs(): network-to-host ๋ฐ์ดํธ ๋ณํ (ํด๋น ์์คํ ) unsigned long integer ๋ณํ (4๋ฐ์ดํธ ํฌ๊ธฐ) htonl(): host-to-network ๋ฐ์ดํธ ๋ณํ (Big-Endian์ผ๋ก ๋ณํ) ntohl(): network-to-host ๋ฐ์ดํธ ๋ณํ (ํด๋น ์์คํ ) โป ์ ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ Big-Endian์ผ๋ก ๋ณํ ์์ผ์ฃผ์ด์ผํ ๊น? โป ๊ทธ๋ ๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ์ ์กํ๋ ๋ฐ์ดํฐ ๋ชจ๋ Big-Endian์ผ๋ก ๋ณํ ์์ผ์ฃผ์ด์ผํ ๊น?
1.2.2. sin_port: ¶
NULL : ์์์ ํฌํธ๋ฅผ ํ ๋นํ๋ค. client์์ ์ฌ์ฉํ๋ค.
// u_short sin_port ์ Big-Endian์ ์ฌ์ฉํ๋ค.
// ๋ฐ๋ผ์ Little_Endian์ ์ฌ์ฉํ๋ ์์คํ ์์๋ Big-Endian์ผ๋ก ๋ฐ๊ฟ์ค์ผํ๋ค.
// u_short sin_port ์ Big-Endian์ ์ฌ์ฉํ๋ค.
// ๋ฐ๋ผ์ Little_Endian์ ์ฌ์ฉํ๋ ์์คํ ์์๋ Big-Endian์ผ๋ก ๋ฐ๊ฟ์ค์ผํ๋ค.
1.2.3. sin_addr: ¶
INADDR_ANY : ์๊ธฐ ์์ ์ ์ฃผ์๋ฅผ ํ ๋นํ๋ค. (== 0)
// sin_addr์ ์ธํฐ๋ท ์ฃผ์๋ฅผ ๋ด๊ณ ์์ผ๋ฏ๋ก 4 ๋ฐ์ดํธ๊ฐ ํ์ํ๋ค.
cf. ๋๋ฉ์ธ ๋ค์์ ํตํ ์ฐ๊ฒฐ์ ์ค๋ช ํ์ง ์๊ฒ ์ต๋๋ค.
// sin_addr์ ์ธํฐ๋ท ์ฃผ์๋ฅผ ๋ด๊ณ ์์ผ๋ฏ๋ก 4 ๋ฐ์ดํธ๊ฐ ํ์ํ๋ค.
cf. ๋๋ฉ์ธ ๋ค์์ ํตํ ์ฐ๊ฒฐ์ ์ค๋ช ํ์ง ์๊ฒ ์ต๋๋ค.
~cpp struct in_addr { unsigned long s_addr; };
~cpp /* inet_addr(): ์ฃผ์๋ฅผ longํ์ผ๋ก ๊ณ์ฐํ๊ณ htonl()๋ฅผ ์ฌ์ฉํด Big-Endian์ผ๋ก ๋ณํ ํ ๊ฐ์ return ํ๋ค. // 165.194.27.129 -> 165*256*256*256 + 194*256*256 + 27*256 + 129 = 2780961665 // 2780961665 ์ ๊ฐ์ Little-Endian ์ฒด๊ณ์์๋ 811BC2A5์ด๋ค. // ์ด๊ฒ์ A5C21B81๋ก ๋ฐ๊ฟ ์ ์ฅํ๋ค. ์์ ) ina.sin_addr.s_addr = inet_addr("127.0.0.1"); */
1.2.4. sin_zero''''''8'''''': ¶
// sin_zero ๋ฐฐ์ด์ ํญ์ 0์ผ๋ก ์ฑ์์ ธ ์์ด์ผํ๋ค.
โป ์ sin_zero๊ฐ ๋ง๋ค์ด์ก์๊น์?
โป ์ sin_zero๊ฐ ๋ง๋ค์ด์ก์๊น์?
~cpp ์์ ) #define PORT 9999 #define SERVER_IP "165.194.27.129" main(){ struct sockaddr_in ina; memset((struct sockaddr *)&ina, 0, sizeof(struct sockaddr)); // sin_zero๋ฅผ 0์ผ๋ก ์ฑ์ด๋ค. // bzero๋ผ๋ ํจ์๋ ์์ง๋ง ์ด๊ธฐ์ 0์ผ๋ก ์ฑ์ฐ๋ ๊ฒ์ด ํธํ๋ค. // bzero(&(ina.sin_zero), 8); ina.sin_port = htons(PORT); // PORT์ ๊ฒฝ์ฐ ์ ์๋ฅผ ๋ฃ์ด์ผํ๋ค. ina.sin_addr.s_addr = inet_addr(SERVER_IP); // ํด๋ผ์ด์ธํธ์ ๊ฒฝ์ฐ // SERVER_IP์ ๊ฒฝ์ฐ ๋ฌธ์์ด ํฌ์ธํฐ๋ฅผ ๋ฃ์ด์ผํ๋ค. // 165.194.27.129 -> 165*256*256*256 + 194*256*256 + 27*256 + 129 = 2780961665 ๋ก ์ ์ฅ์ด ๋๋ค. // ina.sin_addr.s_addr = INADDR_ANY; // ์๋ฒ์ ๊ฒฝ์ฐ }
2.1. Bind - socket๊ณผ ๋คํธ์ํฌ ์ ๋ณด๋ฅผ ์ฐ๊ฒฐํ๋ Bind!!! ¶
~cpp #include <sys/socket.h> int bind(int sockfd, struct sockaddr *myaddr, int addrlen); // ์ฑ๊ณต ์ 0, ์คํจ ์ -1 ๋ฆฌํด
~cpp ์์ ) if( bind(sockfd, (struct sockaddr *)&ina, sizeof(struct sockaddr) == -1 ) fprintf(stderr, "bind์์ ์๋ฌ๊ฐ ๋ฌ์ต๋๋ค.n")), exit(1);
2.2. listen - client์ ์์ฒญ์ ๊ธฐ๋ค๋ฆฐ๋ค! ¶
~cpp #include <sys/socket.h> int listen(int sockfd, int backlog); // ์ฑ๊ณต ์ 0, ์คํจ ์ -1 ๋ฆฌํด // backlog๋ ์๋ฒ์ ์ ์ํ ์ฌ๋์ ๋๊ธฐ์ Maximum์ ์๋ฏธํ๋ค.
~cpp ์์ ) #deinfe BACKLOG 5 // ๋๊ธฐ์๊ฐ 5๋ช ์ด ๋์ผ๋ฉด ์ ์ ๋ถ๊ฐ๋ฅํ๋ค. if( listen(sockfd, BACKLOG) == -1 ) fprintf(stderr, "listen์์ ์๋ฌ๊ฐ ๋ฌ์ต๋๋ค.n"), exit(1);
2.3. accpet - client์ ์์ฒญ์ ๋ฐ์๋ค์ธ๋ค! ¶
~cpp #include <sys/socket.h> int accept(int sockfd, struct sockaddr *addr, int *addrlen); // ์ฑ๊ณต ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ, ์คํจ ์ -1 ๋ฆฌํด // *addrlen์ ์ฃผ์. accept๋ client์ ์ธํฐ๋ท ์ ๋ณด๊ฐ ๋ค์ด์ค๋ฉด addrlen์ ํฌ๊ธฐ(struct sockaddr_in์ ํฌ๊ธฐ)์ // ๋น๊ต๋ฅผ ํ์ฌ ํฌ๋ค๋ฉด ๋ฐ์๋ค์ด์ง ์๊ณ , ์๋ค๋ฉด ํฌ๊ธฐ๋ฅผ ์ค์ผ๊ฒ์ด๋ค.
// child process๋ฅผ ์์ฑํด ๋ค์ค ์ฐ๊ฒฐ์ ํ๋ ๊ฒ์ ์ค๋ช
ํ์ง ์์ต๋๋ค.
~cpp ์์ ) // int server_sock, client_sock // struct sockaddr_in server_addr, client_sock int sizeof_sockaddr_in; sizeof_sockaddr_in = sizeof(struct sockaddr_in); client_sock = accept(server_sock, (struct sockaddr *)&client_addr, &sizeof_sockaddr_in); if( client_sock == -1 ) fprintf(stderr, "accept์๋ฌ. client๊ฐ ์๋ฒ์ ์ ์ ํ ์ ์์ต๋๋ค.");
3.1. connect - Server์ ์ฐ๊ฒฐํ๋ค. ¶
โป connect์ server ํจ์์ค ์ด๋ ํ ํจ์๊ฐ ๋ฎ์๋์ง ์ด์ผ๊ธฐ ํด๋ณด์.
โป ์ด๋ฅผ ์ด์ผ๊ธฐ ํด๋ณด๊ณ client์ ํ๋ก๊ทธ๋จ์ ๋คํธ์ํฌ ์ ๋ณด(struct sockaddr_in)์๋ ๋ฌด์์ด ๋ค์ด๊ฐ์ผํ๋์ง ์ด์ผ๊ธฐํด๋ณด์.
โป ์ด๋ฅผ ์ด์ผ๊ธฐ ํด๋ณด๊ณ client์ ํ๋ก๊ทธ๋จ์ ๋คํธ์ํฌ ์ ๋ณด(struct sockaddr_in)์๋ ๋ฌด์์ด ๋ค์ด๊ฐ์ผํ๋์ง ์ด์ผ๊ธฐํด๋ณด์.
~cpp #include <sys/types.h> #include <sys/socket.h> int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); // ์ฑ๊ณต ์ 0, ์คํจ ์ -1 ๋ฆฌํด
~cpp ์์ ) if( connect(client_sock, (struct sockaddr *)&client_addr, sizeof(struct sockaddr)) == -1 ) fprintf(stderr, "์๋ฒ์ connect ํ ์ ์์ต๋๋ค."), exit(1);
4.1. close ํ์ผ์ ๋ซ๋๋ค. ¶
~cpp #include <unistd.h> int close(int fildes); // ์ฑ๊ณต ์ 0, ์คํจ ์ -1 ๋ฆฌํด
~cpp ์์ ) close(sockfd);
5.1. send/write - ์๋์๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ธ๋ค. ¶
~cpp #include <unistd.h> ssize_t send(int fildes, const void * buf, size_t nbytes, unsigned int flags); ssize_t write(int fildes, const void * buf, size_t nbytes); // ์ฑ๊ณต ์ ์ ๋ฌ ํ ๋ฐ์ดํธ ์, ์คํจ ์ -1 ๋ฆฌํด
~cpp ์์ ) char buf1[] = "Hello, World!"; char *buf2 = "Hello, World!"; if( send(client_sock, buf1, sizeof(buf), 0) == -1 ) fprintf(stderr, "send error"); if( write(client_sock, buf2, strlen(buf2)) == -1 ) fprintf(stderr, "write error"); // ํ ์์คํ ์ผ๋ก ์ด์์ ์ํด ๋๋๋ก send๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
5.2. recv/read - ์๋์๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋๋ค. ¶
~cpp #include <unistd.h> ssize_t recv(int fildes, void *buf, size_t nbytes, unsigned int flags); ssize_t read(int fildes, void *buf, size_t nbytes); // ์ฑ๊ณต ์ ์์ ํ ๋ฐ์ดํธ ์(๋จ EOF๋ง๋๋ฉด 0), ์คํจ ์ -1 ๋ฆฌํด
~cpp ์์ ) char buf1[200]; char buf2[200]; int str_len; str_len = recv(sockfd, buf1, sizeof(buf1), 0); str_len = read(sockfd, buf2, sizeof(buf2)); buf1[str_len] = 0; // ๋ฐฐ์ด์ ๋์ ์ค์ ํด์ค๋ค. ํ์ง ์์ผ๋ฉด ๋ค์ ์ฐ๋ ๊ธฐ ๊ฐ๊น์ง ์ ๊ทผ๋๋ค. buf1[str_len] = 0; // ํ ์์คํ ์ผ๋ก ์ด์์ ์ํด ๋๋๋ก send๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
6. โป ์๋์ฐ ๊ธฐ๋ฐ์์๋... ¶
~cpp โ Visual C++์์ ๋น ์์ค ํ์ผ ํ๋๋ฅผ ์ฐ๋ค. Project -> Setting -> LINK ๋ฉ๋ด -> Object/library modules: ์ ๋๋ถ๋ถ์ ws2_32.lib ๋ฅผ ์ถ๊ฐํ๋ค. โ #include <sys/socket.h> -> #include <winsock2.h> โ UNIX ์ฒด๊ณ์์ ์ฌ์ฉํ๋ ํจ์๋ค์ ํค๋ํ์ผ์ด Windows ๊ธฐ๋ฐ์์๋ ์กด์ฌํ์ง ์์ ์๋ ์๋ค. โ struct sockaddr_in -> SOCKADDR_IN โ int sockfd; -> SOCKET sockfd; // ์์ผ ๋์คํฌ๋ฆฝํฐ // ์์ผ ํธ๋ค โ main() ํจ์ ๋ด๋ถ์ WSADATA wsaDATA; // ์ถ๊ฐ. WSADATAํ์ ๋ณ์๋ฅผ ์ ์ธํ๋ค. if( WSAStartup(MAKEWORD(2,2), &wsaData) != 0) fprintf(stderr, "WSAStartup Error"), exit(1); // ์ถ๊ฐ. WSAStartup() ์ socket์ ๋ฒ์ ผ์ ws2_32 ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๋ฌํ๋ค. // ํ๋ก๊ทธ๋จ์ด ๋๋ ๋, ํญ์ WSACleanup()์ผ๋ก ๋ฆฌ์์ค๋ฅผ ํด์ ํด์ผํ๋ค.
~cpp ์์ ) #include <winsock2.h> main(){ WSADATA wsaDATA; SOCKET sockfd; // UNIX ๊ธฐ๋ฐ์ int sockfd; SOCKADDR_IN ina; // UNIX ๊ธฐ๋ฐ์ struct sockaddr_in ina; if( WSAStartup(MAKEWORD(2,2), &wsaData) != 0) fprintf(stderr, "WSAStartup Error"), exit(1); ... ๋ด์ฉ WSACleanup(); }
7. server ์์ ¶
~cpp #include <stdio.h> #include <winsock2.h> #define PORT 9999 // ์๋ฒ์ 9999๋ฒ ํฌํธ๋ฅผ ์ฐ๋ค #define BACKLOG 5 void error(char *buf) { puts(buf), exit(1); } main(){ WSADATA wsaData; SOCKET server_sock; // ์๋ฒ์ socket์ ์์ฑ SOCKET client_sock; // ํด๋ผ์ด์ธํธ์ socket์ ์์ฑ SOCKADDR_IN server_addr; // ๋คํธ์ํฌ์ ์ ๋ณด๋ฅผ ๋ด์ structure ์์ฑ. SOCKADDR_IN client_addr; int sizeof_sockaddr_in; char msg[] = "Hello, World!"; if( WSAStartup(MAKEWORD(2,2), &wsaData) == -1 ) error("WSAStartup Error"); // socket ์ค์ // ํ๋ก๊ทธ๋๋จธ๋ ์ด๊ฒ์ ํตํด ๋คํธ์ํฌ์ ๋ํ๋ฅผ ํ๋ค. server_sock = socket(AF_INET, SOCK_STREAM, 0); if( server_sock == -1 ) error("server socket error"); // ๋คํธ์ ์ ๋ณด ์ค์ // ์ด๊ฒ์ ํ๋ก๊ทธ๋จ์ด socket๊ณผ ์ฐ๊ฒฐํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ค. memset((SOCKADDR_IN *)&server_addr, 0, sizeof(SOCKADDR_IN)); // struct sockaddr_in -> SOCKADDR_IN server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; // ์์ ์ ์ฃผ์๋ก ์ค์ ํ๋ค. server_addr.sin_port = htons(PORT); // socket๊ณผ ๋คํธ์ ์ ๋ณด๋ฅผ bind()๋ก ์ฐ๊ฒฐํ๋ค. if( bind(server_sock, (sockaddr *)&server_addr, sizeof(SOCKADDR_IN)) == -1 ) error("bind() ์๋ฌ"); // ์ค๋น๋ ๋๋ฌ๋ค! // listen()์ผ๋ก client์ ์ฐ๊ฒฐ ์์ฒญ์ ๊ธฐ๋ค๋ฆฌ์. // client์ ์์ฒญ์ด ์ฌ ๋ ๊น์ง ์๋ฒ๋ ์ฌ๊ธฐ์ ๊ธฐ๋ค๋ฆฐ๋ค. if( listen(server_sock, BACKLOG) == -1 ) error("listen() ์๋ฌ"); // client์ ์์ฒญ์ด ์ค๋ฉด server๋ accept() ํจ์๋ก ์์ฒญ์ ๋ฐ์๋ค์ธ๋ค. // client์์ ๋ฐ์ดํฐ ์ ์ก์ ์ํด client ์์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ํ์ํ๋ค. sizeof_sockaddr_in = sizeof(SOCKADDR_IN); while(1) { client_sock = accept(server_sock, (sockaddr *)&client_addr, &sizeof_sockaddr_in); if( client_sock == -1 ) { // accept๊ฐ ์คํจํ๋ฉด while์ ์ฒ์์ผ๋ก ๋์๊ฐ ๋ค์ client๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค. fprintf(stderr, "accept() ์๋ฌ"); continue; } send(client_sock, msg, sizeof(msg), 0); //close(client_sock); WSACleanup(); } exit(0); // exit๋ก ์ข ๋ฃ๋ฅผ ํ๋ฉด ๋ชจ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์๋์ผ๋ก ๋ซ๊ณ ์ข ๋ฃํ๋ค. }
โป ์ปดํจํฐ๋ ํ๋์ ์ฒ๋ฆฌ๋ฐ์ ํ์ง ๋ชปํ๋ค. ๋ฐ๋ผ์ ์์ ์์ค๋ ํ๋์ client๋ฐ์ ๋ฐ์ ๋ค์ผ ์ ๋ฐ์ ์๋ค.
์ด๋ป๊ฒ ํ๋ฉด ์ฌ๋ฌ client๋ฅผ ๋์์ ๋ฐ์๋ค์ผ ์ ์์๊น?
8. ์ค์ต ¶
์์ server ์ ์ ์ ํ๋ client ํ๋ก๊ทธ๋จ์ ์ง๊ณ , Server๊ฐ ๋ณด๋ด๋ ๋ฉ์ธ์ง์ธ "Hello, World!"๋ ๋ฌธ์ฅ์ clinet ํ๋ฉด์ ์ถ๋ ฅํ๋๋ก ํ๋ค.
9. ์ฐธ๊ณ ์ฌ์ดํธ ¶
An Introduction to Socket Programming : http://www.uwo.ca/its/doc/courses/notes/socket/
Beej's Guide to Network Programming : http://www.ecst.csuchico.edu/~beej/guide/net/html/
Beej's ๋ฒ์ญํ : ์์น์์ง์์ ์ฐพ์๋ณด์ธ์. (๋ฌด์ฑ
์)
Socket Programming in Python : http://www.amk.ca/python/howto/sockets/
IPv6 Socket Programming : http://www.joinc.co.kr/modules/moniwiki/wiki.php/article_IPv6_Programing?action=print2
----
ํ๋ก๊ทธ๋๋ฐ๋ถ๋ฅ
ํ๋ก๊ทธ๋๋ฐ๋ถ๋ฅ