Egloos | Log-in


[펌]HTTP POST

출처: http://uzys.tistory.com/entry/HTTP-POST

요즘 들어 이것 저것 잡다한 걸 만드는데 HTTP POST를 자주 쓰게 되었다. 
PHP에서는 Snoopy 를 이용하면 아무것도 몰라도 쉽게 할 수 있었는데 요즘 .Net 환경에서 개발을 해서.. 조금 문제가 생겼다. 하지만 NET 환경도 WebClient를 이용하면 쉽게 할 수 있기는 있다. 그런데 .Net Compact framwork에서는 유감스럽게도 Webclient를 지원하지 않는다. 그래서 HttpWebRequest를 이용해야 되는데. Snoopy처럼 상콤한 라이브러리가 없는 것 같다 (유료 제외) 그리하여 뭐 만들어야 되게 되었다.
만들려고 보니 Spec을 봐야했고 대충 요약해보면 아래와 같다.

일단 HTTP POST에 Form Content Type은 2가지 이다.
(사용 될 수 있는 다른 Content Type이 많지만 일단 2가지라고 생각하자. 많이 생각하면 힘들다. -_-;)
대부분 이 2개만 사용한다. 
- application/x-www-form-urlencoded
- multipart/form-data

먼저 'application/x-www-form-urlencoded' 에 대해 알아보겠다. 먼저 form에서 enctype을 지정 해주지 않으면 Default로 'application/x-www-form-urlencoded'가 설정된다. 
  
예제.
<form name="input" action="html_form_action.asp" method="POST">

Type your first name: 
<input type="text" name="FirstName" value="Mickey" size="20">
<br>Type your last name: 
<input type="text" name="LastName" value="Mouse" size="20">
<br>
<input type="submit" value="Submit">

</form> 

user send data

POST /html/html_form_action.asp HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 31
Connection: Keep-Alive
Pragma: no-cache
FirstName=Mickey&LastName=Mouse



생각보다 엄청 간단하다. name1=value1 / name2=value2 라면 이 둘을 &로 연결만 해주면 된다. 아 정말 간단하다. 그러므로 패스~

이제 문제의 ' multipart/form-data'를 소개하겠다. 예제가 최고다. 긴말 필요 없이 바로 예제.
예제.
 <FORM action="http://server.com/cgi/handle" enctype="multipart/form-data" method="post">
   What is your name? <INPUT type="text" name="submit-name"><BR>
   What files are you sending? <INPUT type="file" name="files"><BR>
   <INPUT type="submit" value="Send"> <INPUT type="reset">
 </FORM>


user send data
   Content-Type: multipart/form-data; boundary=AaB03x
   --AaB03x
   Content-Disposition: form-data; name="submit-name"
   Larry
   --AaB03x
   Content-Disposition: form-data; name="files"; filename="file1.txt"
   Content-Type: text/plain
   ... contents of file1.txt ...
   --AaB03x--

'Content-Type: multipart/form-data; boundary=AaB03x'

Content-Type을 전송할 때 boundary를 알렸고.
각 필드가 시작할 때 '--AaB03x' 쓰고 -> Content-disposition을 알리고 -> 데이터를 적는다.
파일의 경우는 --AaB03x' 쓰고 -> Content-disposition을 알리고 ->Content-Type 알리고 -> 데이터를 적는다.
마지막으로 --AaB03x--(뒤에 --가 더 붙는다)를 써서 끝을 알린다.


위 2가지가 대부분의 POST를 다 커버한다. 가끔 특별한 경우가 있기도 하다.

multipart/form-data 안에서 multipart/form-mixed를 이용하는 경우인데 E-mail의 파일 다중첨부를 생각해보면 될것 같다. HTML Form에서는 거의 안쓰지만 이 경우도 고려를 해야할려나 일단 나는 고려안하고 예제만 소개합니다.
 Content-Type: multipart/form-data; boundary=AaB03x
   --AaB03x
   Content-Disposition: form-data; name="submit-name"
   Larry
   --AaB03x
   Content-Disposition: form-data; name="files"
   Content-Type: multipart/mixed; boundary=BbC04y
   --BbC04y
   Content-Disposition: file; filename="file1.txt"
   Content-Type: text/plain
   ... contents of file1.txt ...
   --BbC04y
   Content-Disposition: file; filename="file2.gif"
   Content-Type: image/gif
   Content-Transfer-Encoding: binary
   ...contents of file2.gif...
   --BbC04y--
   --AaB03x--



