• 검색 결과가 없습니다.

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

N/A
N/A
Protected

Academic year: 2022

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

Copied!
57
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

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

1

윈도우 소켓 프로그래밍_A_2015버전

※ 한빛미디어의 윈도우 API 프로그래밍, 윈도우 네트워크 프로그래밍, 혜지원 API programming을 참조함!

Updated 2015.11.22

(2)

• 학습목표

– TCP/IP 프로토콜의 개념을 이해하고,

– 윈도우 프로그래밍을 이용한 간단한 채팅 프로그램을 작성하 여 이해도를 높인다.

• 내용

– 소켓 연결

– 메시지 교환

– 논블록킹 통신

– 채팅 프로그램

(3)

1절. 소켓 연결

• 네트워크 응용 프로그램

– 두 개의 독립된 프로그램이 서로 정보를 교환

• 소켓 통신 방법

– 정보를 교환하기 위한 일반적으로 사용하는 방법

– 소켓은 IP주소와 포트번호로 이루어진 컴퓨터 통신의 끝점으로 표준화된 인터페이스를 제공

• 윈도우즈 소켓을 이용을 위한 환경 설정

– 윈도우 소켓을 윈속(Winsock)이라 부름

– 프로젝트 환경에 라이브러리 ws2_32.lib를 추가해 주어야 함

(4)

TCP 서버/클라이언트 동작 원리 (1/3)

TCP 서버/클라이언트 동작 방식

TCP 서버 TCP 클라이언트

listen accept

recv send

connect send recv 네트워크

웹 클라이언트

웹 서버 GET / HTTP/1.1

Accept: image/gif, ... <HTML>

<HEAD>...</HEAD>...

웹 클라이언트

TCP 서버/클라이언트 예

(5)

TCP 서버/클라이언트 동작 원리 (2/3)

TCP 서버/클라이언트 동작 방식 (cont’d)

① 서버는 먼저 실행하여 클라이언트가 접속하기를 기다린다(listen).

② 클라이언트가 서버에게 접속(connect)하여 데이터를 보낸다(send).

③ 서버는 클라이언트 접속을 수용하고(accept), 클라이언트가 보낸 데이터를 받아 서(recv) 처리한다.

④ 서버는 처리한 데이터를 클라이언트에게 보낸다(send).

⑤ 클라이언트는 서버가 보낸 데이터를 받아서(recv) 자신의 목적에 맞게 사용한다.

(6)

TCP 서버/클라이언트 동작 원리 (3/3)

TCP 서버/클라이언트 동작 원리

TCP 서버 대기

TCP 서버

TCP 클라이언트 #1

클라이언트 접속

TCP 서버

TCP

클라이언트 #1 TCP 클라이언트 #2 통신 대기 통신 TCP 서버

TCP 클라이언트 #1

통신 대기

TCP 클라이언트 TCP 서버

fgets() send()

printf()

recv() printf()

send() recv()

(7)

TCP 서버/클라이언트 분석

소켓 데이터 구조체

서버

지역 IP 주소 지역 포트 번호 원격 IP 주소 원격 포트 번호

클라이언트

지역 IP 주소 지역 포트 번호 원격 IP 주소 원격 포트 번호 애플리케이션

운영체제

네트워크

• • • • • •

(8)

TCP 서버 함수 (1/4)

TCP 서버 함수

socket() bind()

recv() send() closesocket()

socket()

send() recv() closesocket()

TCP 서버 TCP 클라이언트

connect() listen()

accept()

네트워크

(9)

TCP 서버 함수 (2/4)

bind() 함수

– 서버의 지역 IP 주소와 지역 포트 번호를 결정

int bind (

SOCKET s,

const struct sockaddr* name, int namelen

) ;

성공: 0, 실패: SOCKET_ERROR

(10)

TCP 서버 함수 (3/4)

listen() 함수

– 소켓과 결합된 TCP 포트 상태를 LISTENING으로 변경

int listen (

SOCKET s, int backlog ) ;

성공: 0, 실패: SOCKET_ERROR

(11)

TCP 서버 함수 (4/4)

accept() 함수

– 접속한 클라이언트와 통신할 수 있도록 새로운 소켓을 생성하여 리턴 – 접속한 클라이언트의 IP 주소와 포트 번호를 알려줌

