서버에서 사용하는 패킷 구조


 전체 4096 Bytes

전체 패킷 길이

4 Bytes

고유번호(패킷복사, 해킹방지)

4 Bytes

프로토콜

4 Bytes

데이터

4084 Bytes 

 

 암호화



1. 전체 패킷 길이

 1개의 패킷이 어디까지 인지 알려준다.


2. 고유번호

 클라에서 패킷을 보낼 때 마다 하나씩 증가시키는 것이 원칙이고, 서버에서는 순차적으로 패킷이 왔는데, 만약 증가되지 않으면 복사 패킷으로 인지해서 그 패킷은 무시하게 된다.


3. 프로토콜

 패킷의 용도를 담는 곳으로, 캐릭터가 이동한다던지, 공격한다던지 정해진 규칙에 따라서 패킷 내용을 채운다.


4. 데이터

 프로토콜에서 정한 규칙에 따른 데이터들을 나열해 놓은 것으로, 캐릭터 이동이라면 X, Y 좌표 값이고, 공격이라면 특정 몬스터 인덱스 값, 사용되는 스킬 번호등 이러한 정보들이 담기게 된다.



대략의 코드 구조

// LENGTH(4) | PACKET_NUMBER(4) | PROTOCOL(4) | DATA (4084)

// 패킷의 전체 길이 계산

// 패킷 전체 길이 = 패킷 길이 + 패킷 고유 번호 + 프로토콜 + 데이터 길이

WORD PacketLength = sizeof(PacketLength)/*LENGTH*/ + 

sizeof(DWORD)/*PACKETNUMBER*/ + 

sizeof(DWORD)/*PROTOCOL*/ + 

(WORD)packetLength;


// 패킷 길이가 최대 버퍼 길이보다 길면 실패함

if (PacketLength >= MAX_BUFFER_LENGTH)

return FALSE;


// 고유번호를 하나 증가시킵니다.

mCurrentPacketNumber++;


// 들어온 데이터를 이용해서 패킷을 만들기 위한 버퍼

BYTE TempBuffer[MAX_BUFFER_LENGTH] = {0,};

// 패킷을 만듭니다.

// 패킷에 인덱스를 붙여 순서 보정을 해 주어야 한다.

// [=>패킷전체길이][고유번호][프로토콜][데이터]

memcpy(TempBuffer, &PacketLength, sizeof(PacketLength));

// [패킷전체길이][=>고유번호][프로토콜][데이터]

memcpy(TempBuffer + 

sizeof(WORD)/*LENGTH*/, 

&mCurrentPacketNumber, sizeof(DWORD));

// [패킷전체길이][고유번호][=>프로토콜][데이터]

memcpy(TempBuffer + 

sizeof(WORD)/*LENGTH*/ + 

sizeof(DWORD)/*PACKETNUMBER*/, 

&protocol, sizeof(DWORD));


// [패킷전체길이][고유번호][프로토콜][=>데이터]

memcpy(TempBuffer + 

sizeof(WORD)/*LENGTH*/ + 

sizeof(DWORD)/*PACKETNUMBER*/ +

sizeof(DWORD)/*PROTOCOL*/,

packet, packetLength);


// 보내는 데이터를 Encrypt 함수를 이용해서 암호화합니다.

CCrypt::Encrypt(TempBuffer + sizeof(DWORD), TempBuffer + sizeof(DWORD), PacketLength - sizeof(DWORD));






클라이언트와 논의 후 바뀐 패킷 구조


 전체 4096 Bytes

전체 패킷 길이

2 Bytes

고유번호(패킷복사, 해킹방지)

4 Bytes

프로토콜

4 Bytes

데이터

4086 Bytes 

 


 

  암호화




<MYSQL에서 테이블 존재 여부 확인>

<방법1>
SELECT TABLE_NAME
FROM   INFORMATION_SCHEMA.TABLES 
WHERE  TABLE_SCHEMA = 'DBNAME' 
AND TABLE_NAME LIKE 'TEST%';


<방법2>
SHOW TABLES LIKE 'TEST%';

 

데이터베이스 조회

show databases;