참고문헌

1. HTML 4.01 Specification Chapter Forms http://www.w3.org/TR/html401/interact/forms.html
2. HTML FORMS http://www.w3schools.com/html/html_forms.asp

by 커널초보 | 2010/06/03 00:58 | C/C++/C#/MFC/Win32 | 트랙백 | 덧글(0)

[펌]string 형에서 THCAR 형으로 변환하기

코딩한 서버를 클라이언트와 붙이면서 데이터 형에서 문제를 많이 일으켰다.
첫째, string 을 tchar로 변환
둘째, 멀티바이트 사용 하는 코딩 과 유니코드 사용(내가 코딩한 것) 것 사이의 문제.
TCHAR을 사용한다고 했지만 서버와 클라 사이의 데이터 이동도 많고
결국에는 내 소스 역시 멀티바이트로(클라가 사람이 많으니 다수를 따라서..) 변환 했고
TCHAR로 처리 되었던 것은 string을 char로 변환해서 마무리 했다.

그 과정에서 찾은 데이터 변환 방법 들...
  
방법 1. 외국 블로그에서

How to convert std::string to TCHAR*
출처 - http://ukanth.in/blog/?p=180

typedef std::basic_string<TCHAR> tstring; 
 
TCHAR* StringToTCHAR(string& s)
{
  tstring tstr;
  const char* all = s.c_str();
  int len = 1 + strlen(all);
  wchar_t* t = new wchar_t[len];
  if (NULL == t) throw std::bad_alloc();
  mbstowcs(t, all, len);
  return (TCHAR*)t;
}
 
std::string TCHARToString(const TCHAR* ptsz)
{
     int len = wcslen((wchar_t*)ptsz);
     char* psz = new char[2*len + 1];
     wcstombs(psz, (wchar_t*)ptsz, 2*len + 1);
     std::string s = psz;
     delete [] psz;
     return s;
}
추가 - mbstowcs 함수 : multi byte char 을 wide char로 변환
wcstombs 는 mbstowcs 의 반대.


사용  예)
// IdSet->getText() 는 string.
tstring tstr;
const char* all = IdSet->getText().c_str();
int len = strlen(all)+1;
wchar_t* t = new wchar_t[len];
if( t == NULL )
 throw std::bad_alloc();
mbstowcs( t, all, len );



방법2. String to char*, char* to TCHAR* (유니코드 사용 환경이였으므로 wchar*)

// IdSet->getText() is stl string

// String to char*
char* strID;
size_t tempSize = IdSet->getText().length();
strID = new char[tempSize];  
strcpy( strID, IdSet->getText().c_str() );

// char* to TCHAR*
TCHAR szUniID[256] = {0,};
int len = strlen(strID);
::MultiByteToWideChar( CP_ACP, 0, strID, -1, szUniID, len + 1 );
 
방법 3. string -> const char* -> char* (멀티바이트 사용)
//IdSet->getText() 은 string

char* id;

const char* strID = IdSet->getText().c_str();
id = const_cast<char*>(strID);

// 합쳐서 사용  
id = const_cast<char*>( IdSet->getText().c_str() );



추가 - const char*을 char*로 변환

방법 1. 직접 캐스팅
char* str1;
const char* str2;

str1 = (char*)(str2);

방법 2. 형변환 연산자 const_cast 사용
- const 객체에 대한 포인터를 const가 아닌 객체의 포인터로 변환 할때 사용하는 연산자
str1 = const_cast<char*>(str2);

by 커널초보 | 2010/04/28 09:59 | C/C++/C#/MFC/Win32 | 트랙백 | 덧글(0)

pydbg 및 paimei 설치

