말랑말랑한 이야기2019. 12. 30. 07:49

function base64ToBlob(base64) 
{
    var format = "application/octet-stream";
    var code = window.atob(base64);
    var aBuffer = new window.ArrayBuffer(code.length);
    var uBuffer = new window.Uint8Array(aBuffer);
    for (var i = 0; i < code.length; i++){
        uBuffer[i] = code.charCodeAt(i) & 0xff;
    }
    return new Blob([uBuffer], {type: format});
}

 

function onDownload() 
{
    var blob = base64ToBlob(fileData);
    window.navigator.msSaveBlob(blob, fileName);
}

Posted by Ditongs Ditongs
TAG base64, IE, js

댓글을 달아 주세요

말랑말랑한 이야기2010. 12. 4. 20:31
윈도우 해상도가 변경되거나 칼라비트가 변경되면 모든 Top-Level 윈도우에 해당 메시지가 전송됩니다. 이때 wParam에는 칼라비트가 그리고 lParam에는 변경된 해상도 값이 인자로 넘어옵니다. 윈도우7에서 테스트해보니 wParam, lParam에 항상 0가 오더군요. 아무튼 이때 GetSystemMetric() 함수로 해상도나 비트 값을 얻어서 사용하면 되기 때문에 큰 문제는 아닙니다. 문제는 이 메시지가 중첩되서 오는 경우가 있다는 겁니다. 즉 해당 메시지를 처리하는 로직이 끝나기도 전에 다시 해당 메시지가 들어오는 경우가 있습니다. 전체화면 모드 게임 실행중에 Alt+Tab 키를 눌렀을때가 이에 해당합니다. 프로그래밍을 하다보면 로직 처리에 대한 어려움보다 이러한 동기화적인 문제로 발생하는 버그를 찾는데 엄청나게 많은 시간을 빼앗기곤 합니다. 타이밍적인 문제이기 때문에 에러 발생이 일관적이지 않죠.
이해하기 쉽게 예를들어보죠. 해상도가 변경되면 변경된 해상도에 따라 아이콘 위치를 정렬하는 기능이 있다고하죠. 해상도 마다 위치할 아이콘의 위치 정보를 담은 파일이 있습니다. 해상도 변경 이벤트를 감지하면 파일을 읽고 적용할 위치 정보를 vector에다가 넣어둡니다. 그리고 벡터를 차례대로 순회하면서 실제 아이콘의 위치를 정렬합니다. 이때 벡터 순회중에 다시 해상도 변경 이벤트가 들어옵니다. 그럼 순회중이던 백터는 참조를 잃게되고 알수 없는 버그로 이어집니다. 디버깅이 매우 어려워지는 상황이죠. 요점은 이렇습니다. 해당 메시지를 처리하기 위해선 처리 로직이 끝나기전까지 재진입하지 않도록 플래그 변수를 두시거나, 아니면 사용자 정의 메시지를 만들어서 메시지큐에 Post하시기 바랍니다.
Posted by Ditongs Ditongs

댓글을 달아 주세요

말랑말랑한 이야기2010. 10. 18. 11:41
- 실제 데이터가 오가는 Data Port의 접속방식

FTP 서비스는 일반적인 서비스와는 달리 2개의 Port를 사용한다.
- 명령어와 응답이 오가는 Command Port(21번)와 실제 데이터가 오가는 Data Port(20번)로 구성된 TCP 기반의 서비스

[[ Active Mode ]]

- Command Port를 통해 클라이언트가 전해준 정보를 바탕으로 서버가 클라이언트의 Data Port에 접속을 시도한 후
  클라이언트의 요청에 따라 데이터를 클라이언트에 전송

Active Mode의 FTP에서 클라이언트는 사용되지 않는 랜덤한 포트 n(n>1023)을 통해 서버의 Command 포트(21번)에 접속
이때, 포트번호 n에 1을 더한, n+1번 포트의 정보를 서버에 전송하며, 클라이언트는 n+1번 포트를 Listening 하기 시작함
FTP 서버의 Data Port(20번)는 클라이언트에서 지정한 Data Port(n+1)를 통해 클라이언트에 접속

