Click here to load reader

9장 윈도우 소켓 프로그래밍contents.kocw.net/KOCW/document/2015/korea_sejong/... · 2016-09-09 · IT CookBook, 윈도우 APIAPI 프로그래밍 1 윈도우 소켓 프로그래밍

  • View
    3

  • Download
    0

Embed Size (px)

Text of 9장 윈도우 소켓 프로그래밍contents.kocw.net/KOCW/document/2015/korea_sejong/... ·...

  • IT CookBook, 윈도우 API 프로그래밍 IT CookBook, 윈도우 API 프로그래밍

    1

    윈도우 소켓 프로그래밍 2015_B

    ※ 한빛미디어의 윈도우 API 프로그래밍과 윈도우 네트워크 프로그래밍을 참조함 Updated 2015. 11.25

  • 소켓프로그래밍 환경 설정

    • 프로젝트 생성 직후: 1) [프로젝트]Properties [속성],

    • 팝업창에서: 1) Linker Command Line (명령줄), 2)) Additional Options에 ws2_32.lib 추가

    2

  • 실습 5) 논블록킹 양방향 통신 프로그램.

    ※ 서버에서도 클라이언트에 메시지를 보낼 수 있도록 변경한다!!!

    이 때, 서버용 프로그램과 클라이언트용 프로그램은 각각 작성함!

    3

  • 1. VS 2015 수행 후, Win32 Project 생성 (서버용)

    프로젝트 네임: socket_Server_5

    An Empty project 선택

    ws2_32.lib 옵션 설정 (강의 자료 p.2 참조)

    2. socket_Server_5.cpp 파일을 생성한다.

    3. 기존 작성한 socket_Server_4.cpp 의 내용을 socket_Server_5.cpp 로 복사

    4. 강의 자료 6페이지 내용을 socket_Server_5.cpp에 추가로 작성한다.

    5. 빌드까지만 수행 한다.

    4

    실습 5: 서버) 논블럭킹 양방향 통신 서버

    ※ 논블록킹 양방향 통신(서버 프로그램 작성)

  • 5

    // WM_KEYDOWN 부분 코드만 추가!

    // 서버 윈도우 창에서 키보드가 눌려지면

    // 클라이언트에 “Hi Client!”가 전달됨

    실습 5: socket_Server_5) 논블록킹 송수신용 서버.

    // WM_KEYDOWN: 부분을 추가한다!

  • 1. VS 2015 수행 후, Win32 Project 생성 (클라이언트용)

    프로젝트 네임: socket_Client_5

    An Empty project 선택

    ws2_32.lib 옵션 설정 (강의 자료 p.2 참조)

    2. socket_Client_5.cpp 파일을 생성한다.

    3. 실습 4의 socket_Client_4.cpp 내용을 socket_Client_5.cpp 로 복사한다.

    4. 강의 자료 7~9페이지 내용을 socket_Client_5.cpp 에 추가로 작성한다.

    5. 빌드까지만 수행 한다.

    ※ 논블록킹 양방향 통신(클라이언트 프로그램 작성)

    6

    실습 5: socket_Client_5) 논블록킹 양방향 통신

  • 실습 5: socket_Client_5) 논블록킹 송수신 클라이언트(1/3)

    7

    // 코드 상단의 전역 변수 선언 구간에 다음을 추가

    // WndProc( ) 변수 선언 부분에 코드 추가

  • 8

    // WM_CREATE: 코드 추가 and WM_PAINT: 코드 추가

    // 서버에서 보낸 데이터를 받기 위하여

    // FD_READ 이벤트에 대해

    // WM_ASYNC 윈도우 메시지를 등록

    // 서버에서 보낸 메시지를 msg에 저장하여

    // 그 내용을 화면에 출력

    실습 5: socket_Client_5) 논블록킹 송수신 클라이언트(2/3)

  • 9

    실습 5: socket_Client_5) 논블록킹 송수신 클라이언트(3/3)

    // 클라이언트 프로그램이 다른 메시지를 처리하는 중

    // 서버에서 데이터를 보내면

    // 윈도우 메시지 WM_ASYNC가 FD_READ와 같이 도착한다.

    // 소켓 s를 서버와의 통신에 사용하므로

    // 소켓 s를 통해 버퍼에 데이터를 읽음.

    // 해당 내용을 화면에 출력하기 위하여

    // 강제로 InvalidateRect( )을 이용해서,

    // WM_PAINT 발생시킴

  • 1) socket_Server_5.exe 실행

    • 서버 윈도우 화면 출력

    2) socket_Client_5.exe 실행

    • 클라이언트 윈도우 화면 출력

    3) 클라이언트 윈도우에서 키보드 메시지 발생 시킴

    • 서버 윈도우에 “안녕 Server!” 출력됨

    4) 서버 윈도우에서 키보드 메시지 발생 시킴

    • 클라이언트 윈도우에 “Hi Client!” 출력됨

    10

    실습 5 실행) Server_5 과 Client_5 실행

  • 실습 6) 간단한 채팅 프로그램.

    ※간단한 채팅 프로그램을 작성해본다!!!

    기존에는 미리 만든 텍스트를 전송, 지금은 타이핑 한 내용을 전송

    이 때, 서버용 프로그램과 클라이언트용 프로그램은 각각 작성함!

    11

  • 1. VS 2015 수행 후, Win32 Project 생성(서버용)

    프로젝트 네임: socket_Server_6

    An Empty project 선택

    ws2_32.lib 옵션 설정 (강의 자료 p.2 참조)

    2. socket_Server_6.cpp 파일을 생성한다.

    3. 6_server_txt.txt 의 내용을 socket_Server_6.cpp 로 복사한다.

    4. 강의 자료 18~22페이지 내용을 socket_Server_6.cpp 에 추가로 작성한다.

    5. 빌드까지만 수행 한다.

    ※ 채팅 프로그램(서버 프로그램 작성)

    12

    실습 6: 서버) 간단한 채팅 프로그램 서버

  • 13

    실습 6: socket_Server_6) 채팅 서버 프로그램 (1/5)

  • 14

    실습 6: socket_Server_6) 채팅 서버 프로그램 (2/5)

    // 윈도우가 생성되면 서버용 소켓을 만들고, 서버 주소 ‘127.0.0.1’, 포트번호 ‘20’에서 클라이언트 접속을 기다린다.

    // 이 때 ‘비동기화’방식을 이용하게 되므로, 클라이언트가 접속하지 않아도 일단 서버 윈도우는 실행된다.

  • 15

    실습 6: socket_Server_6)

    채팅 서버 프로그램 (3/5)

  • 16

    // 서버에서 입력한 내용과 클라이언트에서 받은 문자열을 다른 위치에 출력

    // msg 여부 판단하는 if문 확인

    // 0, 0 위치에 출력되는 것은 무엇일까?

    // 0. 30 위치에 출력되는 것은 무엇일까?

    실습 6: socket_Server_6) 채팅 서버 프로그램 (4/5)

  • 17

    실습 6: socket_Server_6) 채팅 서버 프로그램 (5/5)

    // WM_CHAR 윈도우 메시지가 발생하면

    // ‘enter’키 입력이 들어왔는지 확인 후,

    // ‘enter’키가 아니면 str에 저장

    // ‘enter’이면 소켓을 통해 클라이언트에 전송

  • 1. VS 2015 수행 후, Win32 Project 생성 (클라이언트용)

    프로젝트 네임: socket_Client_6

    An Empty project 선택

    ws2_32.lib 옵션 설정 (강의 자료 p.2 참조)

    2. socket_Client_6.cpp 파일을 생성한다.

    3. 6_Client_txt.txt 의 내용을 socket_Client_6.cpp 로 복사한다.

    4. 강의 자료 19~22페이지 내용을 socket_Client_6.cpp 에 추가로 작성한다.

    5. 빌드까지만 수행 한다.

    ※ 채팅 프로그램(클라이언트 프로그램 작성)

    18

    실습 6: Client) 간단한 채팅 프로그램

  • 실습 6: socket_Client_6) 채팅 클라이언트 (1/4)

    19

  • 20

    실습 6: socket_Client_6) 채팅 클라이언트 (2/4)

    // 클라이언트를 위한 윈도우가

    // 생성되면 먼저 소켓을 생성.

    // 이 소켓을 이용해 서버에

    // 접속 시도(connect)

    // 서버에 보낸 데이터를 받아야 함!

    // FD_READ 이벤트에 대해 WM_ASYNC 윈도우 메시지를 등록

  • 21

    실습 6: socket_Client_6) 채팅 클라이언트 (3/4)

    // 클라이언트 프로그램이 다른 메시지를 처리하는 중

    // 서버에서 데이터를 보내면

    // 윈도우 메시지 WM_ASYNC와 FD_READ가 같이 도착

    // 소켓 s를 서버와의 통신에 사용하므로

    // 소켓 s를 통해 버퍼에 데이터를 읽어 들임.

  • 22

    실습 6: socket_Client_6) 채팅 클라이언트 (4/4)

    // 클라이언트 윈도우에

    // 입력하는 문자정보를 저장하여

    // 화면 출력 및

    // 서버에 전송.

  • 1) 서버 실행 socket_Server_6.exe

    2) 클라이언트 실행 socket_Client_6.exe

    - [클라이언트]에서 먼저 타이핑 후 엔터

    서버 화면 확인!

    - [서버]에서 타이핑 후 엔터

    클라이언트 화면 확인

    • 송신할 메시지는 위에 등장

    • 수신한 메시지는 아래에 출력

    23

    실습 6 실행) Server_6 과 Client_6 실행

    작성 후 엔터 작성 후 엔터

  • 연습문제 1

    • 제목

    서버에서 클라이언트로 그림 보내기

    • 내용

    - 서버에서 직선, 원, 사각형을 선택하여 그릴 수 있다

    - “전송”버튼을 누르면 클라이언트 윈도우에 같은 그림이 나타난다.

    24

  • 연습문제 2

    • 제목

    서버와 클라이언트가 그림 교환하기

    클라이언트에서도 서버로 정보가 전송될 수 있도록, 연습문제 1을 수정한다!

    • 내용

    - 서버, 클라이언트에서 직선, 원, 사각형을 선택하여 그릴 수 있다

    - “전송”버튼을 누르면 상대방 윈도우에 같은 그림이 나타난다.

    25