Saturday, January 27, 2007

This post should provide guidance to the individual looking to setup pydbg with the least amount of headache. When last I tried, PaiMei didn't play nice running under cygwin Python. Things worked much better under Python for Windows. I recommend creating a VMware image and then setting up shop in the image. Once you have a suitable image setup, install Python 2.4 for Windows. Next, download and run the ctypes installer for windows.

Now you're ready to install PaiMei. Download it from OpenRCE. Extract the zip file and execute the installer found in the installers directory. If you chose to install under VMware, there is a small hack you may need to implement before pydbg will work correctly inside VMware. To verify that you have a working installation, download my test script, fire up notepad.exe and execute the script. If the script barfs with an error, something is wrong. Otherwise, you are now ready to begin debugging applications from Python.

by 커널초보 | 2009/10/27 21:22 | 트랙백 | 덧글(0)

vs2008 c++ 와 DDK 연동하기

--------------------------------------------------------------------------------------------------
준비물 : ( 다운로드 및 설치는 생략하겠습니다)
1. Visual C++ 2008 Express(이하. 2008E)
2. WINDDK build 6000(이하 Winddk
)
--------------------------------------------------------------------------------------------------
1 . http://www.hollistech.com/Resources/ddkbuild/ddkbuild.htm
위 주소에서 ddkbuild3_13.zip 다운로드 받고 압축을 풀면 ddkbuild.bat 파일이 나옵니다. 메모장으로 열어서
자신의 DDK 가 설치 된 경로를 넣고 저장합니다. =>"set WNETBASE=c:\WINDDK\6000" (" "는 제외 입니다)
이 파일을 "C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\" 폴더에 복사합니다.

2. 2008E 실행 후 File->New->Project 를 선택합니다.
왼쪽에 General , 오른쪽에 Makefile Project, 아래쪽에 Name 과 Location 을 지정합니다.
그리고 오른쪽 하단에 보면 Create directoty for solution 이란 항목이 있는데 선 택하시면 지정한 Name 으로
디렉토리가 생성되고 또 같은 이름으로 한개 더 생성됩니다. 저는 체크를 하지 않고 사용합니다.

3. Configuration Settings 입니다.
아까 복사해둔 ddkbuild.bat 에 옵션을 넣어서 사용하는것인데 아래와 같이 Debug 모드에서는 뒤에
'checked .'라 하시고 Release 에서는 'free .' 라고 적어 주시면 됩니다(뒤에 점을 빼먹으시면 안됩니다)
-WNET 옵션은 ddkbuild.bat 다운받은곳에 가시면 자세히 설명이 나와 있습니다. DDK 의 버젼을 나타내고
2000,xp,vista 등등의 옵션도 다 지정 가능합니다.



4. 이제 프로젝트가 생성이 되었습니다. 이제 Tools->Option 으로 가셔서 Winddk 의 include 경로를 지정합니다.


5. Source , Header 파일이 지정합니다.


6. 메뉴에 Build -> FileMonBuild 를 실 행합니다.
아래는 build 후에 object 디렉토리입니다.


7. Visual C++ 2008 Express + WINDDK build 6000 의 연동 방법을 마치겠습니다.
무작정 생각나서 해보았지만 이미 웹에 여러분들이 훌륭한 자료를 많이 올려주셔서 막힘 없이 손쉽게 할 수 있었습니다. 아직 Build 명령의 옵션 및 자동완성등 알고 싶은게 많지 만 회사 업무 관계로 여기까지 밖에 못했습니다.

출처 : http://www.driveronline.org

by 커널초보 | 2009/09/04 18:11 | 트랙백 | 덧글(0)

[펌]WInDbg VMware와 연결하여 커널디버깅하기


윈도우 커널프로그래밍을 하다보니 필요하게 됐다.

윈도우에서 커널디버깅을 하기위해서는 뭐 대충 SoftICE를 이용하는 방법과  WinDBG를 이용하는 방법

두가지가 있는데 SoftICE는 깔다가 어떻게 하는지 복잡한거같기도하고 시간이 없어서

