Window socket programming 네트워크 프로그래밍 강좌
윈도우 소켓 프로그램 Winsock 프로그램의 특징 Win32 console 응용 Win32 응용 MFC 사용 Microsoft 윈도우 운영 체제에서 제공하는 TCP/IP 프로그래밍을 위한 API 기본 동작 및 사용 방법이 BSD 소켓과 유사 Win32 console 응용 유닉스용 소켓 프로그램을 윈도우 환경에서 실행하는 경우에 사용 즉, 유닉스용 소스를 그대로 이용하되 실행 환경만 PC 윈도우로 바꿀 때 필요 --> DOS 스타일 프로그램 Win32 응용 윈도우의 GUI를 이용하는 프로그램 작성 사용자 윈도우를 만들고 소켓 응용 프로그램이 사용자 윈도우와 메시지를 주고 받는 방식으로 작성 --> SDK를 이용하는 프로그램 MFC 사용 Microsoft사에서 제공하는 소켓 클래스를 이용하는 프로그래밍 네트워크 프로그래밍 강좌
윈도우 소켓 프로그램 유닉스 소켓 프로그래밍 : 서버용 프로그램 작성에 주로 사용 라우팅, 네트워크 관리 등이 Unix 컴퓨터에서 주로 실행되므로 Winsock 프로그램 : 다양한 GUI가 필요한 PC영 클라이언트 프로그램에 주로 사용됨 Java 소켓 프로그래밍 : 위의 두 방식처럼 운영 체제에 종속적이 아니라서 임의의 플랫폼에서 실행 가능, 또한 GUI도 편리하게 작성 가능 네트워크 프로그래밍 강좌
Winsock 프로그램 실행 환경 Win32 console 응용 형태로 실행하는 방법 유닉스용 소켓 프로그램과 다른 점 헤더 파일 변경 #include <windows.h> #include <Winsock.h> socket() 시스템 콜 호출 전에 반드시 WSAStartup() 함수를 호출하여 Winsock.dll을 구동해 두어야 함 Winsock.dll은 Winsock API의 각종 기능을 제공하는 라이브러리임 소켓을 닫을 때 close()가 아니라 closesocket() 함수를 사용 Winsock의 사용이 모두 종료되면 WSACleanup() 함수를 호출하여 Winsock.dll 사용의 종료를 알려주어야 함 WSAStartup()에서 필요로 하는 두개의 인자 응용 프로그램이 요구하는 최소의 Winsock 버전 값 시스템이 Winsock 관련 정보를 알려주는데 사용할 WSADATA 타입의 구조체 네트워크 프로그래밍 강좌
Winsock 프로그램 실행 환경 WSAStartup()을 호출하는 코드 WSADATA 구조체의 정의 : page 143 참조 WORD version = MAKEWORD(1,1) WSADATA wsadata; WSAStartup(version, &wsadata); WSADATA 구조체의 정의 : page 143 참조 Winsock, 프로그램 컴파일 : wsock32.lib 필요 Visual-C 6.0을 사용하는 경우 Project-Settings-Link 메뉴의 Library module 끝 부분에 wsock32.lib를 추가 네트워크 프로그래밍 강좌
Winsock의 동작 모드 Blocking mode Non-blocking mode Multitasking이 지원되는 Unix에서는 문제 없음 UNIX와 달리 윈도우 3.1 이하에서는 멀티태스킹을 지원하지 않음 이 경우 blocking mode 사용하면 PC 전체가 block 될 수 있음 Non-blocking mode 함수 호출이 즉시 반환 성공적인 리턴 에러 리턴 : 함수 수행중 에러가 발생했거나 함수가 block WSAEWOULDBLOCK : 에러가 아니라 함수가 동작 완료할 때 까지 기다리면 block될 수 있음을 알리는 것 Winsock.dll이 함수가 원하는 동작을 시작했으나 아직 종료되지 않았음 함수의 동작이 시작되지 못했으며 다시 재 시도를 필요로 함 네트워크 프로그래밍 강좌
Winsock의 동작 모드 Asynchronous mode(비동기) 첫번째 경우 : 응용 프로그램이 함수의 동작 완료 시점을 알아서 그 결과를 처리하여야 함 두번째 경우 : 응용 프로그램이 이 함수가 성공적으로 시작할 때 까지 반복 호출 Asynchronous mode(비동기) 함수의 동작이 완료되면 그 때 Winsock.dll이 메시지를 통하여 동작의 완료를 알려주거나 함수의 동작이 시작하지 못했으면 함수를 다시 호출해야 할 시점을 나중에 비동기 적으로 알려주겠음 윈도우 프로그램에서 윈도우는 objects라고 볼 수 있으며 객체간의 통신은 메시지를 서로 전달함으로써 이루어짐. 비 동기 모드의 Winsock 프로그램은 이러한 윈도우 객체간의 비동기적인 메시지 전달 방식을 이용 Blocking 함수 : 함수 자체의 특성상 블록될 수 있는 함수 네트웍 시스템이(TCP/IP) 어떤 정보를 얻어내야만 그 결과를 반환할 수 있고 이 정보를 얻는데 시간이 걸리는 함수 네트워크 프로그래밍 강좌
Winsock의 동작 모드 네트워크 프로그래밍 강좌
Winsock의 동작 모드 Winsock에서는 Blocking 함수와 같은 기능을 수행하면서 실제로는 비동기 모드로 동작하는 즉, 함수 실행 결과를 비동기적으로 알려주는 비동기 함수들을 제공 네트워크 프로그래밍 강좌
Winsock의 시작과 종료 WSAStartup() WSACleanup() Winsock library인 Winsock.dll을 초기화 일반적으로 윈도우 메시지 WM_CREAT나 WM_INITDIALOG의 처리 부분에서 호출됨 필요로하는 인자 응용 프로그램이 요구하는 최소의 Winsock 버전(1.0 혹은 1.1) 함수가 수행된 후 네트웍 시스템(Winsock.dll)이 Winsock 관련 정보를 알려주는데 사용할 Winsock 정보 구조체 즉, WSADATA 구조체 변수의 주소 WSAStartup()을 호출하는 예 WSACleanup() Winsock의 사용을 종료할 때 호출 네트워크 프로그래밍 강좌
Winsock의 시작과 종료 네트워크 프로그래밍 강좌
Winsock의 동작 함수의 호출 순서와 인자, 결과 리턴 값 : BSD 소켓의 사용법과 거의 유사 Socket() WSAGetLastError() : 가장 최근에 발생한 Winsock 관련 함수의 에러 코드를 반환 네트워크 프로그래밍 강좌
Winsock의 동작 MessageBox() : 메시지 상자를 만들어 화면에 출력하는 윈도우 함수 int MesageBox( HWND : 윈도우 핸들 type이며 주로 int LPCTSTR : long pointer const char string int MesageBox( HWND hWnd, /*윈도우 핸들 */ LPCTSTR lpText, /* 텍스트배열주소 */ LPCTSTR lpCaption, /* 캡션배열주소 */ UINT uType); /* Box style */ 네트워크 프로그래밍 강좌
Winsock의 동작 bind() 네트워크 프로그래밍 강좌
Winsock의 동작 listen() : 수동 모드로 설정 accept() 네트워크 프로그래밍 강좌
Winsock의 동작 connect() 네트워크 프로그래밍 강좌
Winsock의 동작 closesocket() : 사용이 끝난 소켓을 닫기 위해 사용 setsocket() : 개설된 소켓의 동작에 관한 각종 option을 지정하는데 사용 네트워크 프로그래밍 강좌
비동기 모드의 사용 윈도우(특히 버전 3.1)는 multi-tasking이 지원되지 않는 운영체제이므로 어떤 호출이 블록되어 있으면 시스템 전체가 멈춤 소켓을 비동기 모드로 바꾸는 것이 필요 WSAAsyncSelect()를 사용 소켓은 자동으로 비동기 모드로 바뀌고 블록될 수 있는 함수들은 비동기 보드로 처리 : accept(), send(), receive() 등 네트워크 프로그래밍 강좌
비동기 모드의 사용 WSAAsyncSelect()의 반환 값 즉시 반환되며 에러 발생시에는 SOCKET_ERROR를 반환 에러 발생하는 경우 Winsock.dll이 초기화되지 않았거나 네트웍이 동작하지 않거나 다른 blocking 함수가 처리 중이거나 함수의 인자를 잘 못 입력한 경우 에러없이 반환하는 경우 소켓이 비동기 모드로 됨 원하는 이벤트가 발생하면 그 사실이 메시지로 전달될 것임 이 소켓에 accept()가 호출되어 새로운 소켓이 만들어지면 그 소켓도 WSAAsyncSelect() 호출 시 요구한 이벤트를 똑 같이 처리 프로그램이 관심을 갖는 이벤트 즉, 알고싶은 소켓의 상태 변화는 WSAAsyncSelect() 호출 시 IEvent 인자에 지정할 수 있음 네트워크 프로그래밍 강좌
비동기 모드의 사용 WSAAsyncSelect()에서 다루는 이벤트 종류 FD_OOB : 수신측에 도착한 모든 패킷이 순서대로 처리되는데 반해 OOB 데이터는 이 순서를 무시하고 우선적으로 처리됨 ‘Ctrl-C’ 같은 제어문자를 전달하는데 사용됨 네트워크 프로그래밍 강좌
비동기 모드의 사용 이전에 지정한 WSAAsyncSelect()의 각종 옵션을 취소하여 어떤 이벤트 발생에 대한 메시지를 수신하고 싶지 않으면 --> wMsg=0, IEvent=0으로 하여 WSAAsyncSelec()를 다시 호출 소켓 m_s로 클라이언트의 접속 요청 connect()가 접수되어 FD_ACCEPT 이벤트가 발생하면 사용자 메시지(WM_USER+1)를 보내도록 하는 예 WSAAsyncSelect(m_s, m_hWnd, WM_USER+1, FD_ACCEPT) 이벤트의 종류를 알기위하여 IParm를 참조하여야 함 IParm의 하위 16비트 : 발생한 이벤트의 종류가 실려있음 IParm의 상위 16비트 : 에러 코드가 실려있음 네트워크 프로그래밍 강좌
비동기 모드의 사용 네트워크 프로그래밍 강좌
Winsock의 IP 주소 변환 함수 WSAAsyncGetHostByAddr() : hostent 구조체를 반환 네트워크 프로그래밍 강좌
Winsock의 IP 주소 변환 함수 IP 주소가 203.252.65.3인 호스트의 도메인 네임을 메시지 박스에 출력하는 예제 프로그램 네트워크 프로그래밍 강좌
Winsock의 IP 주소 변환 함수 WSAAsyncGetServByName() ftp, mail과 같은 TCP/IP 표준 응용 프로그램의 포트 번호를 찾기 위해 사용되는 비동기 함수 성공적 수행 시 servent라는 구조체의 포인터를 반환 네트워크 프로그래밍 강좌
Winsock의 IP 주소 변환 함수 UDP 프로토콜로 구현된 time 서비스의 포트 번호를 찾아내어 화면에 출력하는 예 네트워크 프로그래밍 강좌
Winsock의 IP 주소 변환 함수 WSAAsyncGetHostByName() 네트워크 프로그래밍 강좌
Winsock 채팅 서버 PC에서 Winsock을 사용한 채팅 서버 구현 네트워크 프로그래밍 강좌
프로그램 주요 부분 헤더 파일 전역 변수 Server.h : 화면 구성 정보를 가지고 있는 리소스 파일 Windows.h : 원도우 응용 프로그램의 master 헤더 파일 Winsock.h : winsock 관련 상수 및 함수 선언 전역 변수 네트워크 프로그래밍 강좌
프로그램 주요 부분 WinMain() 함수 DialogueBox를 메인 원도우로 사용 CreateDialog() : 대화 상자를 생성 GetMessage() : 대화상자에 도착하는 메시지를 받아 이를 처리 네트워크 프로그래밍 강좌
프로그램 주요 부분 메시지 처리 메시지의 처리는 HandleDialog() 함수에서 처리 WM_INITDIALOG : DialogBox 생성 시 발생, 이메시지 발생하면 전역 변수들과 Winsock을 초기화하고 클라이언트의 연결 요청을 기다리기 위해 InitSocket()을 수행 InitSocket() 함수에서는 WSAStartup() 시스템 콜을 호출하여 Winsock.dll을 초기화 WM_COMMAND : 메뉴, 리스트박스, 버튼, 체크박스등에서 발생하며 사용자가 종료버튼을 클릭할 때만 발생 wParm은 이러한 여러 종류의 메시지를 구분하는 파라미터이고 , IDC_EXIT는 종료 버튼 ID임 WM_DESTROY : 윈도우가 종료될때 내부적으로 발생 WM_ASYNC : 소켓을 통하여 데이터를 비동기 모드로 처리하는데 사용 메시지의 처리는 HandleDialog() 함수에서 처리 네트워크 프로그래밍 강좌
프로그램 주요 부분 네트워크 프로그래밍 강좌
프로그램 주요 부분 WM_INITDIALOG 및 WM_COMMAND의 처리 네트워크 프로그래밍 강좌
프로그램 주요 부분 WM_DESTROY의 처리 DestroyWindow()에 의해 윈도우에서 내부적으로 발생되는 메시지 PostQuitMessage()는 윈도우 메시지 큐에 종료 메시지를 전송하는 함수 네트워크 프로그래밍 강좌
프로그램 주요 부분 WM_ASYNC의 처리 비동기 모드로 호출할 소켓 Accept()를 비동기적으로 처리 : 초기화 소켓인 m_sAccept 각 클라이언트들과 채팅 메시지를 비동기적으로 송수신 : m_sClient[] WSAAsyncSelect(m_sAccept,m_hWnd,WM_ASYNC,FD_ACCEPT) M_hWnd : FD_ACCEPT 이벤트 발생 시 메시지를 받을 윈도우 핸들 WM_ASYNC : 전송할 메시지 네트워크 프로그래밍 강좌
프로그램 주요 부분 WM_ASYNC 메시지 발생 시 어느 소켓이 이 메시지를 발생시켰는지 확인하는 프로그램 네트워크 프로그래밍 강좌
프로그램 주요 부분 데이터 송수신 WM_ASYNC 발생 시 소켓에서 발생한 이벤트의 구체적인 내용인 IParm 파라미너에 있음 네트워크 프로그래밍 강좌
프로그램 주요 부분 네트워크 프로그래밍 강좌
Wchat_Server.c 프로그램 리스트 네트워크 프로그래밍 강좌
Wchat_Server.c 프로그램 리스트 네트워크 프로그래밍 강좌
Wchat_Server.c 프로그램 리스트 네트워크 프로그래밍 강좌
Winsock 채팅 클라이언트 사용자가 키보드에서 입력한 문자열을 서버에 전송하고, 서버가 보내온 메시지를 화면에 출력하는 프로그램 네트워크 프로그래밍 강좌
프로그램 주요부분 설명 헤더 파일과 전역 변수 네트워크 프로그래밍 강좌
프로그램 주요부분 설명 WM_INITDISLOG의 처리 Winsock의 초기화(InitSocket())와 에디트 컨트롤 서브클래싱(subclassing)을 수행 네트워크 프로그래밍 강좌
프로그램 주요부분 설명 Subclassing 클라이언트 프로그램 : DialogBox로부터 실행이 시작, 에디트컨트롤(edit control)을 통하여 데이터를 입력 받음 에디트컨트롤에서는 사용자가 리턴(‘\n’)까지 입력한 문자를 받아, 사용자 정의 메시지인 WM_ASYNC를 이용하여 처리하며 이를 위하여 subclassing을 이용 Subclassing은 윈도우에서 수행되던 프로시져를 사용자 정의 프로시져로 연결하여 원하는 작업을 하다가 그 작업이 완료되면 다시 원래의 프로시져로 되돌아 오는 기능을 의미 현재의 프로시져를 OldProc로 잠시 저장하고 사용자 프로시져인 EditProc를 등록하는 예제 OldProc = (WNDPROC) SetWindowLong(GetDlgItem(hWnd,IDC_EDIT), GWL_WNDPROC,(LONG)EditProc); IDC_EDIT : edit control의 ID EditProc : edit control을 처리하기 위해 새로 정의된 프로시져 이름 네트워크 프로그래밍 강좌
프로그램 주요부분 설명 WM_CHAR 메시지 처리 EditProc의 구현 내용 : 사용자가 키보드로 입력하였을 때 발생하는 메시지 WM_CHAR를 처리 네트워크 프로그래밍 강좌
프로그램 주요부분 설명 WM_COMMAND의 처리 “종료” 버튼이 눌릴때 발생하는 메시지로 소켓을 종료하기 위하여 WSACleanup()을 호출하고 윈도우에 종료 메시지 WM_DESTROY를 보내기 위하여 DestroyWindow() 함수를 호출 네트워크 프로그래밍 강좌
프로그램 주요부분 설명 WM_DESTROY의 처리 WM_ASYNC의 처리 DestroyWindow()에 의해 윈도우 내부적으로 발생, 윈도우 종료 시 사용 WM_ASYNC의 처리 네트워크 프로그래밍 강좌
WChat_Client.c 프로그램 리스트 네트워크 프로그래밍 강좌
WChat_Client.c 프로그램 리스트 네트워크 프로그래밍 강좌
WChat_Client.c 프로그램 리스트 네트워크 프로그래밍 강좌