#메시지 처리 함수 (WndProc)
메시지 처리 함수(WndProc) 란 WinMain에 메시지 루프에서 전달된 메시지를 처리해주는 함수입니다. 
이 WndProc 함수는 WinMain에서 호출하는것이 아닌 운영체제에서 호출합니다. 
이렇게 운영체제에서 호출하는 함수를 콜백 함수라고 합니다.
WinMain 내에 메시지 루프는 메시지를 전달하는 역활만 하고 
메시지 처리는 모두 이 WndProc 함수에서 처리가 됩니다.

DOS에서는 main 함수만 있으면 프로그램을 작성할 수 있지만
WINAPI에서는 특별한 경우를 제외하고는 메인 함수와 메시지 처리 함수 이 두 함수가 있어야 한다.

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    switch(m.Msg)
    {
        case APMApiPublic.UWM_CHANGE_HANDLE:,,,,,,,
        case APMApiPublic.WM_COPYDATA:,,,,,,
    }
}

이렇게 전달된 메시지를 프록시함수는 스위치 문으로 처리합니다.
WM_PAINT , WM_KEYDOWN 등등 전달된 메시지의 종류에 따라 다르게 처리를 합니다.
프로그램 종료 버튼을 누르면 WM_DESTROY 메시지가 실행이 되고
PostQuitMessage(0) 함수가 호출되는데 이 함수는 WM_QUIT 메시지를 생성시켜
프로그램을 종료하게됩니다.

스위치 문을 통과한 뒤 DefWindowProc() 함수를 리턴하게 되는데
이 함수는 메뉴 최소화, 최대화 ,윈도우 이동, 등을 프로그래머가 집적 손대지 않아도
운영체제가 알아서 처리해주는 함수입니다.

비고) Window c를 이용하는 프로그램에서 자주 다루어 졌던 내용입니다.

#region을 사용하면 #endregion으로 지시문을 종료해야 합니다. Visual Studio에서 #region에서 바로 다음으로 나오는 #endregion까지의 코드를 확대, 축소하며 작업을 할 수 있습니다. 

 

아래의 그림 1이 위 설명을 코드로 나타낸 것 입니다. 

[그림 1]

 

[그림 2]



비고)
#region을 쓰면 안될 때..
짜임새 있게 짜여지지 못한 코드의 경우 region으로 더 복잡해 질 수 있습니다.

 

 

/*------------------------------------------------------------------------
 double value;

 value = 123;
 Console.WriteLine(value.ToString("00000"));
 Console.WriteLine(String.Format("{0:00000}", value));
 // Displays 00123

 value = 1.2;
 Console.WriteLine(value.ToString("0.00", CultureInfo.InvariantCulture));
 Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
                   "{0:0.00}", value));
 // Displays 1.20

 Console.WriteLine(value.ToString("00.00", CultureInfo.InvariantCulture));
 Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
                                 "{0:00.00}", value));
 // Displays 01.20

 CultureInfo daDK = CultureInfo.CreateSpecificCulture("da-DK");
 Console.WriteLine(value.ToString("00.00", daDK));
 Console.WriteLine(String.Format(daDK, "{0:00.00}", value));
 // Displays 01,20

 value = .56;
 Console.WriteLine(value.ToString("0.0", CultureInfo.InvariantCulture));
 Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
                                 "{0:0.0}", value));
 // Displays 0.6

 value = 1234567890;
 Console.WriteLine(value.ToString("0,0", CultureInfo.InvariantCulture));
 Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
                                 "{0:0,0}", value));
 // Displays 1,234,567,890

 CultureInfo elGR = CultureInfo.CreateSpecificCulture("el-GR");
 Console.WriteLine(value.ToString("0,0", elGR));
Console.WriteLine(String.Format(elGR, "{0:0,0}", value));
 // Displays 1.234.567.890

 value = 1234567890.123456;
 Console.WriteLine(value.ToString("0,0.0", CultureInfo.InvariantCulture));
 Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
                                 "{0:0,0.0}", value));
 // Displays 1,234,567,890.1

 value = 1234.567890;
 Console.WriteLine(value.ToString("0,0.00", CultureInfo.InvariantCulture));
 Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
                                 "{0:0,0.00}", value));
 // Displays 1,234.57

------------------------------------------------------------------------*/
usnig System;
usnig System.IO;
usnig System.Timers;
usnig Kingdom;

