ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
¾Æ·¡ÀÇ Å¬·¡½º¸¦ Ȱ¿ëÇÑ ¿¹Á¦

* °³¿ä

´ë´Ù¼ö ³×Æ®¿÷¼­¹ö¿¡¼­ »ç¿ëµÉ ¼ö ÀÖ´Â ºñµ¿±â ´ÙÁß ¼ÒÄÏ Å¬·¡½ºÀÌ´Ù. ±âº»ÀûÀ¸·Î ¼ÒÄϼ­¹ö¸¦ À§ÇØ ±¸ÇöµÇ¾úÀ¸¸ç À¥ºê¶ó¿ìÀú°°Àº ´ÙÁßÁ¢¼Ó Ŭ¶óÀÌ¾ðÆ®·Îµµ »ç¿ë°¡´ÉÇϸç Áß°è¼­¹ö°°ÀÌ ¼­¹ö ¹× ´ÙÁß connect °â¿ëÀ¸·Îµµ »ç¿ëµÉ ¼ö ÀÖ´Ù.(»ç½Ç ÀÌ ¸ñÀûÀ¸·Î ¼³°èµÇ¾ú´Ù)


  • »ç¿ë¹ý

    asyncSocketÀ» »ó¼Ó¹Þ´Â ¼ÒÄϼ­¹ö Ŭ·¡½º¸¦ ¸¸µç´Ù. À̶§ °¡»óÇÔ¼ö 3°³¸¸ ±¸ÇöÇÏ¸é µÈ´Ù. ¶ÇÇÑ ¾²·¹µå ÀÎÅÍÆäÀ̽º¿Í(´Ù¸¥ À§Å°ÆäÀÌÁö¿¡ ÀÖÀ½) ´ÙÁß »ó¼ÓÇÏ¿© ºñµ¿±â ¼ÒÄϼ­¹ö ¾²·¹µå °´Ã¼¸¦ ¼Õ½±°Ô ¸¸µé¼ö ÀÖÀ»°ÍÀÌ´Ù.


  • ¿¹Á¤

    Ä¿³Î2.4.x ¸¦ »ç¿ëÇÒ ¼ö ¹Û¿¡ ¾ø´Â ¼­¹ö¿¡ »ç¿ëµÉ ¿¹Á¤À̾úÀ¸¹Ç·Î pollÀ» ÀÌ¿ëÇØ¼­ ±¸ÇöÇÏ¿´À¸³ª Ä¿³Î2.6ÀÇ °­·ÂÇÑ ±â´ÉÁß ÇϳªÀÎ epoll·Î pollºÎºÐÀ» ´ëüÇÒ °ÍÀÌ´Ù.


  • ¿¹Á¦

    ´Ù¸¥ À§Å°ÆäÀÌÁö¿¡¼­ ÀÌ Å¬·¡½º ¶óÀ̹ö·¯¸®¸¦ ÀÌ¿ëÇÑ ¼­¹öŬ¶óÀÌ¾ðÆ® ¸ðµ¨À» º¸¿©ÁÙ°ÍÀ̸ç, ¶Ç ´Ù¸¥ À§Å°ÆäÀÌÁö¿¡¼­ ¿ÂÀüÇÑ ¼­¹ö ¸ðµ¨ - ¾²·¹µå ÀÎÅÍÆäÀ̽º¿Í IPC¸¦ ÀÌ¿ëÇÑ DB¾²·¹µå+¼ÒÄϾ²·¹µå+Main Timer ·Î ±¸¼ºµÈ - À» º¸¿©ÁÙ°ÍÀÌ´Ù.


  • Âü°í

    ÇÔ¼öµéÀÇ ¿¡·¯¹ß»ý½Ã syslogd¸¦ ÀÌ¿ëÇÏ¿© ¿¡·¯·Î±×¸¦ »ý¼º½ÃŰ°Ô µÇ¾î ÀÖÀ¸³ª Å×½ºÆ®½Ã¿£ log.cppÀÇ syslogºÎºÐÀ» printf·Î ´ëüÇÏ¿© »ç¿ëÇϸé Å×½ºÆ®Çϱâ ÁÁÀ»°ÍÀÌ´Ù.


  • sock.h
  • /*  
     *  ±âº» ¼ÒÄÏ Å¬·¡½º 
     * 
     *  Copyright (c) KarlLy corp. All rights reserved. Code by SaNha - 2003. 11. 23.
     */
    
    #ifndef _SOCKET_
    #define _SOCKET_
    
    #include <netinet/in.h>
    
    class Sock {
    
            private :
                    int flags;                                                                                                              // ¼ÒÄÏ »óÅ Ç÷¡±×
                    int fd;                                                                                                                 // ¼ÒÄÏ ±â¼úÀÚ
                    struct sockaddr_in addr;                                                                        // ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼
                    static socklen_t len;                                                                           // ¼ÒÄÏÁÖ¼Ò ±¸Á¶Ã¼ Å©±â
                    struct {                                                                                                                        // sReadLineÀÇ »ç¿ëÀ» À§ÇØ ÇѲ¨¹ø¿¡ Àоî³õ´Â ÀӽùöÆÛ ±¸Á¶Ã¼
                            char *buff;                                                                                                     // ÀӽùöÆÛ
                            size_t size;                                                                                                    // ÀӽùöÆÛÀÇ Å©±â
                            ssize_t num;                                                                                            // ÀӽùöÆÛÀÇ Àоî³õÀº µ¥ÀÌÅÍ·®
                            size_t index;                                                                                           // ÀӽùöÆÛÀÇ Àоî¾ß ÇÏ´Â À§Ä¡¸¦ °¡¸®Å´ 
                    } tmpBuf;
    
            public :
                    Sock(void);
                    Sock(size_t tmpBufSize);                                                                        // sReadLineÀ» »ç¿ëÇÒ¶§ ÇÊ¿ä
                    ~Sock(void);
                    void setAddr(const char* ip, int port);                         // ¼ÒÄÏÁÖ¼Ò ¼ÂÆÃ
                    int setSocket(int family, int type, int protocol);              // ¼ÒÄÏ »ý¼º
                    void sClose(void);                                                                                      // ¼ÒÄÏ ÇØÁ¦
                    int aConnect(int retry);                                                                                // ºñºÀ¼â connect½Ãµµ (POLLIN | POLLOUT üũ ÇÊ¿ä)
                    int sConnect(int retry);                                                                                // retry Ƚ¼ö¸¸Å­ connect½Ãµµ
                    int saveFlags(void);                                                                            // ¼ÒÄÏ status ÀúÀå
                    int setFlags(long arg);                                                                         // ¼ÒÄÏ status ¼ÂÆÃ
                    int restoreFlags(void);                                                                         // ÀúÀåµÈ ¼ÒÄÏ stauts º¹¿ø              
                    int sBind(void);                                                                                                // ¼­¹ö¼ÒÄÏ bind
                    int sListen(int backlog);                                                                       // ¼­¹ö¼ÒÄÏ listen
                    int sAccept(int svrSock);                                                                       // ¼­¹ö¼ÒÄÏ fd ¸¦ accept ÇÑ´Ù
                    int getFd(void);                                                                                                // fd¸¦ ¸®ÅÏÇÑ´Ù
                    ssize_t sSend(const void* buff, size_t size, int flags);                // Send Æ÷ÀåÇÔ¼ö
                    ssize_t sSendN(const void* buff, size_t size, int flags);       // Send Æ÷ÀåÇÔ¼ö(sizeÀü¼Û¿Ï·á±îÁö Àç½Ãµµ)
                    ssize_t sSendR(const void* buff, size_t size, int flags);       // µ¥ÀÌÅÍÅ©±â+µ¥ÀÌÅÍ·Î µÈ ÆÐŶÀ» º¸³»´Â ÇÔ¼ö 
                    ssize_t sRecv(void* buff, size_t size, int flags);      // Recv Æ÷ÀåÇÔ¼ö(MSG_WAITALL flag »ç¿ëÀ¸·Î sRecvN ¿ªÇÒ)         
                    ssize_t sRecvR(void* buff, int flags);                                  // µ¥ÀÌÅÍÅ©±â+µ¥ÀÌÅÍ·Î µÈ ÆÐŶÀ» ¹Þ´Â ÇÔ¼ö 
                    ssize_t sRecvLine(void* buff);                                                  // \n ÀÌ ³ª¿Ã¶§±îÁö ÀоîµéÀÓ
                    int sGetSockOpt(int level, int optname, void* optval, socklen_t* optlen); // ºñµ¿±âconnectÀÇ ¼º°ø¿©ºÎÆò°¡¿¡ »ç¿ë
                    in_addr_t getIP(void);                                                                          // addrÀÇ IP Ãâ·Â
    
    };
    
    #endif
    
    

    • sock.cpp
    /*  
     *  ±âº» ¼ÒÄÏ Å¬·¡½º 
     * 
     *  Copyright (c) KarlLy corp. All rights reserved. Code by SaNha - 2003. 11. 23.
     */
    
    #include <string.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/socket.h>
    #include<arpa/inet.h>
    #include <errno.h>
    #include "sock.h"
    #include "log.h"
    
    #define INT_SIZE sizeof(size_t)
    
    socklen_t Sock :: len = sizeof(struct sockaddr_in);
    
    Sock :: Sock(void) {
            tmpBuf.buff = NULL;
            fd = -1;
    }
    
    Sock :: Sock(size_t tmpBufSize) {
            tmpBuf.buff = new char[tmpBufSize];
            tmpBuf.size = tmpBufSize;
            tmpBuf.num = 0;
            fd = -1;
    }
    
    Sock :: ~Sock(void) {
            if (tmpBuf.buff != NULL) delete[] tmpBuf.buff;
    }
    
    void Sock :: setAddr(const char* ip, int port) {
            memset(&addr, 0, len);
            addr.sin_family = AF_INET;
            if (ip == "INADDR_ANY") {
                    addr.sin_addr.s_addr = htonl(INADDR_ANY);                       // ¼­¹ö ¼ÒÄÏÀ϶§
            } else {
                    inet_pton(AF_INET, ip, &addr.sin_addr);                         // Ŭ¶óÀÌ¾ðÆ® ¼ÒÄÏÀ϶§
            }
            addr.sin_port = htons(port);
    }
    
    int Sock :: setSocket(int family, int type, int protocol) {
            if ((fd = socket(family, type, protocol)) < 0) {
                    writeError("Socket creation failed");
                    return(-1);
            } else {
                    return(0);
            }
    }
    
    void Sock :: sClose(void) {
            if (close(fd) < 0) {
                    writeError("Close socket failed");
            }
            fd = -1;                                                                                                                                // »ç¿ëÁßÀÎ ¼ÒÄϰú ±¸ºÐÀ» À§ÇØ -1´ëÀÔ
    }
    
    int Sock :: aConnect(int retry) {
            flags = fcntl(fd, F_GETFL, 0);                                                                          // socket status flags ¹é¾÷
            fcntl(fd, F_SETFL, flags | O_NONBLOCK);                                 // ºñºÀ¼â ¼ÒÄϼ³Á¤      
            while (retry-- > 0) {
                    if (connect(fd, (struct sockaddr*) &addr, len) == 0) {  // Áï°¢ ¿¬°áµÇ¾ú´Ù¸é
                            fcntl(fd, F_SETFL, flags);                                                                              // ºÀ¼â¼ÒÄÏÀ¸·Î ȯ¿ø
                            return(1);
                    } else if (errno != EINPROGRESS) {                                                      // Áï°¢ ¿¬°áµÇÁø ¾Ê°í ½ÇÆÐÇß´Ù¸é
                            writeError("Socket Connection failed");
                            usleep(10000);                                                                                                  // Àá½Ã ¸ØÃè´Ù°¡ ´Ù½Ã ½Ãµµ
                    } else {                                                                                                                                        // Á¤»óÀûÀÎ connect ÁßÀ̶ó¸é
                            return(0);
                    }
            }
            writeCrit("Socket connection times exceeded");
            return(-1);
    }
    
    int Sock :: sConnect(int retry) {
            while (retry-- > 0) {
                    if (connect(fd, (struct sockaddr*) &addr, sizeof(addr)) < 0) {
                            writeError("Socket connection failed");
                            usleep(10000);                                                                                  // µô·¹À̸¦ Àá±ñ ÁØ´Ù
                    } else {
                            return(0);
                    }
            }
            writeCrit("Socket connection timeout");
            return(-1);
    }
    
    int Sock :: saveFlags(void) {
            if ((flags = fcntl(fd, F_GETFL, 0)) < 0) {
                    writeError("Get socket status flags failed");
                    return(-1);
            } else {
                    return(0);
            }
    }
    
    int Sock :: setFlags(long arg) {
            if (fcntl(fd, F_SETFL, flags | arg) < 0) {
                    writeError("Set socket status flags failed");
                    return(-1);
            } else {
                    return(0);
            }
    }
    
    int Sock :: restoreFlags(void) {
            if (fcntl(fd, F_SETFL, flags) < 0) {
                    writeError("Restore socket status flags failed");
                    return(-1);
            } else {
                    return(0);
            }
    }
    
    int Sock :: sBind(void) {
            if (bind(fd, (struct sockaddr*) &addr, sizeof(addr)) < 0) {
                    writeError("Socket binding failed");
                    return(-1);
            } else {
                    return(0);
            }
    }
    
    int Sock :: sListen(int backlog) {
            if (listen(fd, backlog) < 0) {
                    writeError("Socket listening failed");
                    return(-1);
            } else {
                    return(0);
            }
    }
    
    int Sock :: sAccept(int svrFd) {                                                                                        // svrRd : ¼­¹ö¼ÒÄÏ fd
            fd = accept(svrFd, (struct sockaddr*) &addr, &len);
            if (fd < 0) {
                    writeError("Socket acception failed");
                    return(-1);
            } else {
                    return(0);
            }
    }
    
    ssize_t Sock :: sRecv(void* buff, size_t size, int flags) {
            ssize_t len;
            if ((len = recv(fd, buff, size, flags)) < 0) {
                    writeError("Socket receive failed");
            }
            return(len);
    }
    
    ssize_t Sock :: sSend(const void* buff, size_t size, int flags) {
            ssize_t len;
            if ((len = send(fd, buff, size, flags)) < 0) {
                    writeError("Socket send failed");
            }
            return(len);
    }
    
    ssize_t Sock :: sSendN(const void* buff, size_t size, int flags) {
            char* tmp;                                                                                                                      // void* ÀÇ Áõ°¡¸¦ À§ÇÔ
            size_t leftN;                                                                                                           // ¾²¾ßÇÒ ³²Àº µ¥ÀÌÅÍ ¾ç
            ssize_t sendN;                                                                                                  // ¾²±â¿¡ ¼º°øÇÑ µ¥ÀÌÅÍ ¾ç
            tmp = (char*) buff;
            leftN = size;
            while (leftN > 0) {                                                                                             // ¾µ µ¥ÀÌÅͰ¡ ³²¾ÆÀִµ¿¾È
                    if ((sendN = send(fd, tmp, leftN, flags)) <= 0) {
                            writeError("Socket send failed");
                            return(-1);
                    }
                    leftN -= sendN;                                                                                         // ¾²¾ßÇÒ µ¥ÀÌÅÍ·® °¨¼Ò
                    tmp += sendN;                                                                                                   // ¾²±â ¼º°øÇÑ µ¥ÀÌÅͱîÁö Æ÷ÀÎÅÍÀ̵¿
            }
            return(size);                                                                                                           // Àüü ¾²±â¿¡ ¼º°øÇÑ µ¥ÀÌÅÍ·®À» ¹Ýȯ
    }
    
    ssize_t Sock :: sSendR(const void* buff, size_t size, int flags) {                      // size : µ¥ÀÌÅͺκÐÀÇ Å©±â
            size_t sz;
            char temp[size + INT_SIZE];
            sz = htonl(size);                                                                                                                               // ³×Æ®¿÷ ¹ÙÀÌÆ® ¿À´õ·Î ¹Ù²Þ
            memcpy(temp, &sz, INT_SIZE);                                                                                    // µ¥ÀÌÅÍ Å©±â³ÖÀ½
            memcpy(temp + INT_SIZE, buff, size);                                                                    // µ¥ÀÌÅÍ ³ÖÀ½
            return(sSendN(temp, size + INT_SIZE, flags));                                           // µ¥ÀÌÅÍÅ©±â+µ¥ÀÌÅÍ ¸¦ ¼ÒÄÏ¿¡ º¸³¿
    }
    
    ssize_t Sock :: sRecvR(void* buff, int flags) {
            ssize_t len;                                                                                                                                            // ÀÐÀº Å©±â
            size_t dataSize;                                                                                                                                // ½ÇÁ¦ µ¥ÀÌÅͺκÐÀÇ Å©±â
            if ((len = sRecv(&dataSize, INT_SIZE, flags)) <= 0) {                           // µ¥ÀÌÅÍÅ©±â¸¸ ¸ÕÀú Àоî¿Â´Ù
                    return(len);                                                                                                                            // close½ÅÈ£À̰ųª ¿¡·¯¶ó¸é ¸®ÅÏ
            }
            dataSize = ntohl(dataSize);                                                                                             // È£½ºÆ® ¹ÙÀÌÆ® ¿À´õ·Î º¯°æ
            return (sRecv(buff, dataSize, flags));                                                                  // µ¥ÀÌÅÍÅ©±â¸¸Å­ ´Ù½Ã Àоî¿Â´Ù
    }
    
    ssize_t Sock :: sRecvLine(void* buff) {
            char* tmp;                                                                                                                                              // void* ÀÇ ¿¬»êÀ» À§ÇÔ
            size_t total = 0;
            tmp = (char*) buff;
            while (true) {
                    for (; tmpBuf.num > 0;) {                                                                                               // ÀӽùöÆÛ¿¡ ÀÐÀ» µ¥ÀÌÅͰ¡ ÀÖ´Â µ¿¾È¿¡
                            if (tmpBuf.buff[tmpBuf.index] == '\n') {
                                    tmpBuf.num--;                                                                                                   // \n À» ÀоúÀ¸¹Ç·Î º¯¼ö°ª Á¶Á¤
                                    tmpBuf.index++;
                                    return(total);                                                                                                          // buff¿¡ \n Àº Æ÷ÇÔÇÏÁö ¾Ê´Â´Ù
                            }
                            *tmp++ = tmpBuf.buff[tmpBuf.index];
                            total++;
                            tmpBuf.num--;
                            tmpBuf.index++;
                    }
                    if ((tmpBuf.num = sRecv(tmpBuf.buff, tmpBuf.size, 0)) <= 0) {   // ÀӽùöÆÛ°¡ ºñ¾úÀ¸¹Ç·Î bufSize¸¸Å­ ÀоîµéÀÓ
                            return (tmpBuf.num);
                    }
                    tmpBuf.index = 0;
            }
    }
    
    int Sock :: sGetSockOpt(int level, int optname, void* optval, socklen_t* optlen) {
            return(getsockopt(fd, level, optname, optval, optlen));
    }
    
    int Sock :: getFd(void) {
            return(fd);
    }
    
    in_addr_t Sock :: getIP(void) {
            return (addr.sin_addr.s_addr);
    }
    
    

    • asyncSocket.h
     /*
     *  ºñµ¿±â ´ÙÁß ¼ÒÄÏÅë½ÅÀ» ÇÏ´Â ¼ÒÄÏ ÀÎÅÍÆäÀ̽º 
     * 
     *  Copyright (c) KarlLy corp. All rights reserved. Code by SaNha - 2003. 11. 25.
     */
    
    #ifndef _ASYNC_SOCKET_
    #define _ASYNC_SOCKET_
    
    #include <sys/poll.h>
    #include <time.h>
    #include "sock.h"
    
    class ConInfo {                                                                                                         // ¼ÒÄÏ¿¡ ´ëÇÑ »óÅ Á¤º¸ Ŭ·¡½º
            public :
                    int status;                                                                                                             // connectting : 0, using : 1, not using : -1
                    time_t conTime;                                                                                         // connect ÇÒ¶§ÀÇ ½Ã°£ : connect timeoutÀ» ó¸®Çϱâ À§ÇÔ
                    int timeout;                                                                                                            // connect ´ë±âÇÏ´Â ÃÖ´ë½Ã°£
    };
    
    class AsyncSocket {
    
            private :
                    int maxi;                                                                                                               // °ü½ÉÀÖ´Â ¼ÒÄÏÁß ÃÖ´ë À妽º
                    int conNum;                                                                                                     // ¿¬°áµÇ¾î ÀÖ´Â Àüü ¼ÒÄÏ °¹¼ö
                    int maxFd;                                                                                                              // ÃÖ´ë fd°¹¼ö
                    struct pollfd* pFd;                                                                                     // pollfd °´Ã¼ ¹è¿­
                    ConInfo* conSock;                                                                                       // ºñµ¿±â connect ó¸®À§ÇÔ
                    void increaseSock(int i, bool increase);                                // ¼ÒÄÏÀÇ Áõ°¨º¯È­½Ã ¿©·¯ °ü·Ã º¯¼ö°ªÀ» ¼öÁ¤ÇÏ´Â ¸Þ¼Òµå
                    void initValue(int maxNum);                                                             // »ý¼ºÀÚ ½ÇÇà½Ã °øÅëµÇ´Â ÃʱâÈ­
    
            public :
                    AsyncSocket(int maxNum);                                                                // maxNum : ¼ÒÄÏ °¹¼ö
                    AsyncSocket(int maxNum, size_t tmpBuf);                 // tmpBuf : sReadLine »ç¿ë½ÃÀÇ ÀӽùöÆÛ Å©±â
                    Sock* sock;                                                                                                     // ¼ÒÄÏ °´Ã¼ ¹è¿­
                    virtual ~AsyncSocket(void);
                    int aListen(int domain, int type, int protocol, const char* ip, int port, int backlog); // ¼­¹ö¼ÒÄÏ (0¹ø À妽º»ç¿ë)
                    int aConnect(int domain, int type, int protocol, const char* ip, int port, int retry, int t);    // ¼ÒÄÏ À妽º ¸®ÅÏ
                    void aClose(int i);                                                                                     // ¿¬°áµÇ¾î ÀÖ´ø ¼ÒÄÏÀ» ´Ý°í °ü·Ã º¯¼ö°ªÀ» Á¶Á¤ÇÏ´Â ¸Þ¼Òµå
                    int aPoll(int mSec);                                                                                    // fd µéÀÇ ÀÔÃâ·Â »óÅ °¨½Ã
                    int getConNum(void);                                                                            // conNum ¹Ýȯ
                    int getSockStatus(int i);                                                                       // conSock.status ¹Ýȯ
                    virtual void atAccept(int i) = 0;                                                       // accept ¼º°ø½Ã¿¡ ½ÇÇàµÉ °¡»óÇÔ¼ö
                    virtual void atConnect(int i) = 0;                                              // connect ¼º°ø½Ã¿¡ ½ÇÇàµÉ °¡»óÇÔ¼ö
                    virtual void atPollin(int i) = 0;                                                       // ÀÐÀ» µ¥ÀÌÅͰ¡ ÀÖ´Â fd ¸¦ ó¸®ÇÏ´Â ¼ø¼ö°¡»óÇÔ¼ö
                    /* ¼ÒÄÏÀÌ ´ÝÈú¶§¸¦ À§ÇÏ¿© if (read(i) <= 0 ) aClose(i) ¸¦ È£ÃâÇÏ´Â ºÎºÐÀ» ¹Ýµå½Ã ±¸ÇöÇÏ¿©¾ß ÇÑ´Ù */
    
    };
    
    #endif
    
    

    • asyncSocket.cpp
    /*
     *  ºñµ¿±â ´ÙÁß ¼ÒÄÏÅë½ÅÀ» ÇÏ´Â ¼ÒÄÏ ÀÎÅÍÆäÀ̽º
     * 
     *  Copyright (c) KarlLy corp. All rights reserved. Code by SaNha - 2003. 11. 25.
     */
    
    #include <time.h>
    #include <sys/poll.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include "log.h"
    #include "asyncSocket.h"
    
    #include <iostream>
    
    using namespace std;
    
    AsyncSocket :: AsyncSocket(int maxNum) {
            initValue(maxNum);
            sock = new Sock[maxFd];
    }
    
    AsyncSocket :: AsyncSocket(int maxNum, size_t tmpBuf) {
            initValue(maxNum);
            sock = new Sock[maxFd](tmpBuf);                                 // sReadLine »ç¿ë½ÃÀÇ ÀӽùöÆÛ ¸Þ¸ð¸® ÇÒ´ç
    }
    
    AsyncSocket :: ~AsyncSocket(void) {
            delete[] sock;
            delete[] pFd;
            delete[] conSock;
    }
    
    void AsyncSocket :: initValue(int maxNum) {
            int i;
            maxFd = maxNum;
            maxi = -1;                                                                                                              // ¿¬°áµÈ °¹¼ö°¡ ¾Æ´Ï°í À妽ºÀ̹ǷΠ-1
            conNum = 0;                                                                                                     // ¿¬°áµÈ °¹¼ö´Â 0 °³
            pFd = new struct pollfd[maxFd];
            conSock = new ConInfo[maxFd];
            for (i = 0; i < maxFd; i ++) {
                    pFd[i].fd = -1;                                                                                 // pollfd ÀÇ fd ¸¦ -1·Î ÃʱâÈ­
                    conSock[i].status = -1;                                                         // »ç¿ëÁßÀÎ ¼ÒÄÏÀÌ ¾Æ´Ï´Ù
            }
    }
    
    void AsyncSocket :: increaseSock(int i, bool increase) {        // i : sock ÀÇ À妽º, increase : Áõ°¡Àΰ¡ °¨¼ÒÀΰ¡
            if (increase) {                                                                                                 // ¼ÒÄÏÀÌ Áõ°¡ÇÏ¿´´Ù¸é
                    conSock[i].status = 1;                                                                  // »ç¿ëÁßÀÎ ¼ÒÄÏÀ¸·Î Ç¥½Ã
                    conNum++;                                                                                                       // ¿¬°áµÈ ¼ÒÄϼö Áõ°¡
                    if (i > maxi) maxi = i;                                                                 // ÃÖ´ë À妽º °»½Å
                    pFd[i].fd = sock[i].getFd();                                                    // °¨½ÃÇÏ´Â ¼ÒÄÏÀ¸·Î µî·Ï
                    pFd[i].events = POLLIN;
            } else {                                                                                                                        // ¼ÒÄÏÀÌ °¨¼ÒÇÏ¿´´Ù¸é
                    conNum--;                                                                                                       // ¿¬°áµÈ ¼ÒÄϼö °¨¼Ò
                    conSock[i].status = -1;                                                         // »ç¿ëÁßÀÌÁö ¾Ê´Â ¼ÒÄÏÀ¸·Î Ç¥½Ã
                    pFd[i].fd = -1;                                                                                 // °¨½ÃÇØÁ¦
                    if (i == maxi) {                                                                                        // ´ÝÀº¼ÒÄÏÀÇ À妽º°¡ ÃÖ´ëÀ妽º¿´´Ù¸é
                            int r;
                            for (r = maxi - 1; r > -1; r--) {                                       // °Å²Ù·Î °Ë»çÇØ³ª°£´Ù
                                    if (pFd[r].fd < 0) continue;                                    // ¿¬°á¾ÈµÈ ¼ÒÄÏÀ̶ó¸é ´ÙÀ½À¸·Î
                                    break;                                                                                          // ¿¬°áµÇ¾î ÀÖ´Â ÃÖ´ë À妽ºÀ϶§ ·çÇÁ³ª°¨       
                            }
                            maxi = r;                                                                                               // À妽º °»½Å
                    }
            }
    }
    
    int AsyncSocket :: aListen(int domain, int type, int protocol, const char* ip, int port, int backlog) {
            if (sock[0].setSocket(domain, type, protocol) < 0) return (-1);                         // ¼ÒÄÏ »ý¼º
            sock[0].setAddr(ip, port);                                                                                                                                      // ÁÖ¼Ò ÁöÁ¤
            if ((sock[0].sBind() < 0) || (sock[0].sListen(backlog) < 0)) {                          // ¼ÒÄϰú ÁÖ¼Ò¿¬°á ¹× Á¢¼Ó´ë±â ½ÃÀÛ
                    sock[0].sClose();
                    return (-1);
            }
            increaseSock(0, true);
            return (0);
    }
    
    void AsyncSocket :: aClose(int i) {
            sock[i].sClose();
            increaseSock(i, false);
    }
    
    int AsyncSocket :: aConnect(int domain, int type, int protocol, const char* ip, int port, int retry, int t) {
            int i;
            for (i = 1; i < maxFd; i++) {                                                                                                                   // 0 Àº ¼­¹ö¼ÒÄÏ¿¡ »ç¿ë
                    if (pFd[i].fd < 0) {                                                                                                                                    // »ç¿ëÁßÀÌÁö ¾Ê´Â ¼ÒÄÏÀ̸é
                            if (sock[i].setSocket(domain, type, protocol) < 0) return (-1); // ¼ÒÄÏ »ý¼º
                            sock[i].setAddr(ip, port);                                                                                                              // ¿¬°áÇÒ ÁÖ¼Ò ÁöÁ¤
                            switch (sock[i].aConnect(retry)) {
                                    case (0) :                                                                                                                              // connect ÁßÀÌ´Ù
                                            increaseSock(i, true);
                                            pFd[i].events = POLLIN | POLLOUT;
                                            conSock[i].status = 0;                                                                                  // ÀÐÀ» µ¥ÀÌÅÍ ´ë±âÁßÀÎ ¼ÒÄϰú ±¸ºÐÀ§ÇÔ
                                            conSock[i].conTime = time(NULL);                                                // timeout ó¸®À§ÇÔ
                                            conSock[i].timeout = t;
                                            return(i);
                                    case (1) :                                                                                                                              // ÀÌ¹Ì ¿¬°áµÊ
                                            increaseSock(i, true);
                                            return(i);
                                    case (-1) :                                                                                                                     // retry Ƚ¼ö¸¸Å­ ¿¬°á ½ÇÆÐÇÔ
                                            sock[i].sClose();
                                            return(-1);
                            }
                    }
            }
            writeEmerg("Max socket connected");                                                                             // ¼ÒÄÏÀÌ ²Ë Âþ´Ù
            return(-1);
    }
    
    int AsyncSocket :: aPoll(int mSec) {                                                                                    // mSec: À̺¥Æ® ´ë±â½Ã°£
            socklen_t optLen;                                                                                                                               // getsockopt È£ÃâÀ» À§ÇÔ
            int i, rdyNum, retValue, optVal;                                                                                                // rdyNum: À̺¥Æ® ¹ß»ýÇÑ fd °¹¼ö
            rdyNum = poll(pFd, maxi + 1, mSec);
            retValue = rdyNum;                                                                                                                              //      rdyNum ¸®ÅÏÀ§ÇÔ
            if (rdyNum <= 0) return (retValue);                                                                                     // ÀбâÁغñµÈ ¼ÒÄÏÀÌ ¾ø°Å³ª ¿¡·¯¶ó¸é ¸®ÅÏÇÔ
            if (pFd[0].revents & POLLIN) {                                                                                          // ¼­¹ö¼ÒÄÏ¿¡ »õ·Î¿î ¿¬°á¿äûÀÌ µé¾î¿Ô´Ù¸é
                    rdyNum--;                                                                                                                                               // À̺¥Æ® ¹ß»ý°Ç¼ö ÁÙÀÓ
                    for (i = 1; i < maxFd; i++) {
                            if (pFd[i].fd < 0) {                                                                                                            // »ç¿ëÇÏÁö ¾Ê´Â ºó ¼ÒÄÏÀ̶ó¸é
                                    if (sock[i].sAccept(sock[0].getFd()) == 0) {                            // accept°¡ ¼º°øÇß´Ù¸é
                                            increaseSock(i, true);
                                            atAccept(i);                                                                                                            // accept ¼º°ø½Ã¿¡ ½ÇÇàµÉ °¡»óÇÔ¼ö
                                    }
                                    break;
                            }
                    }
                    if (i == maxFd) writeCrit("Max Socket connected !!!");                                  // ¼ÒÄÏÀÌ maxFd ±îÁö ¸ðµÎ »ç¿ëµÇ°í ÀÖÀ½
            }
            if (rdyNum == 0) return(retValue);                                                                                      // ´õÀÌ»ó ó¸®ÇÒ À̺¥Æ® ¼ÒÄÏÀÌ ¾øÀ¸¸é ¸®ÅÏ
            for (i = 1; i <= maxi; i++) {                                                                                                   // °ü½ÉÀÖ´Â ¼ÒÄÏÀÇ ÃÖ´ë À妽º±îÁö
                    if (pFd[i].fd < 0) continue;                                                                                            // °ü½ÉÀÖ´Â ¼ÒÄÏÀÌ ¾Æ´Ï¶ó¸é ´ÙÀ½ À妽º·Î
                    if (conSock[i].status == 0) {                                                                                           // connect ÁßÀÎ ¼ÒÄÏÀ̶ó¸é
                            if (pFd[i].revents & (POLLIN | POLLOUT)) {                                      // ¼º°ø:POLLOUT, ½ÇÆÐ:POLLIN | POLLOUT
                                    rdyNum--;                                                                                                                               // ÃÑ À̺¥Æ® °¹¼ö °¨¼Ò
                                    conSock[i].status = false;                                                                      // ÀÏ´Ü ¿¬°áÁßÀÎ ¼ÒÄÏÀ̶ó´Â Ç¥½Ã´Â ÇØÁ¦ÇÑ´Ù
                                    sock[i].restoreFlags();                                                                                         // ºí·¯Å· ¼ÒÄÏÀ¸·Î ȯ¿ø
                                    sock[i].sGetSockOpt(SOL_SOCKET, SO_ERROR, &optVal, &optLen);
                                    if (optVal) {                                                                                                                   // 0 ÀÌ ¾Æ´Ï¸é connect ¿¡·¯
                                            errno = optVal;
                                            writeError("Socket connection failed");
                                            aClose(i);
                                    } else {                                                                                                                                        // 0 À̹ǷΠconnect ¼º°ø
                                            conSock[i].status = 1;
                                            pFd[i].events = POLLIN;                                                                         // ¿¬°á ¼º°øÀ̶ó¸é ÀϹÝÀûÀÎ ¼ÒÄÏ µ¥ÀÌÅÍ °¨½Ã
                                            atConnect(i);                                                                                                           // connect ¼º°ø½Ã¿¡ ½ÇÇàµÉ °¡»óÇÔ¼ö
                                    }
                                    if (rdyNum == 0) break;
                            } else if ((time(NULL) - conSock[i].conTime) > conSock[i].timeout) {    // connect timeout À̸é
                                    writeError("Socket connection time expired");
                                    aClose(i);
                            }
                    } else if (pFd[i].revents & (POLLIN | POLLERR)) {                               // ÀÐÀ» µ¥ÀÌÅͰ¡ µµÂøÇß´Ù¸é
                            rdyNum--;
                            atPollin(i);                                                                                                                            // ¿¬°áµÈ ¼ÒÄÏ¿¡¼­ POLLIN ½Ã¿¡ ½ÇÇàµÉ °¡»óÇÔ¼ö
                            if (rdyNum == 0) break;
                    }
            }
            return(retValue);
    }
    
    int AsyncSocket :: getConNum(void) {
            return(conNum);
    }
    
    int AsyncSocket :: getSockStatus(int i) {
            return(conSock[i].status);
    }
    
    

    • log.h
    /*
     *  syslogd¸¦ ÀÌ¿ëÇÏ¿© ·¹º§º° ¿¡·¯µéÀ» ·Î±×ó¸®
     * 
     *  Copyright (c) KarlLy corp. All rights reserved. Code by SaNha - 2003. 11.23.
     */
    
    void writeError(char* str);                // ERROR ·¹º§¿¡ Æ÷ÇԵǴ ¿¡·¯µé
    
    void writeCrit(char* str);                // CRIT ·¹º§¿¡ Æ÷ÇԵǴ ¿¡·¯µé - Áß¿äÇÑ ¿¡·¯»çÇ×µé
    
    void writeEmerg(char* str);            // EMERG ·¹º§¿¡ Æ÷ÇԵǴ ¿¡·¯µé - ½Ã½ºÅÛÀ» ÁßÁö½ÃŰ´Â ¿¡·¯»çÇ×µé
    
    void writeNotice(char* str, char* ip);            // ºñÀÎÁõÁ¢¼ÓÀ̳ª, ÇÁ·ÎÅäÄÝ¿¡ À§¹èµÈ µ¥ÀÌÅͰ¡ µé¾î¿Ã¶§ÀÇ ·Î±×
    


    • log.cpp
    /*
     *  syslogd¸¦ ÀÌ¿ëÇÏ¿© ·¹º§º° ¿¡·¯µéÀ» ·Î±×ó¸®
     * 
     *  Copyright (c) KarlLy corp. All rights reserved. Code by SaNha - 2003. 11.23.
     */
    
    #include <stdio.h>
    #include <syslog.h>
    #include <unistd.h>
    #include <errno.h>
    #include <string.h>
    
    void writeError(char *str) {
        char list[100];
        sprintf(list, "%s : %s\n", str, strerror(errno));
        syslog(LOG_ERR | LOG_LOCAL0, list);
    }
    
    void writeCrit(char *str) {
        char list[100];
        sprintf(list, "%s : %s\n", str, strerror(errno));
        syslog(LOG_CRIT | LOG_LOCAL0, list);
        // °ü¸®ÀÚ¿¡°Ô ¹®ÀÚ¸Þ¼¼Áö Àü¼Û
    }
    
    void writeEmerg(char *str) {
        printf("%s\n", str);                // ¿¹Á¦¿¡¼­ ¼ÒÄϰ¹¼ö°¡ ²Ë ÂþÀ»¶§ÀÇ ¸Þ¼¼Áö¸¦ º¸±â À§ÇÏ¿© Àӽ÷Π³Ö¾î³õ¾Ò´Ù
        char list[100];
        sprintf(list, "%s : %s\n", str, strerror(errno));
        syslog(LOG_EMERG | LOG_LOCAL0, list);
        // °ü¸®ÀÚ¿¡°Ô ¹®ÀÚ¸Þ¼¼Áö Àü¼Û
    
    }
    
    void writeNotice(char *str, char *ip) {                                // ip´Â Á¢¼ÓµÈ IP
        char list[100];
        sprintf(list, "%s : %s\n", str, ip);
        syslog(LOG_NOTICE | LOG_LOCAL0, list);
    }
    
    EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.