pro * c로 작업했는데 연결이 잘 되다가 갑자기 연결이 끊깁니다
글쓴이: baby27 / 작성시간: 토, 2004/08/28 - 10:48오전
/* Result Sets Interface */
#ifndef SQL_CRSR
# define SQL_CRSR
struct sql_cursor
{
unsigned int curocn;
void *ptr1;
void *ptr2;
unsigned long magic;
};
typedef struct sql_cursor sql_cursor;
typedef struct sql_cursor SQL_CURSOR;
#endif /* SQL_CRSR */
/* Thread Safety */
typedef void * sql_context;
typedef void * SQL_CONTEXT;
/* Object support */
struct sqltvn
{
unsigned char *tvnvsn;
unsigned short tvnvsnl;
unsigned char *tvnnm;
unsigned short tvnnml;
unsigned char *tvnsnm;
unsigned short tvnsnml;
};
typedef struct sqltvn sqltvn;
struct sqladts
{
unsigned int adtvsn;
unsigned short adtmode;
unsigned short adtnum;
sqltvn adttvn[1];
};
typedef struct sqladts sqladts;
static struct sqladts sqladt = {
1,1,0,
};
/* Binding to PL/SQL Records */
struct sqltdss
{
unsigned int tdsvsn;
unsigned short tdsnum;
unsigned char *tdsval[1];
};
typedef struct sqltdss sqltdss;
static struct sqltdss sqltds =
{
1,
0,
};
/* File name & Package Name */
struct sqlcxp
{
unsigned short fillen;
char filnam[13];
};
static const struct sqlcxp sqlfpn =
{
12,
"ezSMSVer2.pc"
};
static unsigned long sqlctx = 316139;
static struct sqlexd {
unsigned int sqlvsn;
unsigned int arrsiz;
unsigned int iters;
unsigned int offset;
unsigned short selerr;
unsigned short sqlety;
unsigned int occurs;
const short *cud;
unsigned char *sqlest;
const char *stmt;
sqladts *sqladtp;
sqltdss *sqltdsp;
void **sqphsv;
unsigned int *sqphsl;
int *sqphss;
void **sqpind;
int *sqpins;
unsigned int *sqparm;
unsigned int **sqparc;
unsigned short *sqpadto;
unsigned short *sqptdso;
void *sqhstv[4];
unsigned int sqhstl[4];
int sqhsts[4];
void *sqindv[4];
int sqinds[4];
unsigned int sqharm[4];
unsigned int *sqharc[4];
unsigned short sqadto[4];
unsigned short sqtdso[4];
} sqlstm = {10,4};
// Prototypes
extern "C" {
void sqlcxt (void **, unsigned long *,
struct sqlexd *, const struct sqlcxp *);
void sqlcx2t(void **, unsigned long *,
struct sqlexd *, const struct sqlcxp *);
void sqlbuft(void **, char *);
void sqlgs2t(void **, char *);
void sqlorat(void **, unsigned long *, void *);
}
// Forms Interface
static const int IAPSUCC = 0;
static const int IAPFAIL = 1403;
static const int IAPFTL = 535;
extern "C" { void sqliem(char *, int *); }
typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR;
typedef struct { unsigned short len; unsigned char arr[1]; } varchar;
/* cud (compilation unit data) array */
static const short sqlcud0[] =
{10,4138,0,0,0,
5,0,0,0,0,0,60,75,0,0,0,0,0,1,0,
20,0,0,0,0,0,58,206,0,0,1,1,0,1,0,3,109,0,0,
39,0,0,0,0,0,59,242,0,0,1,1,0,1,0,3,109,0,0,
58,0,0,1,0,0,27,328,0,0,4,4,0,1,0,1,97,0,0,1,97,0,0,1,97,0,0,1,10,0,0,
89,0,0,2,0,0,32,339,0,0,0,0,0,1,0,
104,0,0,3,0,0,32,349,0,0,0,0,0,1,0,
};
#include <sys/stat.h>
#include <time.h>
#include <sys/socket.h>
#include <sys/file.h>
#include <signal.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <errno.h>
#include <string>
#include <map>
#include <sqlca.h>
#include "ezSMSVer2.h"
#include "SPMLParser.h"
#include "MessageBuffer.h"
#include "ConfigINI.h"
#include "setting.h"
#include "OracleHelpper.h"
#include "UserProcessing.h"
#include "SendProcessing.h"
#include "LogListProcessing.h"
#include "LogDetailProcessing.h"
#include "EmoticonProcessing.h"
#include "AddressProcessing.h"
#define OPTION_FILE "../config/SMS.conf"
// ------------------------------
// 전역 자료들
// ------------------------------
map<int, clndata> clnmondata; //사용자 정보맵
int server_sockfd = -1, one = 1;
// 쓰레드 전역 함수들
void *thread_comm(void *);
void *server_mon(void *);
pthread_mutex_t user_lock = PTHREAD_MUTEX_INITIALIZER;
// 일반 전역 함수들
stringex processSPML(int thread_id, char *pBuffer, sql_context &ctx);
int user_showCount(void);
void user_showList(void);
void user_disconnect(int thread_id);
// 종료 처리 함수
void OnExit(int signo);
void OnHUP(int signo);
// 스레드에 넘겨줄 클라이언트 데이터 구조
typedef struct connectinfo
{
int client_sockfd;
sockaddr_in clientaddr;
} cninfo;
LogOutput Log(FILE_LOGACCESS, LO_FILE | LO_SCREEN);
LogOutput LogError(FILE_LOGERROR, LO_FILE | LO_SCREEN);
LogOutput LogSPML(FILE_LOGSPML, LO_FILE);
int main(int argc, char **argv)
{
/* EXEC SQL ENABLE THREADS; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 0;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.stmt = "";
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )5;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}
/*
ConfigINI option(OPTION_FILE);
option.FileWarpper();
stringex database;
stringex userid;
stringex passwd;
option.GetConfig("DBUSERID",userid);
option.GetConfig("DBPASSWORD",passwd);
option.GetConfig("DATABASE",database);
strcpy(strConnect.userid,(char *)userid.c_str());
strcpy(strConnect.passwd,(char *)passwd.c_str());
strcpy(strConnect.database,(char *)database.c_str());
option.GetConfig("ACCESS_LOG",Access_log);
option.GetConfig("ERROR_LOG",Error_log);
Log.Setting(Access_log);
LogError.Setting(Error_log);
*/
if(argv[1] == NULL)
{
LogError.Put("실행법: ./ezSMS [port Number]");
exit(0);
}
pthread_t p_thread;
struct sockaddr_in clientaddr, serveraddr;
int client_len;
//시그널 설정
/*
struct sigaction sig_exit,sig_hup;
sig_exit.sa_handler=OnExit;
sigemptyset(&sig_exit.sa_mask);
sig_exit.sa_flags=0;
sig_hup.sa_handler=OnHUP;
sigemptyset(&sig_hup.sa_mask);
sig_hup.sa_flags = 0;
*/
if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
cout <<"소켓 이용중 "<<endl;
exit(0);
}
bzero(&serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
serveraddr.sin_port = htons(atoi(argv[1]));
if ( setsockopt (server_sockfd, SOL_SOCKET, SO_REUSEADDR, (char *) &one, sizeof (one)) == -1 )
{
perror("setsockopt: SO_REUSEADDR");
exit(1);
}
if (bind(server_sockfd, (struct sockaddr *)&serveraddr,
sizeof(serveraddr)) == -1)
{
cout << "소켓을 바인드하지 못했습니다." <<endl;
exit(0);
}
if (listen(server_sockfd, 5) == -1)
{
cout << "소켓을 읽을 수 없습니다." <<endl;
exit(0);
}
//시그널 새 설정
/*
sigaction(SIGINT, &sig_exit, 0); //시그널 등록
sigaction(SIGHUP, &sig_hup, 0);
Log.Put("ezSMS 서버를 시작합니다...");
*/
signal(SIGINT, OnExit);
signal(SIGHUP, OnHUP);
Log.Put("ezSMS 서버를 시작합니다...");
int i=0;
while(1)
{
cninfo* pci = new cninfo;
client_len = sizeof(clientaddr);
(*pci).client_sockfd = accept(server_sockfd, (struct sockaddr *)&(*pci).clientaddr, (socklen_t *)&client_len);
// 쓰레드 생성
if (pthread_create(&p_thread, NULL, thread_comm, (void *)pci) == -1)
{
delete pci;
cout << "클라이언트 접속을 생성하지 못했습니다." <<endl;
exit(0);
}
else
{
cout <<"클라이언트가 접속 했습니다. 현재 사용자 %d 명" <<endl;
}
usleep(100);
}
}
void *thread_comm(void *data)
{
LogOutput Log(FILE_LOGACCESS, LO_FILE | LO_SCREEN);
LogOutput LogError(FILE_LOGERROR, LO_FILE | LO_SCREEN);
LogOutput LogSPML(FILE_LOGSPML, LO_FILE);
int sockfd, thread_id = pthread_self();
clndata clientinfo, testclient;
/* EXEC SQL BEGIN DECLARE SECTION; */
sql_context ctx;
/* EXEC SQL END DECLARE SECTION; */
/* EXEC SQL CONTEXT ALLOCATE :ctx; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 1;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.stmt = "";
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )20;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)&ctx;
sqlstm.sqhstl[0] = (unsigned int )sizeof(void *);
sqlstm.sqhsts[0] = ( int )0;
sqlstm.sqindv[0] = ( void *)0;
sqlstm.sqinds[0] = ( int )0;
sqlstm.sqharm[0] = (unsigned int )0;
sqlstm.sqadto[0] = (unsigned short )0;
sqlstm.sqtdso[0] = (unsigned short )0;
sqlstm.sqphsv = sqlstm.sqhstv;
sqlstm.sqphsl = sqlstm.sqhstl;
sqlstm.sqphss = sqlstm.sqhsts;
sqlstm.sqpind = sqlstm.sqindv;
sqlstm.sqpins = sqlstm.sqinds;
sqlstm.sqparm = sqlstm.sqharm;
sqlstm.sqparc = sqlstm.sqharc;
sqlstm.sqpadto = sqlstm.sqadto;
sqlstm.sqptdso = sqlstm.sqtdso;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}
struct sockaddr_in clientaddr;
pthread_detach(thread_id);
cninfo* pci = (cninfo*) data;
sockfd = (*pci).client_sockfd;
clientaddr = (*pci).clientaddr;
delete (cninfo*)data;
clientinfo.addr = clientaddr.sin_addr.s_addr;
clientinfo.port = ntohs(clientaddr.sin_port);
clientinfo.sockfd = sockfd;
time((time_t *)&clientinfo.timeStart);
time((time_t *)&clientinfo.timeLive);
clientinfo.countAction = 0;
clientinfo.countSend = 0;
pthread_mutex_lock(&user_lock);
clnmondata.insert(pair<int, clndata>(thread_id, clientinfo));
pthread_mutex_unlock(&user_lock);
CMessageBuffer mBuffer;
while(1)
{
char *buf = new char[1024];
int packet_len;
stringex rtnData;
if ((packet_len = read(sockfd, buf, 1024)) <= 0)
{
/* EXEC SQL CONTEXT FREE :ctx; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 1;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.stmt = "";
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )39;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)&ctx;
sqlstm.sqhstl[0] = (unsigned int )sizeof(void *);
sqlstm.sqhsts[0] = ( int )0;
sqlstm.sqindv[0] = ( void *)0;
sqlstm.sqinds[0] = ( int )0;
sqlstm.sqharm[0] = (unsigned int )0;
sqlstm.sqadto[0] = (unsigned short )0;
sqlstm.sqtdso[0] = (unsigned short )0;
sqlstm.sqphsv = sqlstm.sqhstv;
sqlstm.sqphsl = sqlstm.sqhstl;
sqlstm.sqphss = sqlstm.sqhsts;
sqlstm.sqpind = sqlstm.sqindv;
sqlstm.sqpins = sqlstm.sqinds;
sqlstm.sqparm = sqlstm.sqharm;
sqlstm.sqparc = sqlstm.sqharc;
sqlstm.sqpadto = sqlstm.sqadto;
sqlstm.sqptdso = sqlstm.sqtdso;
sqlcxt((void **)0, &sqlctx, &sqlstm, &sqlfpn);
}
cout <<"메모리 해제 시킴"<<endl;
user_disconnect(thread_id);
return NULL;
}
mBuffer.AddData(buf, packet_len);
delete []buf;
int mBuffer_len = mBuffer.GetFrontDataSize();
while (mBuffer_len > 0)
{
char *pBuffer = new char[mBuffer_len+1];
mBuffer.PopFrontDataSet(pBuffer, mBuffer_len);
pBuffer[mBuffer_len] = '\0';
// 디버그용 SPML 로그
LogSPML.Put(clientinfo, "", pBuffer);
//--> 꼭 지워야함
rtnData = processSPML(thread_id, pBuffer,ctx);
delete []pBuffer;
mBuffer.SendStringToSocket(rtnData, write, sockfd, COMPRESS);
mBuffer_len = mBuffer.GetFrontDataSize();
}
// 디버그용 출력 SPML 로깅...
LogSPML.Put(clientinfo, "", rtnData);
//--> 꼭 지워야함
}
}
stringex processSPML(int thread_id, char *pBuffer,sql_context &ctx)
{
LogOutput Log(FILE_LOGACCESS, LO_FILE | LO_SCREEN);
LogOutput LogError(FILE_LOGERROR, LO_FILE | LO_SCREEN);
LogOutput LogSPML(FILE_LOGSPML, LO_FILE);
CSPMLParser inMultiSPML, outSPML; // 입력 파서, 출력 파서
OracleHelpper oDb;
CServerPacketBundle bundleAction;
pthread_mutex_lock(&user_lock);
clndata user = clnmondata[thread_id];
pthread_mutex_unlock(&user_lock);
pthread_mutex_lock(&user_lock);
/* EXEC SQL CONTEXT USE :ctx; */
pthread_mutex_unlock(&user_lock);
/* EXEC SQL BEGIN DECLARE SECTION; */
struct sqlca sqlca;
char userid[7];
char pass[8];
char dbname[5];
/* EXEC SQL END DECLARE SECTION; */
/* EXEC SQL whenever sqlerror continue; */
memset(userid, 0x00, sizeof(userid));
memset(pass, 0x00, sizeof(pass));
memset(dbname, 0x00, sizeof(dbname));
strcpy(userid, "SYSTEM");
strcpy(pass, "MANAGER");
strcpy(dbname, "TEST");
/* EXEC SQL CONNECT :userid IDENTIFIED BY :pass USING :dbname; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )10;
sqlstm.offset = (unsigned int )58;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlstm.sqhstv[0] = ( void *)userid;
sqlstm.sqhstl[0] = (unsigned int )7;
sqlstm.sqhsts[0] = ( int )7;
sqlstm.sqindv[0] = ( void *)0;
sqlstm.sqinds[0] = ( int )0;
sqlstm.sqharm[0] = (unsigned int )0;
sqlstm.sqadto[0] = (unsigned short )0;
sqlstm.sqtdso[0] = (unsigned short )0;
sqlstm.sqhstv[1] = ( void *)pass;
sqlstm.sqhstl[1] = (unsigned int )8;
sqlstm.sqhsts[1] = ( int )8;
sqlstm.sqindv[1] = ( void *)0;
sqlstm.sqinds[1] = ( int )0;
sqlstm.sqharm[1] = (unsigned int )0;
sqlstm.sqadto[1] = (unsigned short )0;
sqlstm.sqtdso[1] = (unsigned short )0;
sqlstm.sqhstv[2] = ( void *)dbname;
sqlstm.sqhstl[2] = (unsigned int )5;
sqlstm.sqhsts[2] = ( int )5;
sqlstm.sqindv[2] = ( void *)0;
sqlstm.sqinds[2] = ( int )0;
sqlstm.sqharm[2] = (unsigned int )0;
sqlstm.sqadto[2] = (unsigned short )0;
sqlstm.sqtdso[2] = (unsigned short )0;
sqlstm.sqphsv = sqlstm.sqhstv;
sqlstm.sqphsl = sqlstm.sqhstl;
sqlstm.sqphss = sqlstm.sqhsts;
sqlstm.sqpind = sqlstm.sqindv;
sqlstm.sqpins = sqlstm.sqinds;
sqlstm.sqparm = sqlstm.sqharm;
sqlstm.sqparc = sqlstm.sqharc;
sqlstm.sqpadto = sqlstm.sqadto;
sqlstm.sqptdso = sqlstm.sqtdso;
sqlcxt(&ctx, &sqlctx, &sqlstm, &sqlfpn);
}
if( sqlca.sqlcode != 0)
{
// EXEC SQL WHENEVER SQLERROR CONTINUE;
cout << "DB StrConnect Not....."<<endl;
cout << sqlca.sqlcode <<endl;
cout <<sqlca.sqlerrm.sqlerrmc <<endl;
/* EXEC SQL ROLLBACK WORK RELEASE; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )89;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlcxt(&ctx, &sqlctx, &sqlstm, &sqlfpn);
}
cout <<"연결 실패"<<endl;
}
else
{
cout << "연결 했음"<<endl;
}
/* EXEC SQL ROLLBACK WORK RELEASE; */
{
struct sqlexd sqlstm;
sqlstm.sqlvsn = 10;
sqlstm.arrsiz = 4;
sqlstm.sqladtp = &sqladt;
sqlstm.sqltdsp = &sqltds;
sqlstm.iters = (unsigned int )1;
sqlstm.offset = (unsigned int )104;
sqlstm.cud = sqlcud0;
sqlstm.sqlest = (unsigned char *)&sqlca;
sqlstm.sqlety = (unsigned short)256;
sqlstm.occurs = (unsigned int )0;
sqlcxt(&ctx, &sqlctx, &sqlstm, &sqlfpn);
}
// 사용자 사용 횟수 및 사용 시간을 갱신
pthread_mutex_lock(&user_lock);
user.countAction++;
time((time_t *) &user.timeLive);
clnmondata[thread_id] = user;
pthread_mutex_unlock(&user_lock);
return outSPML.GetXML();
}
void user_disconnect(int thread_id)
{
pthread_mutex_lock(&user_lock);
clndata user = clnmondata[thread_id];
clnmondata.erase(thread_id);
pthread_mutex_unlock(&user_lock);
shutdown(user.sockfd, SHUT_RDWR);
close(user.sockfd);
stringex LogMessage;
cout << "접속을 종료합니다. 현재 사용자 %d 명" <<endl;
pthread_exit((void *)NULL);
}
정말로 황당하군요.....
연결이 잘되다가 갑자기 연결이 끊겨 버리는.....
^^;
컴파일 할때 thread 옵션도 주고 그랬는데..
꼭 좀 도와주셨으면 합니다...
P.S : 이곳에 검색해도 Pro * C에대한 글은 별로 없더군요..ㅠ.ㅜ
[/code]
Forums:


댓글 달기