/********************************************************************************************************
1. 테이블 하나 만들고, 외래키로 연결

- 행을 로우(row)또는 레코드(record), 열을 컬럼(column) 또는 필드(field)로 부른다.
- IDENTITY 는 BuyTbl 테이블의 Number의 컬럼 값을 1부터 시작해서 1씩 증가하면서 값을 채우라는 명령이다.
- FOREIGN KEY REFERENCES UserTbl(UserID)
  -> 기준 테이블(UserTbl)의 UserID 와 외래 키 테이블(BuyTbl) 의 UserID를 외래키로 연결한다.
*********************************************************************************************************/
USE master;
DROP DATABASE tableDB;
CREATE DATABASE tableDB;

DROP TABLE BuyTbl
DROP TABLE UserTbl

CREATE TABLE UserTbl
(
UserID nchar(64) PRIMARY KEY,-- 회원ID
Name nchar(32) NOT NULL,-- 회원이름
Addr nchar(64) NULL,-- 회원주소
)

CREATE TABLE BuyTbl
(
Number int IDENTITY (1,1) PRIMARY KEY,-- 번호
UserID nchar(64) FOREIGN KEY REFERENCES UserTbl(UserID),-- UserTbl의 회원 ID
ProductName nchar(64),-- 상품명
Price nchar(64),-- 가격
)

INSERT INTO UserTbl VALUES('SHS', '손호성', '대구')
INSERT INTO UserTbl VALUES('LMB', '이명박', '서울')
SELECT * FROM UserTbl

INSERT INTO BuyTbl VALUES('SHS', '키보드', 19800)
INSERT INTO BuyTbl VALUES('SHS', '마우스', 9900)
SELECT * FROM BuyTbl

/********************************************************************************************************
2. 제약 조건 이름 붙여주기

- CONSTRAINT를 붙여주면 UserID의 제약 조건 이름이 'PK_UserID'로 설정 된다.
*********************************************************************************************************/
DROP TABLE BuyTbl
DROP TABLE UserTbl
CREATE TABLE UserTbl
(
UserID nchar(64) CONSTRAINT PK_UserID PRIMARY KEY,-- 회원ID
Name nchar(32) NOT NULL,-- 회원이름
Addr nchar(64) NULL,-- 회원주소
)
EXEC sp_help UserTbl


/********************************************************************************************************
3. 2개의 컬럼을 하나의 기본키로 사용
*********************************************************************************************************/
DROP TABLE UserTbl
CREATE TABLE UserTbl
(
UserID nchar(64) NOT NULL,-- 회원ID
Name nchar(32) NOT NULL,-- 회원이름
Addr nchar(64) NULL,-- 회원주소
CONSTRAINT PK_UserID_Name PRIMARY KEY (UserID,Name)
)
EXEC sp_help UserTbl


/********************************************************************************************************
4. UNIQUE 제약 조건
*********************************************************************************************************/
DROP TABLE UserTbl
CREATE TABLE UserTbl
(
UserID nchar(64) CONSTRAINT PK_UserID PRIMARY KEY,-- 회원ID
Name nchar(32) NOT NULL,-- 회원이름
Addr nchar(64) NULL UNIQUE,-- 회원주소
)
EXEC sp_help UserTbl


/********************************************************************************************************
5. CHECK 제약 조건
*********************************************************************************************************/
DROP TABLE Oldtbl
CREATE TABLE Oldtbl
(
Old int CHECK( 0 < Old )
)
INSERT INTO Oldtbl VALUES(-1) -- 실패

/********************************************************************************************************
6. DEFAULT
*********************************************************************************************************/
DROP TABLE Oldtbl
CREATE TABLE Oldtbl
(
Old int DEFAULT(100)
)
INSERT INTO Oldtbl VALUES(default)
SELECT * FROM Oldtbl

/********************************************************************************************************
7. 테이블 수정 - 열 추가
*********************************************************************************************************/
DROP TABLE Oldtbl
CREATE TABLE Oldtbl
(
Old int DEFAULT(100)
)

ALTER TABLE Oldtbl
ADD Name nchar(32)
DEFAULT '무무무'
NULL

INSERT INTO Oldtbl VALUES(100, default)