namespace Kingdom
{
  class Program
  {
    static void Main(string[] args)
    {
      Episode pro=new Episode();
      pro.running();
    }
  }

  class Episode
  {
    DateTime now;
    ConsoleKey key;
    ConsoleKeyInfo keyinfo;
    Timer timer;
    int xpos,ypos;

    public void elapsed_time_func(object sender, ElapsedEventArgs e)
    {
      ypos++;
      Logging("Time");
    }

    public void running()
    {
      timer=new Timer();
      timer.Interval=1000;
      timer.Elapsed += new ElapsedEventHandler(elapsed_time_func);
      timer.Start();

      Logging("Start");

      while(true)
      {
        key=Console.ReadKey(true).Key;
        //keyinfo=Console.ReadKey(true);

        if(key==ConsoleKey.RightArrow) xpos++;
        else if(key==ConsoleKey.LeftArrow) xpos--;
        else if(key==ConsoleKey.DownArrow) ypos--;
        else if(key==ConsoleKey.Escape) break;

        /*if(keyinfo.KeyChar=='+')
        {
          timer.Stop();
          timer.Interval += 10;
          timer.Start();
        }
        else if(keyinfo.Key==ConsoleKey.RightArrow) xpos++*/
        Logging("Key");
      }
      timer.Stop();
      Logging("Stop");
   }

   public void Logging(string msg)
   {
      now=DateTime.Now;
      Console.WriteLine("Debug>>" + "Pos[" + ypos.ToString("0000") + "," + xpos.ToString("0000") + "]   Time:" + now.ToString("yyyy-MM-dd hh:mm:ss") + "    Event:" + msg);
   }
  }
}

원장관리시스템이란 증권사가 고객계좌 관리 및 매매, 거래내역 등을 관리할 수 있는 프로그램. 주시거래에 관한 증권사용 시스템을 의미한다.

증권사 - 원장관리시스템처리, 정보분배시스템처리(수신), 매매지원시스템(거래소연계) - HTS,MTS,WTS

거래소 - 매매지원시스템(채널,매매,매칭), 청산관련시스템, 정보분배시스템(송신)


(1)
1. BackupFileToMemory - 하루동안 쌓여진 데이타를 한번에 메모리에 로딩
2. http://192.168.0.37:8080 확인

(2)
1. 마스터배치실행
2. 실시간 tcp 데이타 송신 & 수신
3. http://192.168.0.37:8080 확인

 


#include <stdio.h>
#include <unistd.h>

int main() 
{
  int i;

  for (i=10;i>=0;i--)
  {
    printf ("Count Down : %02d\r", i);
    fflush(stdout);
    sleep(1);
  }

  return(0);
}

 

#참조(mysql 삭제)
https://velog.io/@michael00987/MYSQL-%EC%84%A4%EC%B9%98-%EC%9E%AC%EC%84%A4%EC%B9%98

 

 

 


#MySQL innoDB 에서 INSERT 하는 속도를 MyISAM 과 유사하게 변경하는 방법은 다음과 같다.

* innodb_flush_log_at_trx_commit 설정값을 확인한다.
mysql> show variables like 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     | 
+--------------------------------+-------+
1 row in set (0.00 sec)

* innodb_flush_log_at_trx_commit 설정값이 1 이면 아래와 같이 실행하여서 0 으로 수정한다.
  - 아래와 같이 설정하면 INSERT 할 때에 로그 파일에 기록하지 않기 때문에 INSERT 속도가 향상된다. 
단, 서버 비정상 종료 또는 정전과 같은 상황에서 INSERT 한 데이터를 잃어버릴 수 있다.

mysql> set global innodb_flush_log_at_trx_commit=0;