SOCKET accept ( SOCKET s,

struct sockaddr* addr, int* addrlen

) ;

성공: 새로운 소켓, 실패: INVALID_SOCKET

(12)

TCP 클라이언트 함수 (1/2)

TCP 클라이언트 함수

socket() bind()

recv() send() closesocket()

socket()

send() recv() closesocket()

TCP 서버 TCP 클라이언트

connect() listen()

accept()

네트워크

서버 소켓 생성 IP, Port 할당

클라이언트 접속 대기

접속 허용 접속 시도

응답 요청

클라이언트 접속 종류 listen( ) 소켓 종료

클라이언트 소켓 종료

(13)

TCP 클라이언트 함수 (2/2)

connect() 함수

– 서버에게 접속하여 TCP 프로토콜 수준의 연결 설정

int connect ( SOCKET s,

const struct sockaddr* name, int namelen

) ;

성공: 0, 실패: SOCKET_ERROR

(14)

데이터 전송 함수 (1/4)

소켓 데이터 구조체

서버

지역 IP 주소 지역 포트 번호 원격 IP 주소 원격 포트 번호

클라이언트

지역 IP 주소 지역 포트 번호 원격 IP 주소 원격 포트 번호 애플리케이션

운영체제

네트워크

• • • • • •

수신 버퍼 송신 버퍼

(15)

데이터 전송 함수 (2/4)

send() 함수

– 애플리케이션 데이터를 송신 버퍼에 복사함으로써 궁극적으로 하부 프로토콜(예 를 들면, TCP/IP)에 의해 데이터가 전송되도록 함

int send (

SOCKET s,

const char* buf, int len,

int flags );

성공: 보낸 바이트 수, 실패: SOCKET_ERROR

(16)

데이터 전송 함수 (3/4)

recv() 함수

– 수신 버퍼에 도착한 데이터를 애플리케이션 버퍼로 복사

int recv (

SOCKET s, char* buf, int len, int flags );

성공: 받은 바이트 수 또는 0(연결 종료시), 실패: SOCKET_ERROR

(17)

데이터 전송 함수 (4/4)

recv() 함수 동작 원리

buf

ptr left

buf len

ptr left

len

읽은 데이터

(18)

소켓통신을 위한 자료구조 (1/2)

윈도우 소켓 초기화 정보를 가지고 있는 구조체(정보 얻어 옴)

struct WSAData {

WORD wVersion; // 윈도우 소켓 버전

WORD wHighVersion; // 윈도우 소켓의 가장 높은 버전, 통상적으로 wVersion과 같음

char szDescription[WSADESCRIPTION_LEN+1]; // NULL로 끝나는 문자열.

//적재된 WS2_32.dll에서 소켓에 관련된 설명 문자열을 카피

char szSystemStatus[WSASYSSTATUS_LEN+1]; // 시스템의 각종 상태를 알수 있게 해줌

unsigned short iMaxSockets; // 어플리케이션에서 사용할 소켓의 최대 수 리턴. Version 2부터 무시

unsigned short iMaxUdpDg; // 전송할 수 있는 데이터그램 최대 크기 리턴. Version 2부터 무시

char FAR * lpVendorInfo; // Version 2부터 무시

};

소켓을 연결할 상대방 주소를 쓰는 구조체

struct sockaddr_in{

short sin_family;

unsigned short sin_port;

struct in_addr sin_addr;

char sin_zero[8];

};

(19)

소켓통신을 위한 자료구조 사용 예(2/2)

Winsock 버전 2.2 정보를 wsadata에 얻어옴

// WSAStartup( ) 함수는 윈속 관련 라이브러리를 초기화하고, 그 데이터를 WSADATA에 할당 // 1: 사용할 윈도우 소켓 버전, 2: 소켓 정보 저장 공간

소켓의 통신방법, 주소, 포트 설정

19

127.0.0.1은 loopback 네트웤 접속을 위한 표준 IP어드레스 이다.

 127.0.0.1에 접속하고자 할때 바로 자신의 컴퓨터에 loopback 하게 된다.

(20)

Winsock 사용시작

int WSAStartup(

WORD wVersionRequested, //사용할 윈도우즈 소켓버전(윈속 버전 정보 전달받음)

LPWSADATA lpWSAData //소켓 정보 저장공간 (WSADATA 구조체 변수의 주소 값 전달

);