SELECT * FROM Oldtbl


/********************************************************************************************************
8. 테이블 수정 - 열의 데이터 형식 변경
*********************************************************************************************************/
DROP TABLE Oldtbl
CREATE TABLE Oldtbl
(
Old int
)

ALTER TABLE Oldtbl
ALTER COLUMN Old nchar(32) NULL

EXEC sp_help Oldtbl

1. Database Schema Name
1.1. 
규칙
    - Database Profile 
이름을 의미함
    - DB Alias 
이름과 동일하게 함
    - 
영문 대문자로 작성함
    - Database Short Name
의 길이는 최대 8자리를 넘을 수 없음
    - Database Short Name
은 각 Site Unique Name을 사용함
1.2. 
표기 방식
      
) TOURDB, ETKP, TKS

 

2. Table Name
2.1. 
규칙
    - 
테이블임을 표시하기 위해 테이블 명 뒤에 ‘_TB’ 라는 구분을 사용함
    - 
테이블명은 대문자로 사용함
    - 
시스템 구분 코드와 모듈구분코드로 업무 영역을 구분함
    - 
의미있는 테이블명은 3단어까지 사용할 수 있음
    - 
단어와 단어 사이는 ‘_’로 구성함
    - 
각 단어는 최대 8자리까지 사용함
    - 
구분명은 Table의 특성을 나타냄
    - 
예로는 Master, Detail, Control, Summary, Trigger, History 등이 있음
2.2. 
표기 방식
    <
시스템 구분> + _ + <의미있는 테이블명> + _ + TB
    
사용자 테이블 : ACT_USERS_TB

 

3. Column Name
3.1. 
규칙
    - 
물리명은 영문 대문자를 이용함논리명을 사용자가 알 수 있는 정도에서 명사 및 명사형동사를 사용함
    - Column
에 대한 자리수는 총 12자리로 하며제한은 없음
      
사용하는 Database의 특성에 따라 제한될 수 있음
    - Word
 Word 사이에는 ‘_’로 구분함
    - 
 Word 8자리를 넘을 수 없음
    - 
모든 Column Dictionary List에 등록된 약어사전 및 자료사전을 기초로 작성함
    - Dictionary List
에 등록되지 않은 약어는 책임자의 동의 하에 등록함
    - Column Name
은 약어의 조합으로 구성
    - 
컬럼명에 컬럼을 대표하는 접미사를 사용하여 컬럼명의 성격을 나타냄.
3.2. 
표기방식

    <
의미있는 컬럼명혹은 <의미있는 컬럼명> + _ + 접미사
    
종종 자주 사용하는 접미사는 다음과 같다.

 

접미사 

내용

설명

_CD

CODE

주로 코드 테이블의 코드각종 코드에 사용된다.
숫자나 문자로 이루어진 코드에 해당되며숫자나 문자의 각 부분이 의미가 있는 경우에 코드를 사용한다대부분 PK에 해당한다
.
대분류 코드
 CTGRY_CD,
     
시도코드
 SIDO_CD,
     
사용자 그룹 코드 USER_GROUP_CD 

_NM

NAME

코드에 대한 명칭에 주로 사용된다논리명이 이름명칭인 경우에 해당된다.
사용자이름
 USER_NM,
     
자원명
 RES_NM,
     
중분류 코드명
 DVSN_NM,
     
메뉴명 MENU_NM

_NO

NUMBER

숫자로만 이루어진 경우주로 논리명이 번호인 경우에 사용.
주민등록번호
 JUMIN_NO,
     
조문번호
 JO_NO,
     
게시물번호 BOARD_NO

_SQ

SEQUENCE

오라클의 Sequence, MSSQL Identity의 경우에 사용한다숫자 일련번호로 PK를 설정할 경우 SQ를 사용한다. MSSQL Identity의 경우 주로 _ID를 사용하는 경우가 많은데사용자 아이디 ? USER_ID ID와 의미가 틀려SQ를 사용한다.
작업번호
 WORK_SQ,
    
이력번호 HISTORY_SQ

_ID

ID

주로 사용자 아이디의 경우에 사용한다.
사용자아이디
 USER_ID,
    