innodb_flush_log_at_trx_commit 옵션 설명은 다음과 같다.
이 옵션은 commit 을 하였을 경우 
그 즉시 commit된 데이타를 log file 에 기록할 것인지 아닌지를 설정하는 옵션입니다.  
즉시 로그 파일에 기록할 경우 급작스런 정전 같은 경우 데이타 손실을 막을 수 있지만 매번 로그를 기록해야 하므로 속도가 상당히 저하됩니다. 
0 으로 설정할 경우 매 트랜잭션 마다 데이타를 로그에 기록하지 않으므로 I/O부하를 줄일 수 있으며 여러 트랜잭션을 모아서 한번의 디스크 I/O로 기록하므로 I/O횟수 자체도 줄어듭니다. 



/*
 * namespace(c#) & package(java)
 * java에서 package는 c#에서 namespace와 같은 keyword이다.
 * direct make class에서 direct make class를 호출(public,static 주의)
 */

/* ConsoleKeyInfo 클래스를 사용할경우
   ConsoleKeyInfo keyInfo;

   keyInfo=Console.ReadKey(true);

   if(keyInfo.Key==ConsoleKey.RightArrow) xpos++;
   if(keyInfo.KeyChar=='+') timer.Interval += 10;
   if(keyInfo.KeyChar=='-') timer.Interval -= 10;
*/


using System;
using System.IO;
using System.Timers;
using Kingdom;

namespace Kingdom
{
  class Program
  {
    static void Main(string[] args)
    {
      episode pro = new episode();
      pro.running();
    }
  }

  class episode
  {
    DateTime now;
    ConsoleKey key;
    Timer timer;
    int xpos,ypos;

    public void running()
    {

      int toggle=0;

      timer=new Timer();
      timer.Interval=1000; /*1 Second*/
      timer.Elapsed += new ElapsedEventHandler(time_elapsed_func);
      timer.Start();

      xpos=ypos=0;

      WriteLog("Start");
      while(true)
      {
        key=Console.ReadKey(true).Key;
        if(key==ConsoleKey.RightArrow) xpos++;
        else if(key==ConsoleKey.LeftArrow) xpos--;
        else if(key==ConsoleKey.UpArrow) ypos++;
        else if(key==ConsoleKey.DownArrow) ypos--;
        else if(key==ConsoleKey.Escape) break;
        else if(key==ConsoleKey.Enter)
        {
          if(toggle==0)
          {
             timer.Stop();
             toggle=100;
             WriteLog("Time stop");
         }
         else
         {
             timer.Start();
             toggle=0;
             WriteLog("Time restart");
         }
       }
       WriteLog("Key");
      }//end of while
      WriteLog("Stop");
      timer.Stop();
    }

    public void time_elapsed_func(object sender, ElapsedEventArgs e)
    {
        ypos++;
        WriteLog("Time");
    }

    public void WriteLog(string msg)
    {
      now=DateTime.Now;
      Console.Write(now.ToString("yyyy-mm-dd hh:mm:ss") + "  Event:" + msg + "----------------");
      Console.WriteLine("Index;["+ypos+","+xpos + "]");
    }
  }
}//end of namespace;

KRX시장시스템
용어정리
- 채널(CH), 매칭,대량매칭(ME), 매매,트랜잭션(TR)

유가>
증권사 원장관리 시스템<->
증권사(매도주문)->채널->매칭->매매지원->정보분배->증권사(체결,호가등)
증권사(매수주문)->채널->매칭->매매지원->정보분배->증권사(체결,호가등)

코스닥>
증권사 원장관리 시스템<->

증권사(매도주문)->채널->매칭->매매지원->정보분배->증권사(체결,호가등)
증권사(매수주문)->채널->매칭->매매지원->정보분배->증권사(체결,호가등)

코넥스>
증권사 원장관리 시스템<->

증권사(매도주문)->채널->매칭->매매지원->정보분배->증권사(체결,호가등)
증권사(매수주문)->채널->매칭->매매지원->정보분배->증권사(체결,호가등)

 

                  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

매매체결          준비작업

청산결제          준비작업

정보분배          준비작업

시장감시          준비작업

                  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

매매체결              시스템점검

청산결제              시스템점검

정보분배              시스템점검

시장감시              시스템점검

                  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

매매체결                        호가접수 & 매매체결 & 회원사데이타 제공

청산결제                        실시간,배치 데이타 송수신

정보분배                        시장데이타 수신,가공,분배