서버에 설치된 방화벽에서는 Active Mode의  FTP가 지원되려면 다음의 통신 채널이 열려있어야함
- FTP 서버의 21번 포트 : 클라이언트에서 접속을 시도할 수 있는 Command Port
- FTP 서버의 21번 포트 >> 클라이언트의 n(n>1023)번 포트 : 서버에서 클라이언트의 Command Port로 응답
- FTP 서버의 20번 포트 >> 클라이언트의 n+1(n>1023)번 포트 : 서버에서 클라이언트의 Data Port로 접속
- FTP 서버의 20번 포트 << 클라이언트의 n+1(n>1023)번 포트 : 클라이언트에서 서버의 Data Port 에 응답

※ Active Mode의 FTP에서 접속문제는 대부분 클라이언트측에서 기인함
     FTP클라이언트느 서버의 Data Port에 직접 접속이 불가능.
     단지 어떤 포트를 Listening 하고 있으며 서버가 데이터 전송을 위해 접속할 클라이언트 포트를 서버에 알려줄 뿐임
     클라이언트에 설치된 방화벽의 입장에서는 FTP 서버가 클라이언트의 특정포트에 접속하려는 시도가
     외부의 시스템 침입으로 간주되어 방화벽에 의해 차단되는 경우가 발생

[[ Passive Mode ]]
- Command Port 뿐만 아니라 데이터 접속도 클라이언트에서 시도하여 서버에 데이터를 요청하고 전송받는 방식

- 서버가 클라이언트에 접속을 시도해야하는 문제점을 해결하기 위해 다른 방식의  FTP 연결이 개발
   Active Mode에서 클라이언트에 설치된 방화벽이 FTP 서버의 접속 시도를 외부의 침입으로 간주하고 차단하는 문제를 해결하기위해
   Passive Mode에서는 두개의 포트 모두 클라이언트에서 서버에 접속을 함

- FTP 연결을 위해 클라이언트는 사용되지 않는 랜덤한 포트 n(n>1023)과 n+1 포트를 열 어둡니다.
  n 포트는 서버의 Command 포트인 21번 포트에 접속함
  클라이언트는 (서버로 하여금 클라이언트의 Data 포트 연결을 허용하기 위해) Port 명령어를 호출하지 않고 Pasv 명령어를 호출함
  서버는 사용되지 않는 랜덤한 포트 p(p>1023)를 열어두고 클라이언트에 해당 정보를 넘겨줌
  클라이언트는 데이터 전송을 위해 자신의 n+1 포트와 서버의 p 포트 연결을 시도

서버에 설치된 방화벽에서는 Passive Mode의  FTP가 지원되려면 다음의 통신 채널이 열려있어야함
- FTP 서버의 21번 포트 :  클라이언트에서 접속을 시도할 수 있는 Command 포트
- FTP 서버의 21번 포트 >> 클라이언트의 n(n>1023)번 포트 : 서버에서 클라이언트의 Command 포트로 응답
- FTP 서버의 p(p>1023)번 포트 : 클라이언트의 n+1(n>1023)번 포트에서 데이터 접속
- FTP 서버의 p(p>1023)번 포트 >> 클라이언트의 n+1(n>1023)번 포트 : 클라이언트의 요청에 대한 응답 및 실제 데이터 전송

※  Passive mode 에서의 문제점
      Passive mode의 FTP가 클라이언트 입장의 문제점을 해결한 방법이라면 서버 입장에서는 포트 전체를 열어두어야하는 문제점이 생김
      FTP의 접속을 위해 서버에 많은 수의 포트가 필요하다는 점이 가장 큰 문제점


명령행 FTP(CMD mode)에서 Passive 모드를 설정하는 방법

1. 시작 / 실행 / cmd 입력하고 확인
2. 명령행에서 FTP 명령을 이용해 Site에 접속 예) c:>ftp ftp.scnt.co.kr
3. User ID와 Password 를 입력하고 FTP 서버로 로그인 한다.
4. FTP 프롬프트가 뜨면 다음과 같은 명령을 입력한다
     ftp>quote pasv
Posted by Ditongs Ditongs

댓글을 달아 주세요