등록자아이디 REG_ID

_DT

DATE

날짜의 경우 사용한다. DT는 날짜 타입이 DATE형인 경우에만 사용한다보통 날짜의 경우 CHAR(8)형으로 20050718식으로 저장을 많이 한다이런 경우에는 _YMD를 사용한다.
삭제일자
 DEL_DT,
    
변경일자 CHG_DT

_YMD

YYYYMMDD

날짜의 경우 사용한다날짜 타입이 CHAR 인경우 사용한다년월일인 경우_YMD를 사용하고년월형식으로 CHAR(6)로 저장될 경우 _YM을 사용한다.년도일자 인경우에는 YEAR, MONTH, DAY등의 컬럼명을 사용한다.

_GB

구분

구분값을 나타낼 때 사용한다.
CD
는 주로 코드테이블을 별도로 사용할 때 적당하고테이블 없이 코드상에서 구별할 때 사용한다가령 사용자구분 필드가 있을 때 일반사용자내부사용자가 있다면 별도의 사용자 그룹테이블로 분리하여 사용할 경우GROUP_CD가 필드명이 되지만코드상에서 일반(G), 내부(I)로 사용하기로 결정했다면 GROUP_GB 필드명을 사용하면 된다
.
통계구분 STAT_GB

_ST

STATE

상태값이다주로 CHAR(1) 형식을 사용한다.
사용자 상태 USER_ST

_FL

FLAG

플레그값이다종종 삭제하지 않는 테이블에 삭제플레그를 많이 사용된다값은 0/1 이나 Y/N를 많이 사용한다.
삭제여부 DEL_FL, 요청여부 REQ_FL

_ORD

ORDER

순서를 나타낼 때 사용한다.
컬럼순서 COLUMN_ORD

_CNT

COUNT

조회수 VIEW_CNT

_AMT

AMOUNT

재고량 STOCK_AMT

_SUM

SUM

분기합계 QTR_SUM, 년도합계 YEAR_SUM

 

3.3. 순서규칙
    - 
기본적으로 관계형 모델에서 열(Column)의 순서는 의미가 없음.

그러나물리적인 형태로 생성되어 관리될 때에는 보다 효율적인 저장공간의 관리를 위해 다음 순서에 따라 우선순위를 결정함
    - Primary Key
가 우선함
    - Primary Key
내에서는 Index 의미에 따라 순서를 결정함
    - Not Null Columns
이 우선함
    - Not Null Columns 
내에서는 Foreign Key, Attributes 순서로 함
    - Null Columns 
내에서는 다음의 규칙에 따라 순서를 결정함
    - Fixed Length Columns
이 우선함(Date,Number,Char)
    - Smaller Length Column
이 우선함

 

4. Index Name
4.1. 
규칙
    - 
해당하는 테이블명 뒤에 ‘_IX’를 붙여 index임을 명확히 함
    - 
대문자를 사용함
    - 
일련번호는 01 ~ 99까지 사용할 수 있음
    - MSSQL
의 경우 클러스터드 인덱스와 넌 클러스터드 인덱스를 구분하여 작성함.

클러스터드 인덱스 _IXC를 사용하며넌 클러스터드 인덱스는 일반 인덱스 명 룰을 따름.
    - 
테이블에 인덱스가 하나만 존재할 경우 일련번호를 사용하지 않아도 됨
.
4.2. 
표기 방식

      <
시스템 구분> + _ + <의미있는 테이블명> + _ + IX{<일련번호>}
      
) Table명 ‘I01_MASTER_TB’의 Index : I01_MASTER_IX01

 

5. Primary Key Name
5.1. 
규칙
    - 
영문 대문자로 작성함
    - 
해당하는 테이블명의 맨 뒤에 ‘_PK’라는 구분을 사용함
5.2. 
표기방식
      <
시스템 구분> + _ + <의미있는 테이블명> + _ + PK
      
) Table 명 ‘AC_USERS_TB’의 Primary Key : AC_USERS_PK

 

6. Foreign Key Name
6.1. 
규칙
    - 
영문 대문자로 작성함
    - 
