ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : ºñµ¿±â¼ÒÄϼ¹öŬ·¡½º
![]()
Tweet
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·Î ´ëüÇÏ¿© »ç¿ëÇϸé Å×½ºÆ®Çϱâ ÁÁÀ»°ÍÀÌ´Ù.
/*
* ±âº» ¼ÒÄÏ Å¬·¡½º
*
* 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
/*
* ±âº» ¼ÒÄÏ Å¬·¡½º
*
* 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);
}
/*
* ºñµ¿±â ´ÙÁß ¼ÒÄÏÅë½ÅÀ» ÇÏ´Â ¼ÒÄÏ ÀÎÅÍÆäÀ̽º
*
* 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
/*
* ºñµ¿±â ´ÙÁß ¼ÒÄÏÅë½ÅÀ» ÇÏ´Â ¼ÒÄÏ ÀÎÅÍÆäÀ̽º
*
* 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);
}
/* * 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); // ºñÀÎÁõÁ¢¼ÓÀ̳ª, ÇÁ·ÎÅäÄÝ¿¡ À§¹èµÈ µ¥ÀÌÅͰ¡ µé¾î¿Ã¶§ÀÇ ·Î±×
/*
* 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À» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|