시장감시                        불공정거래적출

                  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

매매체결                                                                   배치작업

청산결제                                                                   배치작업

정보분배                                                                   배치작업

시장감시                                                                   배치작업

#증권정보 실시간데이타 웹페이지에 구현

#거래소,코스닥,코넥스 호가,체결,거래원정보는 실시간으로 웹페이지에 표시되어야 한다.
- 대상단말 : 로그인되어 있는 사용자

1. 거래소 & Koscom데이타 -> RcvTData -> RcvQData -> Shared Memory
1.1 체결데이타 수신시, SendQData로 Ack신호
1.2 호가데이타 수신시, SendQData로 Ack신호
1.3 거래원데이타 수신시, SendQData로 Ack신호
1.4 지수데이타 수신시, SendQData로 Ack신호

2. Shared Memory -> SendQData(Ack신호를 받으면) -> WebSocket -> WebBrowser

Continue,


#C (프로그래밍 언어) 개요

C는 1972년 켄 톰슨과 데니스 리치가 벨 연구소에서 일할 당시 새로 개발된 유닉스 운영 체제에서 사용하기 위해 
개발한 프로그래밍 언어이다. 
켄 톰슨은 BCPL언어를 필요에 맞추어 개조해서 "B"언어(언어를 개발한 벨 연구소의 B를 따서)라 명명했고, 
데니스 리치가 이것을 개선하여 C 언어가 탄생했다. 
유닉스 시스템의 바탕 프로그램은 모두 C로 작성되었고, 
수많은 운영 체제의 커널 또한 C로 만들어졌다. 
오늘날 많이 쓰이는 C++는 C에서 객체 지향형 언어로 발전된 것이다. 
또 다른 다양한 최신 언어들도 그 뿌리를 C에 두고 있다.

# OS
1. WIndows 10
- c# console hexa code(IDE:editor,Compiler:csc)

frm_hexa_3.cs
0.01MB



- c# window form hexa code(IDE:Visual Studio)

APINFQ0020.cs
0.02MB


- c,c++ console hexa code(IDE:editor,Compiler:gcc)

mainsrc.c
0.00MB
common.h
0.00MB
wincommon.c
0.01MB


- c,c++ window form hexa code(IDE:Visual Studio)

winmainsrc.c
0.01MB
wincommon.h
0.00MB
wincommon.c
0.01MB


- pascal window form hexa code(IDE:DELPHI) 
- javascript web-browser hexa code(IDE:editor)

____real_fast_no_ajax_hexa.html
0.02MB


- java console hexa code(IDE:editor,Compiler:javac)

 

2. Linux(Ubuntu,Centos)
- c,c++ console hexa code(IDE:editor,Compiler:gcc,실행도구:telnet terminal)
- javascript web-browser hexa code(IDE:editor,실행도구:desktop mode)

3. Windows 10 + Linux was(tomcat)
- javascript web-browser network hexa code(feat. AJAX)

# Compiler
1. windows 10 c# console - csc(freeware)
2. windows 10 c# form - visual studio(freeware at private, but company is not free)

3. windows 10 c,c++ console - gcc(freeware)
4. windows 10 c,c++ form - visual studio(freeware at private, but company is not free)

5. windows 10 pascal form - DELPHI (freeware at private, but company is not free)
6. windows 10, Linux javascript - web-browser is OK

 

 

Question into xterm92@naver.com

'헥사' 카테고리의 다른 글

Systehttp://m.Drawing.Color[] colorindex = new Systehttp://m.Drawing.Color[]  (0) 2023.11.29
MM_DRAW()  (0) 2023.11.29

1. 설치 및 기본 명령어
리눅스와 공유정신에 대하여 무엇인지 알아보고 수업간 사용할 가상머신 설치,
원활한 수업을 위한 설정,
실제 명령어를 사용하기 위한 튜토리얼 작업
리눅스 서버를 실습하기 위한 각종 시스템 구성
리눅스에서 사용되는 기본 명령어 학습

2. 기본 명령어
쉘운영의 기본이 되는 파일다루기
확인, 이동, 복사, 생성 등의 작업을 통해 리눅스에서 파일이 가지는 의미를 이해하고 실제 작업 및 확인을 통하여 기본적으로 사용하는 명령어들을 완전 숙지