해당하는 테이블명의 맨 뒤에 ‘_FK’라는 구분을 사용함
    - 
일반적으로 테이블명과 컬럼명까지 사용하나, OBJECT의 명칭이 길어져서 테이블명을 기준으로 작성함.
    - 
일련번호
 : 1 ~ 9
6.2. 
표기방식

      <
시스템 구분> + _ + <의미있는 테이블명> + _ + FK{<일련번호>}
      
) Table 명 ‘I01_MASTER_TB’의 Foreign Key : I01_MASTER_FK1

 

7.  Stored Procedure Name
7.1. 
규칙
    - 
길이는 큰 제한이 없으나 오라클의 OBJECT NAME 길이 제한은 있음.
    - 
해당하는 테이블명의 맨 뒤에 ‘_SP’라는 구분을 사용함

    - 
기능명은 복수개 사용이 가능하면 3개의 단어를 넘지 않도록 함
    - 
기능을 나타내는 명칭이 하나일 경우 일련번호를 생략해도 됨.
    - 
단어간에는 ‘_’로 구분함

    - 
업무룰에 해당되지 않는혹은 특정 테이블에 해당되지 않는 DBMS 전반적인 프로시저의 경우,

시스템 프로시저로 작성하는 경우에는 시스템구분 과 테이블명을 생략하고 간단히 작성할 수 있다.

스키마 스크립트 GENERATION ? GENERATE_SP
    - 
오라클의 경우 패키지 내부의 프로시저의 경우 패키지 명칭에 시스템구분을 사용하므로,

프로시저나 함수명에 시스템구분 코드를 넣지 않는다.

또한 기능에 따른 일련번호를 사용하지 않고 OOP의 기능인 Method Overloading 의 기능을 사용하여 작성한다.

또한 명칭은 Camel 표기법을 사용하여 작성한다사용자를 가져오는 경우 getUsers()
7.2. 
표기방식

      <
시스템 구분> + _ + <의미있는 테이블명> + _ + <기능명>{<일련번호>} + _ + SP
      
I01_MASTER_TB’ 테이블에서 데이타 입력에 대한
 Procedure
          : I01_MASTER_INS01_SP

     

기능명

명칭

설명

INS

INSERT

단일 테이블의 단순 INSERT 작업인 경우사용자 테이블에 데이터 입력 프로시저의 경우 업무룰이 복잡하여 여러 테이블에 걸쳐 삽입 작업이 된다면(서버측 트랜잭션이 구현된다면) INS를 사용하지 않고, REG를 사용한다.

UDT

UPDATE

단일 테이블의 단순 UPDATE 작업의 경우

DEL

DELETE

단일 테이블의 단순 삭제인 경우

LST

LIST

SELECT문을 사용하여 조회하는 경우

REG

REGISTER

등록작업(트랜잭션을 사용하여 여러 테이블에 입력 작업이 이루어질 때)

MOD

MODIFY

수정작업(트랜잭션을 사용하여 여러 테이블에 수정 작업이 이루어질 때)

REM

REMOVE

삭제작업(트랜잭션을 사용하여 여러 테이블에 삭제 작업이 이루어 질 때)

 

8. Function Name
8.1. 
규칙
    - 
길이는 제한이 없으며 영문 대문자를 사용함
    - 
해당하는 테이블명의 맨 뒤에 ‘_FC’라는 구분을 사용함을 원칙으로 하나,

       함수명이 길어서 사용상 불편할 경우특정 시스템에 국한하지 않고항상사용하는 라이브러리 같은 함수의 경우

       구분가능한 Short Name을 사용해도 무방하다.
    - 
단어간에는 ‘_’로 구분함

    - 
시스템 함수로 작성한 경우에는 접미사를 사용하지 않고간략한 함수이름을 사용한다) INSTR, LEASTR(@x bigint, @y bigint) 
    - 
오라클의 경우 패키지 내부의 함수의 경우에는 프로시저의 해당 규칙에 따른다.

       즉 시스템구분 코드와 접미사를 사용하지 않고, Camel 표기법으로 간략하게 작성한다.
8.2. 
표기방식

      <
시스템 구분> + _ + <기능명> + _ + FC
      