SoftICE보다 간단하게 설치할 수 있는(그냥 내 생각이다.) WinDBG를 이용하게 됐다.

나중에 SoftICE도 까는걸 꼭 성공해야지~~ ^^

우선 WinDBG를 이용하여 커널을 살펴 보려면 Debug 와 Debugee 두가지가 필요하다.

여기서 Debug는 보통 개발하는 컴퓨터를 칭하고 Debugee는 대상컴퓨터를 말하는데
 
간단하게 VMware를 이용한다.(다른 데스크탑을 이용해도 상관은 없다.)

이 글은 Windows XP버젼에서 했던것을 정리한것이다.

이제부터 순서를 이야기 하겠다.

[Debugee 설정하기]
1. VMWare에 SerialPort를 하나 만든다.


추가를 하고 next를 누른다.


Output to named pipe를 선택

이름은 \\.\pipe\com_1로 적어주고
첫번째 This end is the server로 선택
두번째 The other end is an aplication. 선택 후 Finish누른다.

Yield CPU on poll를 체크해주고 OK를 눌러서 VMware의 설정을 마친다.

2. VMware의 윈도우를 시작하고 boot.ini파일을 수정해야한다.
 boot.ini파일의 밑쪽에 보면

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /fastdetect

이런식으로 작성된 부분을 볼 수 있을 것이다. 이 밑에


multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - D
ebug" /fastdetect /debugport=com1 /baudrate=115200

라고 한줄로 입력한다.  이 부분은 부팅할때 디버깅모드로 부팅을 할지 아니면 그냥 원래쓰던대로 부팅할지를

결정권을 주는 부분이다. 이렇게 하면 Debugee의 설정은 끝이다.

[Debuger 설정하기]
1. WinDBG를 설치한다. 디버깅대상이 윈도우이기 때문에 윈도우의 디버깅 심볼이 필요하다.

1.1 디버깅심볼은 http://www.microsoft.com/whdc/DevTools/Debugging/symbolpkg.mspx 에서 심볼을 수 있으나

받아서 해본결과 심볼서버를 통해 받는게 더 편하다는것을 느꼈다.

우선 심볼을 직접 받아 설치하면 C:\Windows\symbols 에 깔리게 될것이다.(뭐 경로를 바꿔줘도 상관은 없다.)

위 심볼경로를 WinDBG에 설정해준다. File -> SymbolFilePath에 위 경로대로 설치 했다면

C:\Windows\symbols 라고 적어준다.

1.2 심볼서버에서 디버깅심볼을 받으려면 심볼서버에서 받은 디버깅심볼을 저장할 폴더를 하나 만들고

그 경로를 File -> SymbolFilePath에 srv*저장할 폴더경로*http://msdl.microsoft.com/download/symbols

이라고 적어준다. 이러면 나중에 DMP파일을 분석할때 DMP파일에 맞춰서 디버깅심볼이 다운로드 된다.

참고로 DMP파일은 윈도우의 설정에 따라 안생길 수도 있으니 주의해야한다.



한번쯤 내컴퓨터 -> 속성 -> 고급탭 -> 시작 및 복구 로 가면



설정을 해줘야 한다. 이러면 c:\windows\minidump 가 생길것이다.

이미 설정이 되 있다면 상관없는 이야기지만 혹시나 확인해보길.........

2. WinDBG의 속성을 클릭하고 대상에 보면 원래 뭐라고 적혀있는 글이 있다. 그 뒤에 한칸띄우고
 
-b -k com:pipe,port=\\.\pipe\com_1 를 입력해 준다.


3. 디버기를 실행시키고 부팅중에 디버깅모드로 부팅을 할것인지 일반모드로 부팅을 할 것인지를 물어보게되는데

디버깅모드로 실행을 시키고 WinDBG를 실행시키면 WindowXP가 실행하다가 멈추게 될것이다.

그리고 WinDBG로 명령을 내리게 되면 그때부터 커널 내부를 들여다 볼 수 있게 된다.


[ 출처 ] http://kyh1026.tistory.com

by 커널초보 | 2009/09/04 17:45 | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