ȸ¿ø°¡ÀԡžÆÀ̵ð/ºñ¹øã±â
ȨÀ¸·Î

´ÙÁß ¿¬°á Çã¿ë ¼­¹öÀÇ ±¸Çö¹ý (socket programming)
12³â Àü
´ÙÁß »ç¿ëÀÚÀÇ connect ¸¦ ó¸®Çϱâ À§ÇÑ ¹æ¹ýÀº ÃÑ 3°¡ÁöÀÇ ¹æ½ÄÀ¸·Î ±¸ºÐÇÑ´Ù.

1. À¯´Ð½º ȣȯȯ°æ¿¡¼­ Á¦°øÇÏ´Â fork() ¸¦ ÀÌ¿ëÇÑ ´ÙÁß ÇÁ·Î¼¼½º
2. IO ¸ÖƼÇ÷º½ÌÀ» ÀÌ¿ëÇÑ ´ÙÁß ¿¬°á
3. ¸ÖƼ ¾²·¹µå¸¦ ÀÌ¿ëÇÑ ´ÙÁß ¿¬°á

3°¡ÁöÀÇ ¹æ¹ýÀº ¾î¶² °ÍÀÌ ÁÁ´Ù ³ª»Ú´Ù°í ÇÒ °ÍÀÌ ¾Æ´Ï°í Àû´çÇÑ »óȲÇÏ¿¡¼­ ÀûÁ¤ÇÑ ±â¼úÀ» ÀÌ¿ëÇÏ´Â °ÍÀÌ °ü°ÇÀ̶ó°í ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

1. fork() ÀÌ¿ë ¼Ò½º
[CODE] /** ¸ÖƼ ÇÁ·Î¼¼½º¸¦ ÀÌ¿ëÇÑ ¿¡ÄÚ ¼­¹ö ÇÁ·Î±×·¥ ¸®´ª½º ȯ°æÇÏ¿¡¼­ ÄÄÆÄÀÏ Çϼ¼¿ä. Ãâó : ¿­Ç÷°­ÀÇ TCP/IP **/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/socket.h> #define BUFFSIZE 30 void error_handling(const char* message); void z_handler(int sig); int main(int argc, char **argv) { int serv_sock; int clnt_sock; struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; struct sigaction act; int addr_size, str_len, state; pid_t pid; char message[BUFFSIZE]; if(argc!=2) { printf("USAGE: %s <port>\n", argv[0]); exit(1); } act.sa_handler = z_handler; sigemptyset(&act.sa_mask); act.sa_flags=0; state = sigaction(SIGCHLD, &act, 0); if (state != 0) { puts("sigaction() error!"); exit(1); } serv_sock = socket(PF_INET, SOCK_STREAM, 0); memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(atoi(argv[1])); if(bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) error_handling("bind() error"); if(listen(serv_sock, 5) == -1) error_handling("listen() error"); while(1) { addr_size = sizeof(clnt_addr); clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &addr_size); if (clnt_sock == -1) continue; if ((pid ==fork()) == -1) {   close(clnt_sock);   continue; } else if (pid >0) {   puts("connection success");   close("clnt_sock");   continue; } else {   close(serv_sock);   while( (str_len = read(clnt_sock, message, BUFFSIZE)) != 0) {   write(clnt_sock, message, str_len);   write(1, message, str_len);   }   puts("connection closing");   close(clnt_sock);   exit(0); } } return 0; } void z_handler(int sig) { pid_t pid; int rtn; pid = waitpid(-1, &rtn, WNOHANG); printf("zombi process ID: %d\n", pid); printf("return data : %d\n", WEXITSTATUS(rtn)); } void error_handling(const char* message) { fputs(message, stderr); fputc('\n', stderr); exit(1); } [/CODE]