I01_MASTER_TB’ 테이블에서 주소명를 가져오기 위한
 Function
          : I01_GET_ADDRESSNAME_FC(p_AddressCode IN Char) 
내지는

          : getAddressName(p_AddressCode IN Char)

 

9. Table Trigger Name
9.1. 
규칙
    - 
영문 대문자로 작성함
    - 
일련번호는 01 ~ 99까지 사용 가능함
9.2. 
표기방식
      <
시스템 구분> + _ + <의미있는 테이블명> + _ + <일련번호> + _ + TG
    - Timing : B(Before), A(After)
    - Trigger Event : I(Insert), D(Delete), U(Update)

     I01_MASTER_TB’ 테이블에서 데이타 입력 후에 실행되는 Trigger
          : I01_MASTER_AU01_TG

 

10. View Name
10.1. 
규칙
    - 
길이는 제한이 없으며영문 대문자로 작성함
    - 
해당하는 테이블명의 맨 뒤에 ‘_VW’라는 구분을 사용함
    - 
일련번호는 01 ~ 99까지 사용할 수 있음
10.2. 
표기방식
      <
시스템 구분> + _ + <의미있는 테이블명><일련번호> + _ + VW
      
) AC_ADMINL_USER_VW

 

11. Sequence Name <오라클의 경우에만 해당>
11.1. 
규칙

    - 
길이는 제한이 없으며 영문 대문자를 사용함
    - 
해당하는 테이블명의 맨 뒤에 ‘_SQ’라는 구분을 사용함
11.2. 
표기방식
      <
시스템 구분> + _ + <의미있는 테이블명> + _ + SQ
      
I01_MASTER_TB’ 테이블의 Sequence : I01_MASTER_SQ

 

12. Package Name<오라클의 경우에만 해당>
12.1. 
규칙

    - 
길이는 제한이 없으며 영문 대문자를 사용함
    - 
해당하는 테이블명의 맨 뒤에 ‘_PKG’라는 구분을 사용함
12.2. 
표기방식
      <
시스템 구분> + _ + <의미있는 패키지명> + _ + PKG
      
검색엔진에서 사용하는 자원에 관련된 패키지 : SCH__PKG

13. Check 제약조건
13.1. 
규칙
    - 
길이는 제한이 없으며 영문 대문자를 사용함
    - 
기존의 명칭룰에 해당하는 접미사를 사용하지 않고예외적으로 접두어 CK_를 사용한다
        
일반적으로 CHECK DEFAULT 제약조건은 특정 테이블에 한정시켜서 작성하기 보다는 

        
시스템 전반에 걸쳐서 사용이 가능하므로 예외규정을 둔다.
13.2. 
표기방식

      CK + 
_ + <의미있는 CHECK>
      
이메일 체크
 : CK_EMAIL
      
성별 체크 : CK_SEX

 

14. Default 제약조건
14.1. 
규칙
    - 
길이는 제한이 없으며 영문 대문자를 사용함
    - 
기존의 명칭룰에 해당하는 접미사를 사용하지 않고예외적으로 접두어 DF_를 사용한다
        
일반적으로 CHECK DEFAULT 제약조건은 특정 테이블에 한정시켜서 작성하기 보다는 

        
시스템 전반에 걸쳐서 사용이 가능하므로 예외규정을 둔다
14.2. 
표기방식
      DF + 
_ + <의미있는 DEFAULT>
      
) Null String Default ? DF_NULLSTR
      
) 0(Zero) Default ? DF_ZERO


출처:링크

http://comzil.com/1970


http://mastmanban.tistory.com/353


버퍼 크기기술

(size)

버퍼의 총 크기를 지정합니다. _bcount 및 _ecount와 함께 사용, _part와 함께 사용하지 마십시오. 이 값은 액세스 할 수있는 공간입니다, 그것은 할당 된 공간보다 작을 수 있습니다.

(size,length) 

전체 크기와 버퍼의 초기화 길이를 지정합니다. _bcount_part 및 _ecount_part을 사용합니다. 총 크기는 할당 된 공간보다 작을 수 있습니다.

 

버퍼 크기 단위기술

_bcount

