pro * c로 작업했는데 연결이 잘 되다가 갑자기 연결이 끊깁니다

baby27의 이미지


/* 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]

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.