본문 바로가기
코스웨어/11년 내장형하드웨어

[내장형]이성재_20110929 일일보고서

by 알 수 없는 사용자 2011. 9. 29.
728x90
반응형
#include "L1_Ethernet.h"

void L1_Ethernet(const void* vpData)
{
const struct ether_header* stpEth = vpData;

printf("%02X :  %02X :  %02X :  %02X :  %02X :  %02X   -> " 
 "%02X :  %02X :  %02X :  %02X :  %02X :  %02X   \n",
stpEth->ether_shost[0],
stpEth->ether_shost[1],
stpEth->ether_shost[2],
stpEth->ether_shost[3],
stpEth->ether_shost[4],
stpEth->ether_shost[5],
stpEth->ether_dhost[0],
stpEth->ether_dhost[1],
stpEth->ether_dhost[2],
stpEth->ether_dhost[3],
stpEth->ether_dhost[4],
stpEth->ether_dhost[5]);
        printf("%04X\n",  ntohs(stpEth->ether_type) );
// ntohs함수는 네트워크 to 호스트 short 의 약자로 빅인디언에서 리틀인디언으로 바꾸는데에 사용할수 있다. 
 


실행결과 )   패킷을 보내는곳의 MAC주소에서 받는곳의 MAC주소를 -> 가리키고 있는것을 표현.
stpEth 구조체 배열안에 head의 정보가 정확하게 들어있는것을 알수있다. 


/*  ID type 이 무엇인지 표현하기 위해 switch문을 써서 해석할수있다. */
switch(ntohs(stpEth->ether_type))
{
case  ETHERTYPE_PUP: 
printf("Xerox PUP\n");
break;

case  ETHERTYPE_IP:
printf("IP\n");
break;

case  ETHERTYPE_ARP:
printf("Address resolution\n");
break;

case  ETHERTYPE_REVARP:
printf("Reverse ARP\n");
break;

default :
printf("Unknow\n");
break;
}

   vpData = stpEth+1;
 
return vpData;
}


이런식으로 이쁘게 만들면 좋겠다^^


* 계층 2의 IP 헤더를 알아보자


IPv4 를 사용해서 버전이 4 라는것을 알수 있다. 

#include "L2_IP.h"

const void* L2_IP(const void* vpData)
{
const struct ip* stpIP = vpData;

printf("IP version : %d\n",stpIP->ip_v);
printf("header length : %d byte\n",stpIP->ip_hl *4);
     
        vpData = (unsigned char*)vpData + (stpIP->ip_hl *4);
        return vpData;
}

 
구조체안에 정확하게 버전과 길이가 들어있는것을 알수있다.  


그리고 return 값은 


 
* WINAPI  DlgCheck 



<main.cpp>

#include <windows.h>
 
 
#
 
include "dlg.h"

HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("dlgcheck");

typedef struct MESSAGEMAP
{
UINT iMessage;
LRESULT (*lpfnMsgProc)(HWND, WPARAM, LPARAM);
} MESSAGEMAP;


// 대화상자 메세지 구조체
typedef struct DLGMESSAGEMAP
{
UINT iMessage;
BOOL (*lpfnMsgProc)(HWND, WPARAM, LPARAM);
} DLGMESSAGEMAP;

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 LPSTR lpszCmdParam, int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst = hInstance;


WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hInstance = hInstance;
WndClass.lpfnWndProc = WndProc;
WndClass.lpszClassName = lpszClass;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
RegisterClass(&WndClass);

hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,  CW_USEDEFAULT,
NULL, (HMENU)NULL, hInstance, NULL);
ShowWindow(hWnd, nCmdShow);