소켓 생성

SOCKET WSAAPI socket(

int af, //address family 를 명시함, AF_INET 이용

int type, // 소켓의 유형으로 SOCK_STREAM 이용

int protocol // 0을 입력

);

주소와 소켓을 연결하는 함수 BOOL bind (

SOCKET s, // 연결할 소켓

const SOCKADDR* lpSockAddr, // 소켓에 지정될 주소와

// 포트번호를 포함하는 SOCKASSR구조체 주소

int nSockAddrLen // 주소 구조체 SOCKASSR의 크기

소켓통신을 위한 함수(1/3)

(21)

소켓통신을 위한 함수(2/3)

연결요구를 기다리는 함수 BOOL listen(

SOCKET s, // 기다릴 소켓

int nConnectionBacklog // 대기할 수 있는 요구 최대 개수로 1~5

);

연결을 요구하는 함수 BOOL connect(

SOCKET s, // 연결에 사용할 소켓

const SOCKADDR* lpSockAddr, // 상대방의 주소 및 포트번호

int nSockAddrLen // 주소 구조체 SOCKASSR의 크기

);

(22)

소켓통신을 위한 함수(3/3)

연결요구를 받아들이는 함수 SOCKET accept(

SOCKET s, // 소켓에 대한 요구를 받아들임 SOCKADDR* lpSockAddr,

// 접속하는 상대방의 주소를 저장할 SOCKASSR구조체 주소 int* lpSockAddrLen // 주소 구조체 SOCKASSR의 크기 );

소켓과 관련된 리소스를 해제하는 함수 int closesocket(SOCKET s);

Winsock 사용 끝 int WSACleanup( );

(23)

소켓프로그래밍 환경 설정

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

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

(24)

실습 1: 서버) 서버 프로그램 작성.

1. VS 2015 수행 후, Win32 Project 생성

프로젝트 네임: socket_Server_1

Empty project 선택

ws2_32.lib 옵션 설정 (강의 자료 p.23 참조) 2. socket_Server_1.cpp 파일을 생성한다.

3. socket_Server_1.cpp 파일에 강의 자료 25~26페이지 내용을 작성

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

※ 소켓을 이용하여 서버와 클라이언트를 연결

하는 코드를 작성한다.

이 때,

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

(25)

실습 1: socket_Server_1) 접속을 기다리는 서버 (1/2)

(26)

실습 1: socket_Server_1) 접속을 기다리는 서버 (2/2)

(27)

1. VS 2010 수행 후, Win32 Application 프로젝트 생성

프로젝트 네임: socket_Client_1

Empty project 선택

ws2_32.lib 옵션 추가 및 멀티바이트 설정 (강의 자료 p.23 참조) 2. socket_Client_1.cpp 파일을 추가한다.

3. socket_Client_1.cpp 에 강의 자료 28페이지 내용을 작성

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

실습 1: 클라이언트) 클라이언트 프로그램 작성.

(28)

실습 1: socket_Client_1)

접속하는 클라이언트

(29)

실습 1 실행) Server_1 과 Client_1 실행

- 코딩을 완료한 후 다음 과정을 수행!

1) 서버 실행 파일인 socket_Server_1.exe 를 실행한다.

서버는 클라이언트 접속을 대기 중인 상태가 됨!

2) 클라이언트 실행파일인 socket_Client_1.exe 를 실행한다.

다음과 같은 화면이 나오는지 확인.

클라이언트가 접속했을 때 서버에서 띄우는 메시지 박스

• 현재는 접속만 하도록 했기 때문에, 접속 확인 메시지 박스만 출력 됨!

(30)

2절. 메시지 교환 (1/4)

메시지 전송 함수