3. 파이프 및 필터 유저 관리
로컬파일 보안출력결과를 내가 원하는대로 출력하고 원하는 파일로 구성한다.
시스템의 기반이 되는 유저제어를 통해 리눅스에서 유저가 가지는 실제 목적을 파악한다
파일에 권한을 부여하고 사용자들간의 파일 사용을 제한한다.

4. 프로세스 관리 & 디스크 관리
시스템 관리건강한 시스템을 유지하기 위해 프로세스 확인, 관리, 제어의 목적을 가지고 운영레벨에서 시스템을 구성해본다
저장소의 자유로운 사용이 시스템 운영의 필수 요소중 하나이다. 로컬 스토리지를 추가하여 시스템에서 실제 사용 할 수 있도록 학습한다.
systemd / init 프로세스 차이점 확인, 서비스 구동, 부팅 과정 이해

5. 리눅스 네트워크
백업 시스템리눅스를 서버로 사용하기 위한 기본 네트워크 설정
리눅스 기본 기능을 이용한 백업 기능 구현

#Console Hexa, form Hexa by c language

1. Console Hexa

#소스파일첨부

common.c
0.01MB
common.h
0.00MB
mainsrc.c
0.00MB

 

 

#Form Hexa

#소스파일첨부

wincommon.c
0.01MB
wincommon.h
0.00MB
winmainsrc.c
0.01MB

 

/*
#KeyBoard를 이용한 xpos,ypos 증감 프로그램
- 1초당 ypos가 1씩 증가한다.
- LEFT,RIGHT Key를 이용해서 xpos를 1씩 증감한다.
*/

using System;
using System.IO;
using System.Timers;

namespace SimpleConsole
{
  class Program
  {
    const int FAIL=-1;
    const int SUCC=1;
    static int xpos,ypos;
    static System.Timers.Timer timer;

    static void Main(string[] args)
    {
      int ii,kk,ff,rc;

      timer=new System.Timers.Timer();
      timer.Interval=1000;
      timer.Elapsed += new ElapsedEventHandler(time_elapsed_func);
      timer.Start();

      ConsoleKey key=ConsoleKey.NoName;
      Init();
      while(true)
      {
        key=Console.ReadKey(true).Key;

        if(key==ConsoleKey.Escape)
        {
          timer.Stop();        
          break;
        }
        else if(key==ConsoleKey.RightArrow) xpos=xpos+1;
        else if(key==ConsoleKey.LeftArrow) xpos=xpos-1;
        else if(key==ConsoleKey.Enter)
        {
          //
        }
        DrawHexa(100);
      }
    }

    static void DrawHexa(int ____event)
    {
      int ii,kk,ff,rc;

      DateTime now=DateTime.Now;

      if(____event==100)
      Console.WriteLine(">>>>NowEvent[Key ]:"+now.ToString("yyyy-MM-dd HH:mm:ss") + "    INDEX:["+ypos+","+xpos+"]");
      else 
      Console.WriteLine(">>>>NowEvent[Time]:"+now.ToString("yyyy-MM-dd HH:mm:ss") + "    INDEX:["+ypos+","+xpos+"]");
    }
    
    static void Init()
    {
      xpos=0;
      ypos=0;
    }

    static int DownPossible()
    {
      ypos=ypos+1;
      //
      return SUCC;
    }

    static void time_elapsed_func(object sender, ElapsedEventArgs e)
    {
      int ii,kk,ff,rc;

      DrawHexa(200);

      rc=DownPossible();
      if(rc==FAIL)
      {
        if(ypos==0) timer.Stop();
        else
        {
          //INIT
        }
      }
    }
  } //End OF Program Class
} //End Of NameSpace

 

키를 입력하지 않으면, 1초마다 ypos가 1씩 증가하는 구조임.
키를 입력하면, 이벤트가 발생되어서, 그때 로직을 추가해서 사용할수 있음. 위의 예제는 LEFT,RIGHT시에 xpos증감.
헥사게임을 만들게 되면, 일정 시간후에 ypos가 1씩 증가하는 구조를 가지는 시스템에 적당한 프레임예제임.

 