while(GetMessage(&Message, NULL, 0, 0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
// add
int i;
static MESSAGEMAP MessageMaps[] = 
{
{WM_CREATE, OnCreate},
{WM_COMMAND, OnCommand},
{WM_LBUTTONDOWN, OnLButtonDown},
{WM_MOUSEMOVE, OnMouseMove},
{WM_LBUTTONUP, OnLButtonUp},
{WM_DESTROY, OnDestroy},
{WM_LBUTTONDBLCLK, OnLbuttonClk},
{WM_RBUTTONDOWN,OnRButtonDown},
{WM_PAINT, OnWmPaint},
{WM_HSCROLL, OnHScroll}
};

for(i = 0 ; sizeof(MessageMaps) / sizeof(MessageMaps[0]) > i ; ++i)
{
if(iMessage == MessageMaps[i].iMessage)
{
return (*MessageMaps[i].lpfnMsgProc)(hWnd, wParam, lParam);
}
}
return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}


// (대화상자 프로시저 ,대화상자 핸들을 받는다 )
BOOL CALLBACK AboutDlgProc(HWND hDlg,UINT iMessage, WPARAM wParam, LPARAM lParam)

{
int i;
static DLGMESSAGEMAP DMessageMaps[] = 
{
{WM_INITDIALOG, OnInitDialog},
{WM_COMMAND, OnDlgCommand},
};

for(i = 0 ; sizeof(DMessageMaps) / sizeof(DMessageMaps[0]) > i ; ++i)
{
if(iMessage == DMessageMaps[i].iMessage)
{
return (*DMessageMaps[i].lpfnMsgProc)(hDlg, wParam, lParam);
}
}
return FALSE; // 대화상자에서 처리하는 메세지외에 들어오는 값은 FALSE 로처리 
}


<dlg.cpp>

#include "dlg.h"

HWND hWndMain;
PAINTSTRUCT ps;
HDC hdc;

TCHAR str[128];

BOOL bMale;

enum tag_Major{MANAGE,KOREAN,ENGLISH,LAW}Major;

TCHAR *arMajor[] = {TEXT("경영학과"),TEXT("국문학과"),TEXT("영문학과"),TEXT("법학과")};

/********** 스크롤 윈도우 생성 밑 스크롤 최소 최대 크기 및 스크롤 박스 위치 초기화 **********/
LRESULT OnCreate(HWND hWnd, WPARAM wParam, LPARAM lParam)
     bMale=TRUE;
     Major=KOREAN;
     return 0;
}
LRESULT OnWmPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
  hdc=BeginPaint(hWnd, &ps);
  wsprintf(str,TEXT("성별 = %s"),bMale ? TEXT("남자"):TEXT("여자"));
  TextOut(hdc,10,10,str,lstrlen(str));
  wsprintf(str,TEXT("전공 = %s"),arMajor[Major]);
  TextOut(hdc,10,30,str,lstrlen(str));
  EndPaint(hWnd, &ps);
  return 0;
}

LRESULT OnLButtonDown(HWND hWnd, WPARAM wParam, LPARAM lParam)
{
if (DialogBox(g_hInst,MAKEINTRESOURCE(IDD_DIALOG1),
hWnd,AboutDlgProc)==1) 
InvalidateRect(hWnd, NULL, TRUE);
return 0;
}

BOOL OnInitDialog(HWND hDlg,WPARAM wParam,LPARAM lParam)
{
CheckDlgButton(hDlg,IDC_MALE,bMale ? BST_CHECKED:BST_UNCHECKED);
CheckRadioButton(hDlg,IDC_MAJOR1,IDC_MAJOR4,IDC_MAJOR1+Major);
return TRUE;
}

BOOL OnDlgCommand(HWND hDlg,WPARAM wParam,LPARAM lParam)
{
switch (wParam) 
{
  case IDOK:
   bMale=(IsDlgButtonChecked(hDlg,IDC_MALE)==BST_CHECKED);
   if (IsDlgButtonChecked(hDlg,IDC_MAJOR1)==BST_CHECKED) Major=MANAGE;
   if (IsDlgButtonChecked(hDlg,IDC_MAJOR2)==BST_CHECKED) Major=KOREAN;
   if (IsDlgButtonChecked(hDlg,IDC_MAJOR3)==BST_CHECKED) Major=ENGLISH;
   if (IsDlgButtonChecked(hDlg,IDC_MAJOR4)==BST_CHECKED) Major=LAW;
   
   EndDialog(hDlg,IDOK);
   return TRUE;
  
  case IDCANCEL:
   EndDialog(hDlg,IDCANCEL);
       return TRUE;
}
return FALSE;
}
 


 

bMale 변수의 상태를 IDC_MALE 체크박스에 표시하고 Major변수의 값을 IDC_MAJOR1~IDC_MAJOR4 사이의 라디오 버튼에 표시하면 될것이다. WM_INITDIALOG에서 CheckDlgButton으로 bMale변수값에 따라 IDC_MALE체크 박스의 상태를 체크 또는 비체크로 설정했다. 라디오 버튼은 CheckRadioButton함수로 변경하는데 첫번째 라디오 버튼인 IDC_MAJOR1에 Major를 더한 버튼을 체크하면 된다. 
728x90