int send(

SOCKET s, // 연결된 소켓

const void* lpBuf, // 보낼 메시지가 저장된 버퍼 int nBufLen, // 메시지의 길이

int nFlags // 0을 이용 );

메시지 수신 함수

int recv(

SOCKET s, // 연결된 소켓

void* lpBuf, // 받는 메시지가 저장될 버퍼 int nBufLen, // 버퍼의 길이

int nFlags // 0을 이용 );

(31)

2절. 메시지 교환 (2/4)

소켓통신: ANSI (multi-byte) 코드로 인코딩 되어 있음

- 즉, unicode 모드로 작성되어, 유니코드로 정보를 전달받게 되면 문제 발생 - 따라서, Unicode 정보를 Multi-byte로 변경하여 사용해야 함!

- 보낼 때 Multi-byte로 변환: WideCharToMultiByte( ) - 받고 나서는 Unicode로 변환: MultiByteToWideChar( )

(32)

2절. 메시지 교환 (3/4)

WideCharToMultiByte( ): Unicode  Multi-byte

 Unicode  Multi-byte 예제 int msgLen;

WCHAR str[] = _T(“유니코드 문자열”);

msgLen = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);

char buffer[100];

WideCharToMultiByte(CP_ACP, 0, str, -1, buffer, msgLen, NULL, NULL);

// ANSI 문자열에 대한 언어, CP_ACP // 사용하지 않음, 0

// 변환하려는 유니코드 문자열

// 문자열의 길이, -1이면 함수가 자동 계산 // 멀티 바이트로 변환 후 저장될 공간 // 변환 후 문자열의 길이

// NULL // NULL

(33)

2절. 메시지 교환 (4/4)

MultiByteToWideChar( ): Multi-byte  Unicode

33

 Multi-byte Unicode 예제 int msgLen;

char buffer[] = “멀티바이트 문자열”;

msgLen = MultiByteToWideChar(CP_ACP, 0, buffer, strlen(buffer), NULL, NULL);

WCHAR wbuffer[100];

MultiByteToWideChar(CP_ACP, 0, buffer, strlen(buffer), wbuffer, msgLen);

// ANSI 문자열에 대한 언어, CP_ACP // 사용하지 않음, 0

// 변환하려는 멀티바이트 문자열

// 문자열의 길이, -1이면 함수가 자동 계산 // 유니코드로 변환 후 저장될 공간

// 유니코드로 변환 후 문자열의 길이

(34)

실습 2: 서버) 서버 프로그램 작성.

1. VS 2015 수행 후, Win32 Project 생성

프로젝트 네임: socket_Server_2

Empty project 선택

 ws2_32.lib 옵션 설정 (강의 자료 p.23 참조) 2. socket_Server_2.cpp 파일을 생성한다.

3. socket_Server_2.cpp 파일에 강의 자료 32~33페이지 내용을 작성 – socket_Server_1.cpp 를 이용해도 됨.

4. 빌드

까지만 수행 한다.

※ 소켓을 이용하여 서버와 클라이언트를 연결

하는 코드를 작성한다.

이 때,

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

(35)

실습 2: socket_Server_2) 메시지 수신 추가 (1/3)

(36)

실습 2: socket_Server_2) 메시지 수신 추가 (2/3)

(37)

실습 2: socket_Server_2) 메시지 수신 추가 (3/3)

(38)

1. VS 2015 수행 후, Win32 Application 프로젝트 생성

프로젝트 네임: socket_Client_2

Empty project 선택

ws2_32.lib 옵션 설정 (강의 자료 p.23 참조) 2. socket_Client_2.cpp 파일을 추가한다.

3. socket_Client_2.cpp 에 강의 자료 36페이지 내용을 작성

4. 빌드

까지만 수행 한다.

실습 2: 클라이언트) 클라이언트 프로그램 작성.

※ 클라이언트에서 서버로 메시지를 보내는 코드를 작성한다.

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

(39)

실습 2: socket_Client_2) 서버 접속 후 메시지 송신

(40)

실습 2 실행) Server_2 와 Client_2 실행

- 코딩을 완료한 후 다음 과정을 수행!

1) 서버 실행 파일인 socket_Server_2.exe 를 실행한다.

서버는 클라이언트 접속을 대기 중인 상태가 됨!

2) 클라이언트 실행파일인 socket_Client_2.exe 를 실행한다.

다음과 같은 화면이 나오는지 확인.

클라이언트가 서버에게 보낸 메시지 “안녕하세요 Server!” 가 메시지 박스에 나온다.

• 현재는 접속만 하도록 했기 때문에, 접속 확인 메시지 박스만 출력 됨!

(41)

3절. 실제 윈도우 화면에서 메시지 교환

2절-1에서 작성한 코드는 윈도우 화면이 아닌, 서버측에서 메시지 박스로 그 내용을 출력!