버퍼 크기는 바이트입니다.

_ecount

버퍼 크기는 요소입니다.

 

방향기술

_in

이 함수는 버퍼에서 읽습니다. 호출자는 버퍼를 제공하고 초기화합니다.

_inout

이 함수는에서 읽고 버퍼에 기록을 모두. 호출자는 버퍼를 제공하고 초기화합니다. _deref와 함께 사용하면 버퍼가 함수에 의해 할당 할 수 있습니다.

_out

함수는 버퍼에 기록합니다. 반환 값 또는 _deref로 사용하는 경우,이 함수는 버퍼를 제공하고 초기화합니다. 그렇지 않으면, 호출자는 버퍼를 제공하고 기능을 초기화합니다.

 

우회기술

_deref

역 참조는 매개 변수 버퍼 포인터를 얻을 수 있습니다. 이 매개 변수는되지 않을 수 있습니다  NULL .

_deref_opt

역 참조는 매개 변수 버퍼 포인터를 얻을 수 있습니다. 이 매개 변수는 될 수 있습니다  NULL .


초기화기술

_full

이 기능은 전체 버퍼를 초기화합니다. 출력 버퍼에서만 사용하십시오.

_part

이 함수는 버퍼의 일부를 초기화하고, 얼마나 명시 적으로 나타냅니다. 출력 버퍼에서만 사용하십시오.

 

필수 또는 옵션으로 버퍼기술

_opt

이 매개 변수는 될 수 있습니다  NULL 




출처 : 링크

#include <stdio.h>
#include <windows.h>
int main()
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), BACKGROUND_INTENSITY | 
        FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN |
        BACKGROUND_BLUE | FOREGROUND_RED);
    printf("Melong, world!\n");    
    return 0;
}

#include <mswsock.h>

#pragma comment(lib,"mswsock.lib")



모든 윈도우에서 사용되는 리소스는 커널오브젝트라는 것을 가진다.

이 커널 오브젝트는 2가지 상태값을 가지게 되는데, 시그널 상태 논시그널 상태이다.

CreateEvent함수는 개체를 시그널 or 논시그널로 핸들을 생성할 수 있다.

그리고 WaitForSingleObject함수로 CreateEvent에서 생성한 핸들이 시그널이 될때까지 기다리게 할 수 있다.


SetEvent는 핸들의 시그널 값을 논시그널에서 시그널로 바꿔주는 역할을 한다.


예제>

HANDLE WowEvent;

DWORD WINAPI ThreadProc(LPVOID lpParam)

{

Sleep(5000);

SetEvent( WowEvent ); // 3) 5초후 WowEvent 시그널 상태로 변경한다.

return 0;

}


int _tmain(int argc, _TCHAR* argv[])

{

DWORD ID = 0;

CreateThread(NULL, 0, ThreadProc, NULL, 0, &ID);

WowEvent = CreateEvent(0, FALSE, FALSE, 0); // 1) WowEvent를 논시그널 상태로 생성한다.


  WaitForSingleObject(WowEvent, INFINITE); // 2) WowEvent가 시그널 상태로 되기를 기다린다.


// 4) WaitForSingleObject를 빠져나온다.


return 0; 

}


원본자료: 링크1, 링크2


요약


#include "stdafx.h"

#include <crtdbg.h> 


class CMemLeak

{

public:

CMemLeak()

{

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_DELAY_FREE_MEM_DF);


// 메모리 누수 난곳 찾아주는 함수

// _CrtSetBreakAlloc(108);

// 

// 다음과 같이 오류가 났을 떄 {} 안에 있는 값을 _CrtSetBreakAlloc 인자로 넣어주면 됨

// Dumping objects ->

// {108} normal block at 0x000987E8, 4 bytes long.

// Data: <    > CD CD CD CD 

}

};

CMemLeak MemLeak;


int _tmain(int argc, _TCHAR* argv[])

{

// 전체 메모리를 검사해서 동적 메모리 할당이 깨지거나, 삭제된 포인터에 접근한 걸 확인, 중간 중간에 넣어주자

_ASSERTE( _CrtCheckMemory( ) );


return 0; 

}


+ Recent posts