2. select ÀÌ¿ë ¼Ò½º
[CODE] /** IO ¸ÖƼÇ÷º½ÌÀ» ÀÌ¿ëÇÑ ¿¡ÄÚ ¼­¹ö ÇÁ·Î±×·¥ ¸®´ª½º ȯ°æÇÏ¿¡¼­ ÄÄÆÄÀÏ Çϼ¼¿ä. Ãâó : ¿­Ç÷°­ÀÇ TCP/IP **/ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/time.h> #include <netinet/in.h> #define BUFFSIZE 100 void error_handling(const char* message); int main(int argc, char **argv) { int serv_sock; struct sockaddr_in serv_addr; fd_set reads, temps; int fd_max; char message[BUFFSIZE]; int str_len; struct timeval timeout; if (argc != 2) { printf("USAGE : %s <port>\n", argv[0]); exit(1); } serv_sock = socket(PF_INET, SOCK_STREAM, 0); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(atoi(argv[1])); if (bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr))) error_handling("bind() error"); if (listen(serv_sock, 5) == -1) error_handling("listen() error"); FD_ZERO(&reads); FD_SET(serv_sock, &reads); fd_max = serv_sock; while (1) { int fd, str_len; int clnt_sock, clnt_len; struct sockaddr_in clnt_addr; temps = reads; timeout.tv_sec = 5; timeout.tv_usec = 0; if (select(fd_max + 1, &temps, 0, 0, &timeout) == -1)   error_handling("select() error"); for (fd = 0; fd < fd_max+1; fd++) {   if(fd == serv_sock) {   clnt_len = sizeof(clnt_addr);   clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_len);   FD_SET(clnt_sock, &reads);   if (fd_max < clnt_sock)   fd_max = clnt_sock;   printf("client connection : file descriptor %d\n", clnt_sock);   }   else {   str_len = read(fd, message, BUFFSIZE);   if (str_len == 0) {   FD_CLR(fd, &reads);   close(fd);   printf("client closing: file descriptor %d\n", fd);     }   else {   write(fd, message, str_len);   }   } } } } void error_handling(const char* message) { fputs(message, stderr); fputc('\n', stderr); exit(1); } [/CODE]
ÃßõÃßõ : 545 Ãßõ ¸ñ·Ï
¹øÈ£ Á¦¸ñ
´ÙÁß ¿¬°á Çã¿ë ¼­¹öÀÇ ±¸Çö¹ý (socket programming)
16
¸®´ª½º ¼­¹ö Á¤º¸ È®ÀÎ ¼¿½ºÅ©¸³Æ®
15
¸®´ª½º ¼­¹ö ±¸ÃàÇϱâ - ¸®´ª½ºÆ÷ÅÐ
14
¸®´ª½º¼­¹ö ¹«¾ùÀ» ¼±ÅÃÇÒ °ÍÀΰ¡
13
¸®´ª½º ¼­¹ö À¥°ü¸®Åø Webmin
12
ÀÚÁÖ¾²´Â ¸í·É¾î ¸ðÀ½
11
À¯¿ëÇÑ vi¸í·É¾î
10
¸®´ª½º¿¡¼­ PHP, JSP, Servlet¼³Ä¡
9
¸®´ª½º ¼­¹ö ¿î¿µ Ãʺ¸ÀÚ¸¦ À§ÇÑ ºÏ¸¶Å©
8
8. ¾ÆÆÄÄ¡(Apache) HTTP ¼­¹ö ¼³Ä¡¿Í ¿î¿µ
7
7. ¸®´ª½º ¼­¹ö ½Ã½ºÅÛ¿¡ ´ëÇÑ ÀÌÇØ
6
6. NFS ¼­ºñ½º
5
5. ¸ÞÀÏ ¼­ºñ½º
4
4. FTP ¼­ºñ½º
3
3. ÅÚ³Ý ¼­ºñ½º(Telnet)
2
2. ¾î¶² ¼­ºñ½º¸¦ Á¦°øÇÒ °ÍÀΰ¡?
1
1. ½ÃÀÛÇÏ´Â À̾߱â
1
¸ñ·Ï
¹ÂÁ÷Æ®·ÎÆ® ºÎ»ê±¤¿ª½Ã ºÎ»êÁø±¸ °¡¾ßµ¿ ¤Ó °³ÀÎÁ¤º¸Ãë±Þ¹æħ
Copyright ¨Ï musictrot All rights reserved.