본 3절에서는 해당 메시지를 서버의 윈도우 화면에 출력하고자 한다!!!

클라이언트 윈도우에서 ‘키보드 (아무) 키를 누름’  메시지 서버에 전송

(42)

실습 3: 서버) 서버 프로그램 작성.

1. VS 2015 수행 후, Win32 Project 생성

프로젝트 네임: socket_Server_3

Empty project 선택

ws2_32.lib 옵션 설정 (강의 자료 p.23 참조) 2. socket_Server_3.cpp 파일을 생성.

3. 3_server_txt.txt 파일의 내용을 socket_Server_3.cpp 에 복사

4. socket_Server_3.cpp 파일에 강의 자료 43~45페이지 내용을 추가로 작성

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

※ 클라이언트에서 서버로 보낸 메시지를 서버의 화면(윈도우)에 출력!!!

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

(43)

실습 3: socket_Server_3) 윈도우에 메시지 출력 (1/3)

(44)

실습 3: socket_Server_3) 윈도우에 메시지 출력 (2/3)

// 윈도우가 생성되면 // 서버용 소켓을 만들고 // 서버 주소는 127.0.0.1

// 포트 번호는 20에서 클라이언트 접속 대기

// 주의: 클라이언트가 접속하지 않으면 // 서버 소켓은 기다리고, 윈도우를 화면에 // 출력하지 않음

// 클라이언트가 접속하면, accept( ) 함수가 // INVALID_SOCKET인지 검사

// INVALID가 아니면 도착한 데이터를 // 배열buffer에 저장

(45)

실습 3: socket_Server_3) 윈도우에 메시지 출력 (3/3)

// buffer 도착한 정보가

// multi-byte이면 그대로 진행하고 // unicode정보였다면

// unicode로 변환하여 저장

// 받은 메시지를 윈도우 화면 // 0,0 위치에 출력

(46)

1. VS 2015 수행 후, Win32 Application 프로젝트 생성

프로젝트 네임: socket_Client_3

Empty project 선택

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

2. socket_Client_3.cpp 파일을 추가한다.

3. 강의 자료에 첨부한 3_client_txt.txt 의 내용을 socket_Client_3.cpp 로 복사한다.

4. socket_Client_3.cpp 에 강의 자료 47-48페이지 내용을 작성

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

실습 3: 클라이언트) 클라이언트 프로그램 작성.

※ 클라이언트에서 서버로 보낸 메시지를 서버의 화면(윈도우)에 출력!!!

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

(47)

실습 3: socket_Client_3) 윈도우 환경 메시지 송신(1/2)

(48)

실습 3: socket_Client_3) 윈도우 환경 메시지 송신(2/2)

(49)

실습 3 실행) Server_3 와 Client_3 실행

1) 서버 실행 파일인 socket_Server_3.exe 를 실행한다.

2) 클라이언트 실행파일인 socket_Client_3.exe 를 실행한다.

• Client 3 이라는 윈도우 창이 팝업됨.

• 팝업된 윈도우가 선택된 상태에서 키보드의 어떤 키든 누른다.

3) 클라이언트에서 키보드를 누르면 메시지 “Hello Server”를 서버에게 보냄

• 화면에 Hello Server!를 출력하는 서버 창이 팝업 됨!

(50)

지금까지 통신의 문제점

• 클라이언트측에서 접속을 할 때 까지 서버측 프로그램은 무한정 기다림

• 접속이 되었다 하더라도 클라이언트측에서 메시지를 보내기 까지 메시지를 받는 서버측 은 무한정 기다림

• 기다리는 동안 서버는 아무런 일도 할 수 없음

• 논블록킹 통신

으로 문제 해결

(51)

4절. 논블록킹 통신

1. 네트워크 이벤트 발생시 사용자(프로그래머)가 정의한 메시지를 사용할 수 있 도록 #define 추가

#define WM_ASYNC WM_USER+2

2. 논블록킹으로 처리할 윈도우 메시지나 네트워크 이벤트를 WSAAsyncSelect()를 이용하여 등록

int WSAAsyncSelect(

SOCKET s, // 연결된 소켓

HWND hwnd, // 메시지가 발생하는 윈도우의 핸들 unsigned int iMsg, // 등록될 윈도우 메시지 long IEvent // 등록될 네트워크 이벤트

);