s_frame.cs
0.00MB

 

#거래소 & Koscom 데이타를 보내는쪽은 Nagle 알고리즘을 적용한다.
#거래소 & Koscom 데이타를 보내는쪽은 Nagle 알고리즘을 적용한다.

#거래소 & Koscom
데이타를 송신하는부분에서
#send(102 byte)
#send(102 byte)
#send(102 byte)
#send(102 byte)
#send(102 byte)

#거래소 & Koscom 데이타를 수신하는쪽은
#recv = 102 * 1 byte
#recv = 102 * 4 byte
임을 보인다.

혹시라도, #거래소 & Koscom 데이타를 보내는쪽에서 Nagle 알고리즘을 적용하지 않는다면
비고) 송신하는 프로그램에서 다음의 코드를 추가하면, Nagle 알고리즘을 적용하지 않는다.
#include<netinet/tcp.h>
char on=1;
if(setsockopt(sock,OPPROTO_TCP,TCP_NODELAY,(char *)&on,sizeof(on))<0) printf("error!!\n");

#거래소 & Koscom데이타를 송신하는부분에서
#send(102 byte)
#send(102 byte)
#send(102 byte)
#send(102 byte)
#send(102 byte)

#거래소 & Koscom데이타를 수신하는쪽은
#recv = 102 byte
#recv = 102 byte
#recv = 102 byte
#recv = 102 byte
#recv = 102 byte
임을 보인다. 

#Nagle 알고리즘에 대해서 알아본다.

Nagle알고리즘? 네트워크 상에 패킷의 수를 줄이기 위해 개발된 알고리즘

1. 일반 네트워크 통신방법
- 일반적인 통신알고리즘은 데이터는 패킷으로 만들어 보낸다는 것이며 수신호스트는 이에 대한 ACK를 보낸다는 것입니다. 
예를 들어, A,B 두 호스트가 통신을 합니다. A는 B에게 'Nagle'라는 데이터를 보내기 원하면, 
먼저 'N'이라는 데이터를 패킷으로 만들어 출력버퍼로 보냅니다. 
그리고 ACK를 받고 안받고 관계없이 'a'를 패킷으로 만들어 보내고 이어서 'g', 'l', 'e' 각 데이터를 패킷으로 만들어 보낼 것입니다. 
수신호스트로부터의 ACK가 언제 오는가는 전혀 관계가 없고, 언제 오든지 오기만 하면 되는 것입니다.

2. Nagle 알고리즘
- 네트웍에서 Nagle 알고리즘은 "가능하면 조금씩 여러 번 보내지 말고 한번에 많이 보내라(Effective TCP)" 라는 원칙을 기반으로 만들어진 알고리즘입니다.
- Nagle 알고리즘의 원리는 ACK를 받은 다음에 데이터를 보내고 ACK를 받을 때까지 출력버퍼의 데이터를 저장하였다가 ACK를 받으면 버퍼의 데이터를 모두 패킷으로 만들어 보낸다는 것입니다. 
예를 들어 A가 'N'이라는 데이터를 패킷으로 만들어 보내고, 계속해서 다음 데이터를 보내는 것이 아니라 출력버퍼로 보내어 저장시켜 둡니다. 
그러다가 ACK가 오면 출력버퍼에 저장된 'agle'라는 데이터를 보냅니다.

 

 

- TCP 소켓은 Default로 Nagle 알고리즘을 적용하고 있습니다.

3. Nagle 알고리즘의 장단점
  - 장점 : 네트워크의 효율성이 높아짐. (똑같은 데이터를 보내더라도 생산하는 패킷이 적음)
  - 단점 : 송신 호스트가 ACK를 받을 때까지 기다려야 하므로 전송 속도가 느려짐

4. Nagle 알고리즘의 중단
  - 몇몇 네트웍 관련 프로그램에서는 네트웍의 전송량이나 부하보다는 빠른 응답속도를 더 중요시 여기는 상황이 있습니다. 
  그러한 때에는 TCP_NODELAY  라는 옵션을 사용하여 Nagle 알고리즘을 제거 할 수 있습니다.
  - TCP_NODELAY 옵션이
     1(TRUE) : Nagle 알고리즘을 적용하지 않습니다.
     2(FALSE): Nagle 알고리즘을 적용합니다.

