UDP Test 프로그램 분석
프로젝트 구조 udptestDlg.cpp : implementation file udptest.cpp : Defines the class behaviors for the application. udptest.h : main header file for the UDPTEST application udptestDlg.h : header file stdafx.h : include file for standard system include files
UI
C++ - View는 상태바, 메뉴, 작업줄등을 뺀부분을 제어 - main fram은 view이외에 부분을 제어 - doc은 Data처리
UI DoDataExchange(), OnPaint() 메쏘드를 이용해 UI를 완성시켰다. 이프로그램의 UI는 CDialog 클래스를 이용해서 만들었다. Cdialog는 기본적인 윈도우 프로그램 창을 만들어 주며 DoDataExchange(), OnPaint() 메쏘드를 이용해 UI를 완성시켰다. 완성된 UI에 MESSAGE_MAP() 메쏘드를 이용하여 특정 이벤트에 적절한 동작을 하도록 설계가 되어있다. 또한 Thread를 생성시켜 UDP통신을 한다.
UI - DoDataExchange() => View 생성 Method(Text, Check Box) DDX_Control - 리스트 상자, 콤보 상자, 에디트 상자, 각종 컨트롤 아이템을 연결시킴. DDX_Text - Cstring, int, LONG과 같은 변수를 연결해 컨트롤할 때 사용. DDX_Check - int 또는 BOOL 변수를 연결해 컨트롤을 사용. DDX_Radio - 라디오 버튼을 변수와 연결시킬 때 사용. AfxMessageBox() – 단순 메시지 출력 Ex ) Afx(MessageBox(“안녕”, 옵션);
UI - MESSAGE_MAP() => 이벤트 핸들링 메쏘드 DECLARE_MESSAGE_MAP() // 선언 BEGIN_MESSAGE_MAP // 시작 ON_BN_CLICKED // 클릭시 이벤트 발생 END_MESSAGE_MAP // 종료 OnPaint() => 아이콘 삽입 메쏘드 CPaintDC dc(this); // device context for painting dc.DrawIcon(x, y, m_hIcon); // Draw the icon
UDP Protocol이란? User Datagram Protocol의 약자로 전송계층에서 제공해야할 최소한의 서비스만 제공하는 전송 프로토콜. 특징 : 1. 비연결형 (Port만 확인하여 소켓을 식별하고 송수신) 2. 패킷 오버헤드가 적어 네트워크 부하 감소 3. 비 신뢰성 4. 오류검출(헤더에 오류 검출 필드 포함)
UDP 프로그래밍 절차
Struct sockaddr 구조체 winsock2.h 에 정의 되어 있다. #define AF_INET 2 // internetwork : UDP, TCP, etc.. struct sockaddr{ sa_family_t sa_family; // 소켓의 주소체계. PF_INET= IPv4 주소체계. char sa_data[14]; // 해당 주소체계에서 사용하는 주소 정보. } struct sockaddr_in{ sin_family_t sin_family; // IPv4 주소체계에서 사용하므로 항상 AF_INET으로 설정 unist16_t sin_port; // 포트 번호 struct in_addr sin_addr; // IP주소를 나타내는 32비트 정수 타입 구조체 char sin_zero[8]; // sockaddr과 같은 크기를 유지하기 위해 필요한 패딩(padding) 공간. 항상 0.
Winsock 초기화 및 종료 소켓 API를 호출하기 전에 반드시 윈속 초기화를 해야한다 WSAStartup(wVersionRequested, IpWSAData) // 프로그램에서 사용할 윈속 버전 요청 wVersionRequested = 프로그램이 요구하는 윈속 버전 Ex ) 윈속 3.2버전 요청시 MAKEWORD(3,2) IpWSAData = 시스템에서 제공하는 윈속 구현에 대한 세부 사항 - WSACleanup() // 윈속 종료
OnSendmessage() 소켓을 생성하고 데이터를 보내는 메쏘드 Receive 또한 절차는 유사하므로 생략
OnSendmessage() // 소켓 생성 sock = socket( AF_INET, SOCK_DGRAM, 0 ); AF_INET >> 인터넷 프로토콜 체계 SOCK_DGRAM >> 데이터그램 방식
OnSendmessage() - Sockaddr 세팅 addrReceiver.sin_family = AF_INET; // 바이트 순서 변환 addrReceiver.sin_port = htons( m_PORTNUM ); // Host ip address addrSender.sin_addr.s_addr =inet_addr("192.9.211.157");
OnSendmessage() - bind 호출 bind(sock, (struct sockaddr )&addrReceiver, sizeof(addrReceiver)); (Struct sockaddr *) & addrReceiver >> 서버 소켓주소 구조체 포인터 Send data memcpy(sendbuf,&sendprotocol,sizeof(sendprotocol)); - Data Send sendto( sock, sendbuf, sendDataLength, 0, ( SOCKADDR * )&addrSender, sizeof( SOCKADDR ) )
Thread Thread란 프로세스 안에서 실제 실행의 단위 MFC에서 스레드를 생성하는 함수는 AfxBeginThread로 특정 전역 함수를 별도의 스레드 단위로 실행이 가능하다. CWinThread* pThead= AfxBeginThread(TheadReceive,&threadInfo); CWinThread* pThead1= AfxBeginThread(TheadSend_CPU1,&threadInfo); CWinThread* pThead2= AfxBeginThread(TheadReceive_Ras,&threadInfo);