51

(52)

4절. 네트워크 이벤트

WM_ASYNC는 특정 네트워크 이벤트 발생 시 ‘윈도우 메시지’로 사용할 수

있도록 한다.

사용 가능한 네트워크 이벤트는 다음과 같다.

– FD_READ: read를 할 준비가 되면 발생시키는 이벤트

– FD_WRITE: read될 데이터가 사용가능 하면 발생시키는 이벤트 – FD_OOB: out-of-band 데이터가 도착하면 발생시키는 이벤트 – FD_ACCEPT: 접속을 요구하는 신호가 오면 발생시키는 이벤트 – FD_CONNECT: 접속이 완료되면 발생시키는 이벤트

– FD_CLOSE: 상대방이 접속을 종료하면 발생시키는 이벤트

(53)

실습 4: 서버) 논블럭킹 수신용 서버 프로그램

1. VS 2015 수행 후, Win32 Project 생성

프로젝트 네임: socket_Server_4

Empty project 선택

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

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

3. 강의 자료에 첨부한 4_sever_txt.txt 의 내용을 socket_Server_4.cpp 로 복사한다.

4. socket_Server_4.cpp 파일에 강의 자료 54~56페이지 내용을 추가로 작성

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

※ 서버가 클라이언트의 접속 및 메시지를 받기 위해, 계속 대기 하지 않는다!!!

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

클라이언트 프로그램

은 이전 socket_Client_3 과 동일하다.

따라서, 프로젝트를

socket_Client_4

로 생성한 후 ws2_32.lib 옵션 설정,

socket_Client_3.cpp 파일을 해당 프로젝트에 복사 후 existing Item 선택  이름 변경  프로젝트 클래스 이름 변경 빌드까지만 수행! 후 이용!

(54)

실습 4: socket_Server_4) 논블록킹 수신용 서버 프로그램 (1/3)

// define 문 추가

(55)

실습 4: socket_Server_4)

논블록킹 수신용 서버 프로그램 (2/3)

(56)

실습 4: socket_Server_4) 논블록킹 수신용 서버 프로그램 (3/3)

(57)

1) socket_Server_4.exe 를 실행한다.

• Server 4 윈도우 팝업

2) socket_Client_4.exe 를 실행한다.

• Client 4 윈도우 팝업

3) 클라이언트 창에서 키보드 누름

• 서버 윈도우 화면에 문장 출력됨.

• 눈으로 보이는 것은 이전 실습 3의 결과와 다르지 않지만, 서버가 한 프로그램 을 위해서 계속 대기하지 않는다!라는 것은 중요한 사실!

57

실습 4 실행) Server_4 와 Client_4 실행

※ 실습 3)의 결과와 비슷해 보이지만, 실습 3)은 클라이언트가 접속해 올 때까지 서버는 기다려야 한다.

따라서, 블록된 상태에서 멈추므로 서버 윈도우가 나타나지 않는다.

반면, 실습4)에서는 클라이언트가 접속해 오면 통지를 하라고 설정해두고 서버 자신은 다른 일을 처리

참조

관련 문서

프로그래밍

프로그래밍

 흰색 윈도우에서 마우스 왼쪽 버튼을 누르면 검은색 윈도우의 타이 틀을 “World”에서 “Black”로 변경하자!.  HINT: 검은색

• LabVIEW MathScript: 텍스트 기반 언어이며 MathScript 윈도우 또는 노드에 서 사용핛 함수와 스크립트를 작성.. • 도구 &gt; MathScript

◈ _messageEntries: 각 메시지 종류에 따라서 메시지 식별 번호, Function Pointer 등을 가 지는 엔트리의 Array. ◈ messageMap: 기반 클래스의 messageMap에 대한

실제 백종원 대표가 체험을 하는 과정에서 문제가 발견될 경우 바로바로 지적을 하고, 그 모습을 식당 사장님들은 본부에서 모니터 화면을 통해 보기 때문에

또한 공공 데이터포털에서 제공하는 다양한 오픈 API 데이터를 이용하여 우리 생활에서 활용할 수 있는 방법을, 디자인 씽킹 과정을 통해 창의적인 설계를 할

알버트 움직임 명령어를 다음과 같이 바꿔보세요.