int opt_val = TRUE;
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &opt_val, sizeof(opt_val));

해당 옵션의 사용은 네트웍 부하를 극대화 시켜주면서 서버의 전체적인 성능을 무척 감소하기때문에 꼭 필요한 경우에만 매우 주의를 해서 사용해야 합니다.
- 전송은 작은 단위로 자주 이루어지지만 즉각적인 응답은 필요 없는 어플리케이션에서만 사용 되어야 합니다.(마우스 움직임 같은)
- Nagle 알고리즘은 리얼타임시스템에서의 제어와 특히나 인터렉티브한 키 입력을 하는 어플리케이션에서는 안 좋은 영향을 미칩니다. 
선택적으로 Nagle 알고리즘을 통과하는 한가지 방법은 Out-of-bind 메시지 시스템을 쓰는 것입니다. 
그러나 이것은 내용물에 제약이 있고 또 다른 문제(순서의 상실: loss of sequentiality)를 일으킬 수 있습니다.

#거래소 & Koscom tcp 데이타를 서버에서 받을때에 모습(송신쪽에서 Nagle On일경우)

 

#거래소 & Koscom tcp 데이타를 서버에서 받을때에 모습(송신쪽에서 Nagle Off일경우)

소스파트)
int sd, ret, on=1,off=0, sz_sbuf;

/* added to options of socket by Changseop Oh from CheongJo */

/* Now >>>> nagle off -----------------*/
/* Now >>>> nagle off -----------------*/
/* Now >>>> nagle off -----------------*/
if(setsockopt(sd,SOL_SOCKET,SO_REUSEADDR,(char*)&off,sizeof(on))<0)
sprintf(ebuf, "setsockopt() : REUSEADDR setting Error!");

#증권정보 홈페이지 구성 단계별 데이타 처리과정

-Master
1. 거래소&Koscom -> RcvTData(Tcp) -> ReadQBatch -> Shared Memory(Kse,Kosdaq,Elw,Jisu,Konex Master), MySQL
2. 거래소&Koscom -> RcvTData(Tcp) -> ReadQFutureBatch -> Shared Memory(K200 Future Master), MySQL
3. 거래소&Koscom -> RcvTData(Tcp) -> ReadQOptionBatch -> Shared Memory(K200 Option Master), MySQL

-Chegyul,Hoga,Trade,Jongga,Jisu 등등
4. 거래소&Koscom -> RcvTData(Tcp) -> ReadQData -> Shared Memory(Kse,Kosdaq,Elw,Jisu,Konex)
5. 거래소&Koscom -> RcvTData(Tcp) -> ReadQFutureData -> Shared Memory(K200 Future)
6. 거래소&Koscom -> RcvTData(Tcp) -> ReadQOptionData -> Shared Memory(K200 Option)

7. Shared Memory(Kse,Kosdaq,Elw,Jisu,Konex) -> Jni -> Java -> jsp -> WebBrowser
- final sise, full jisu
8. Shared Memory(K200 Future) -> Jni -> Java -> jsp -> WebBrowser
- final sise
9. Shared Memory(K200 Option) -> Jni -> Java -> jsp -> WebBrowser
- final sise
10. Shared Memory(Common) -> Jni -> Java -> jsp -> WebBrowser
- final statistics

11. Shared Memory(Kse,Kosdaq,Elw,Jisu,Konex) -> SHELL -> MySQL -> Java -> jsp -> WebBrowser
- minute sise, minute jisu
12. Shared Memory(K200 Future) -> SHELL -> MySQL -> Java -> jsp -> WebBrowser
- minute sise
13. Shared Memory(K200 Option) -> SHELL -> MySQL -> Java -> jsp -> WebBrowser
- minute sise

 

#자바 네이티브 인터페이스(Java Native Interface, JNI)

