제 소스의 문제점 지적 부탁드립니다.
글쓴이: 살자 / 작성시간: 화, 2006/10/31 - 4:53오후
안녕하세요.
저의 소스에 문제점 지적 부탁드립니다.
udp로 받은 packet을 local에 있는 다른 곳으로 바로 보내는 프로그램 입니다.
너무 허접한데 어떻문제가 발생될수 있는지 알고싶어서 입니다.
고수님들의 많은 조언 부탁드립니다. 미리 감사 드립니다. ^^
///-->> udp.cpp
4 CUDP::CUDP() 5 { 6 memset(m_szServerAddr, 0, sizeof(m_szServerAddr)); 7 m_iServerPort = 0; 8 m_iSock = socket(AF_INET, SOCK_DGRAM, 0); 9 if(m_iSock == SOCKET_ERROR) 10 TRACELOG(LOG_ERR, "SOCKET ERROR"); 11 } 12 13 CUDP::~CUDP() 14 { 15 if(m_iSock == INVALID_SOCKET) 16 return; 17 close(m_iSock); 18 } 19 20 bool CUDP::fnStart(int _iPort, char*_lpAddr/*=""*/) 21 { 22 int opt; 23 int iLen; 24 int iStat; 25 char* pszLog; 26 struct sockaddr_in sin; 27 28 /////////////////////////////////////////////////////////////////////////////// 29 //{강제 바인딩을 하기 위하여 사용한다. 30 opt = 1; 31 setsockopt(m_iSock, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof(opt)); 32 //}강제 바인딩을 하기 위하여 사용한다. 33 /////////////////////////////////////////////////////////////////////////////// 34 35 iLen = sizeof(sin); 36 memset(&sin, 0, sizeof(sin)); 37 sin.sin_family = AF_INET; 38 if(strlen(_lpAddr) > 0) 39 sin.sin_addr.s_addr = inet_addr(_lpAddr); 40 else 41 sin.sin_addr.s_addr = htonl(INADDR_ANY); 42 sin.sin_port = htons(_iPort); 43 44 iStat = bind(m_iSock, (struct sockaddr*) &sin, iLen); 45 if(iStat == SOCKET_ERROR) 46 { 47 pszLog = fnGetBuf("BIND ERROR SOCKET : %d PORT : %d", m_iSock, _iPort); 48 TRACELOG(LOG_TRACE, pszLog); 49 } 50 else 51 { 52 strcpy(m_szServerAddr, _lpAddr); 53 m_iServerPort = _iPort; 54 55 pszLog = fnGetBuf("BIND SUCCESS SOCKET : %d PORT : %d", m_iSock, _iPort); 56 TRACELOG(LOG_TRACE, pszLog); 57 return true; 58 } 59 return false; 60 } 61 62 63 bool CUDP::fnSendTo(char *_lpAddr, int _iPort, char *_lpData, int _iLen) 64 { 65 int iLen; 66 int iRet; 67 struct sockaddr_in sin; 68 69 iLen = sizeof(sin); 70 sin.sin_family = AF_INET; 71 sin.sin_addr.s_addr = inet_addr(_lpAddr); 72 sin.sin_port = htons(_iPort); 73 iRet = sendto(m_iSock, _lpData, _iLen, 0, (struct sockaddr *)&sin, iLen); 74 75 if( iRet != SOCKET_ERROR) 76 return true; 77 78 return false; 79 } 80 81 bool CUDP::fnRcvFrom(char *_lpAddr, int *_piPort, char *_lpData, int _iLen) 82 { 83 int iLen; 84 int iRet; 85 struct sockaddr_in sin; 86 87 iLen = sizeof(sin); 88 iRet = recvfrom(m_iSock, _lpData, _iLen, 0, (struct sockaddr*) &sin, (socklen_t*) &iLen); 89 90 strcpy(_lpAddr, inet_ntoa(sin.sin_addr)); 91 *_piPort = ntohs(sin.sin_port); 92 93 if(iRet != SOCKET_ERROR) 94 return true; 95 96 if(errno == 0) 97 return true; 98 return false; 99 } 100
//-->> threadproc.cpp
1 void* CThreadProc::fnOnRecvSMSStatus(void* _pArg) 2 { 3 4 CUDP RecvUDP; 5 CUDP SendUDP; 6 7 int iRet; 8 int iServPort; 9 10 char szServIP[SM_STR_SIZE]; 11 char szRecvbuf[MD_STR_SIZE]; 12 13 fd_set readable; 14 TIMEVAL timeout; 15 16 memset(szServIP, 0x00, sizeof(szServIP)); 17 memset(szRecvbuf, 0x00, sizeof(szRecvbuf)); 18 19 RecvUDP.fnStart(9821, ""); 20 21 while(true) 22 { 23 FD_ZERO(&readable); 24 FD_SET(RecvUDP.m_iSock, &readable); 25 26 timeout.tv_sec = 0; 27 timeout.tv_usec = 100 * 1000; 28 29 iRet = select(RecvUDP.m_iSock + 1, &readable, 0, 0, &timeout); 30 if (iRet <= 0) 31 continue; 32 33 if (!RecvUDP.fnRcvFrom(szServIP, &iServPort, szRecvbuf, sizeof(szRecvbuf))) 34 { 35 printf("[fnOnRecvSMSStatus] RecvUDP.fnRcvFrom ERROR!!\n"); 36 continue; 37 } 38 39 SendUDP.fnSendTo("127.0.0.1", 9820, szRecvbuf, strlen(szRecvbuf) + 1); 40 41 printf("[fnOnRecvSMSStatus] Recv Message : %s\n", szRecvbuf); 42 } 43 44 return NULL; 45 }
Forums:
댓글 달기