자바 네이티브 인터페이스(Java Native Interface, JNI)는 자바 가상 머신(JVM)위에서 실행되고 있는 자바코드가 네이티브 응용 프로그램(하드웨어와 운영 체제 플랫폼에 종속된 프로그램들) 그리고 C, C++ 그리고 어샘블리 같은 다른 언어들로 작성된 라이브러리들을 호출하거나 반대로 호출되는 것을 가능하게 하는 프로그래밍 프레임워크이다.

1. 증권정보홈페이지에서 JNI사용하기
1.1 RcvTData -> ReadQData -> Shared Memory(Linux)
1.2 Shared Memory(Linux)를 java를 이용해서 HTML로 보여주기 위해서는 JNI가 필요하다.

1.3 Shared Memory(Linux)를 참조하는 함수(윈도우에서 DLL과 동일)를, 즉 so파일로 만들어야 한다.
1.4 지수,주식,elw,공통의 4가지 so파일로 만들기로 한다.
1.5 libCommonShm.so, libElwShm.so, libJongShm.so, libJisuShm.so 로 만든다.

1.7 즉 결론적으로 Shared Memory(증권정보데이타)를 java에서 호출, 데이타를 사용할수 있다.

사용예)
JongmokMast ksejmast = new JongmokMast();
ksejmast.setMemType(21);
ksejmast.setMarket("A");
ksejmast.setCode("A005930");
ksejmast.setData();

ShmMap_JMAST shm_jmast = new ShmMap_JMAST();
shm_jmast.setCommarea(ksejmast.getData());

String kijun = shm_jmast.get(shm_jmast.KIJUN);
String hyun = shm_jmast.get(shm_jmast.HYUN);
String open = shm_jmast.get(shm_jmast.OPEN);
String jang_flag = shm_jmast.get(shm_jmast.JANG_FLAG);

#Ubuntu 18.04 apache-tomcat-**** & apache2 설치및 연동

1. 설정1
root@stock:/usr/local/tomcat8/conf# which java
/usr/local/jdk1.8.0_202/bin/java
root@stock:/usr/local/tomcat8/conf#

JAVA_HOME=/usr/local/jdk1.8.0_202로 설정한다.

2. 설정2
<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="true">
<Context path="" docBase="/web/httpd/hexahtdocs" reloadable="true"/>
</Host>

3. 확인
http://19.168.0.37:8080
http://19.168.0.37:8080/common_sise/lower_rate.jsp?market=A


#install reference

 

apache_tomcat_9_install_guide.txt
0.01MB


#우분투 버전 역사
#LTS(Long Term Support)


우분투의 버전은 배포판이 나온 연도와 달로 매긴다. 
7.10은 2007년 10월, 8.04는 2008년 4월에 나온 버전이다. 
각 버전은 알파벳 순서로(6.06 LTS부터) 만든 형용사와 명사의 조합으로 코드명이 붙는다. 
7.10은 G에서 만든 Gutsy Gibbon이라는 이름이 붙으며, 
8.04는 H에서 Hardy Heron, 8.10은 I에서 Intrepid Ibex이다. 
처음 세개의 버전을 제외한 나머지 버전은 알파벳 순서로 명명되어서 사용자들이 버전 순서를 파악하는 데 용이하게 했다. 
LTS(Long Term Support)는 장기 지원 버전으로, 
4번에 한 번, 즉 원칙적으로 2년에 한 번씩 나온다. 
현재 가장 최신 버전의 LTS는 18.04이다. 10년간 장기지원한다.

manual.zip
1.56MB


각 버전별 지원 기간은 12.10까지는 1년 6개월이다. 
13.04부터는 9개월로 지원 기간이 단축되었지만 짝수 연도 상반기마다 나오는 장기지원버전(LTS)은 모든 버전을 늘어난 5년간 지원하도록 정책이 바뀌었다. 
처음에는 데스크톱판이 3년으로, 서버판이 5년으로 차별화되어 있었으나, 
12.04 버전부터 둘 다 5년으로 일원화돠었다. 
19LTS 버전부터는 10년간으로 늘어났다. 
이러한 정책의 밑바탕이 되는 주기적이고 장기적인 버전을 통한 LTS기술의 축적은 특별한 보안이 요구되는 금융등 산업계에서 장기적이고 안정된 IT 관리를 위한 매우 적절한 조처다.

+ Recent posts