Chapter 02. 윈도우 소켓 시작하기.

Slides:



Advertisements
Similar presentations
12장. Raw 소켓 Raw 소켓의 특징과 사용 방법을 익힌다. Ping 프로그램의 동작 원리를 이해하고 작성 방법을 익힌다.
Advertisements

한남대학교 컴퓨터공학과 소프트웨어공학실험실 최 용 준
Network Lab. Byoung-Son, Choi
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
최윤정 Java 프로그래밍 클래스 상속 최윤정
Network Lab. Young-Chul Hwang
Department of Computer Science and Engineering
윤 홍 란 다이알로그(대화상자) 윤 홍 란
제 9 장 구조체와 공용체.
소켓 모델 주소 지정 in_addr_t inet_addr(const char *ip_address) 연결 지향 모델 (TCP)
4장. 소켓 유형과 프로토콜 Network Lab. 이 원 구 1.
24 장 TCP/IP 24.1 개요 24.2 네트워크층 24.3 주소 지정 24.4 서브넷팅틍
Chapter 03. 소켓 주소 구조체 다루기.
Network Lab. Seoung Hyeon, Lee
조 병 규 Software Quality Lab. 한국교통대학교
Multimedia & Mobile Communications Lab.
제15장 파일 입출력 문자열을 출력하는 여러가지 방법 (15-2쪽) 문자열만 처리하는 입출력 함수
인터넷 주소 변환 School of Electronics and Information. Kyung Hee University.
Department of Computer Engineering
Chapter 02. 윈도우 소켓 시작하기.
한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실
Window socket programming
Department of Computer Engineering
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 7장 소켓 연결의 우아한 종료 인공지능실험실 석사 2학기 이희재
07. 디바이스 드라이버의 초기화와 종료 김진홍
네트워크 프로그래밍 Yang-Sae Moon Department of Computer Science
Chapter 21 Network Layer: ARP, ICMP (IGMP).
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
Homework 6… 12월 2일(금) 11:59pm까지 자신의 이름과 학번을 출력해 주는 유닉스/리눅스 네트워크 소켓 서버 프로그램 과 클라이언트 프로그램 을 작성해 보세요 참고 (실습1) Hello 프로그램 helloserver.c helloclient.c 컴파일.
Chapter 06. UDP 서버/클라이언트.
인공지능실험실 박사 1학기 장성만 TCP/IP Socket Programming… 9장 소켓의 다양한 옵션 인공지능실험실 박사 1학기 장성만
TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.
프로젝트 발표 순서 12/7(수), 팀 별 15분 발표순서 PPT (팀 별 이름, 구현 내용, 결과-그래프 포함) 각 기법당
Department of Computer Science and Engineering
Chapter 03. 소켓 주소 구조체 다루기.
Socket Address Structure and Byte Ordering Functions
Socket Address Structure and Byte Ordering Functions
10장. 예외처리.
11장. 1차원 배열.
UDP Test 프로그램 분석.
13. 연산자 오버로딩.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
Chapter 07. 소켓 옵션.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.
22 장 전송층(Transport Layer)
School of Electronics and Information. Kyung Hee University.
24장. 파일 입출력.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
21 장 전송층(Transport Layer)
데이터베이스실험실 석사 2학기 조정희 TCP/IP Socket Programming… 제 18장 윈도우 기반 쓰레드 사용하기 데이터베이스실험실 석사 2학기 조정희
Department of Computer Engineering
Lab 8 Guide: 멀티스레딩 예제 2 * Critical Section을 이용한 멀티스레딩 동기화 (교재 15장, 쪽)
윤성우의 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판
인터넷 주소변환 School of Electronics and Information. Kyung Hee University.
Fucntion 요약.
Chapter 04. TCP 서버/클라이언트.
3. 모듈 (5장. 모듈).
구조체(struct)와 공용체(union)
인공지능실험실 박사 1학기 장성만 TCP/IP Socket Programming… 제 8장 도메인 이름과 인터네 주소 인공지능실험실 박사 1학기 장성만
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
바이트 순서 변환 함수 주소 변환 함수 바이트 조작 함수 원격지 호스트 정보를 얻는 함수
argc, argv 의 사용방법 #include <stdio.h>
소켓의 생성과 프로토콜의 설정 School of Electronics and Information.
Network Lab. Young-Chul Hwang
13. 포인터와 배열! 함께 이해하기.
Presentation transcript:

Chapter 02. 윈도우 소켓 시작하기

학습 목표 윈속 함수의 오류 처리 방법을 익힌다. 윈속 초기화와 종료 방법을 익힌다. 소켓을 생성하고 닫는 방법을 익힌다.

오류 유형 ① 오류를 처리할 필요가 없는 경우 ② 리턴값만으로 오류를 처리하는 경우 윈속 함수 오류 처리 (1/2) 오류 유형 ① 오류를 처리할 필요가 없는 경우 리턴값이 없거나 호출시 항상 성공하는 일부 소켓 함수 ② 리턴값만으로 오류를 처리하는 경우 WSAStartup() 함수 ③ 리턴값으로 오류 발생을 확인하고, 구체적인 내용은 오류 코드를 이용하여 확인하는 경우 대부분의 소켓 함수

오류 코드 얻기 사용 예 윈속 함수 오류 처리 (2/2) int WSAGetLastError (void) ; if (소켓함수(...) == 오류) { int errcode = WSAGetLastError(); printf(errcode에 해당하는 오류 메시지); }

FormatMessage() 함수 오류 코드를 문자열로 바꾸기 (1/4) DWORD FormatMessage ( DWORD dwFlags, // ① 옵션 LPCVOID lpSource, // NULL DWORD dwMessageId, // ② 오류 코드 DWORD dwLanguageId, // ③ 언어 LPTSTR lpBuffer, // ④ 오류 문자열 시작 주소 DWORD nSize, // 0 va_list* Arguments // NULL ) ; 성공: 오류 메시지의 길이, 실패: 0

err_quit() 함수 정의 오류 코드를 문자열로 바꾸기 (2/4) #include <winsock2.h> #include <stdlib.h> void err_quit(char *msg) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER| FORMAT_MESSAGE_FROM_SYSTEM, NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL); MessageBox(NULL, (LPCTSTR)lpMsgBuf, msg, MB_ICONERROR); LocalFree(lpMsgBuf); exit(-1); }

err_quit() 함수 사용 예 오류 출력 화면 오류 코드를 문자열로 바꾸기 (3/4) if (socket(...) == SOCKET_ERROR) err_quit("socket()"); if (bind(...) == SOCKET_ERROR) err_quit("bind()"); err_quit() 함수에 전달한 문자열 오류 코드에 해당하는 문자열

err_display() 함수 정의 오류 코드를 문자열로 바꾸기 (4/4) #include <winsock2.h> #include <stdlib.h> void err_display(char *msg) { LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER| FORMAT_MESSAGE_FROM_SYSTEM, NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL); printf("[%s] %s", msg, (LPCTSTR)lpMsgBuf); LocalFree(lpMsgBuf); }

윈속 초기화 함수 wVersionRequested lpWSAData 윈속 초기화와 종료 (1/3) 프로그램이 요구하는 최상위 윈속 버전. 하위 8비트에 주(major) 버전을, 상위 8비트에 부(minor) 버전을 넣어서 전달함 lpWSAData WSADATA 타입 변수의 주소. 시스템에서 제공하는 윈속 구현에 대한 세부 사항을 얻을 수 있음 int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData ) ; 성공: 0, 실패: 오류 코드

윈속 종료 함수 윈속 초기화와 종료 (2/3) int WSACleanup (void) ; 성공: 0, 실패: SOCKET_ERROR

예제 코드(InitWinsock.cpp): 교재 페이지 55 윈속 초기화와 종료 (3/3) 예제 코드(InitWinsock.cpp): 교재 페이지 55 #include <winsock2.h> int main(int argc, char* argv[]) { // 윈속 초기화 WSADATA wsa; if(WSAStartup(MAKEWORD(2,2), &wsa) != 0) return -1; MessageBox(NULL, "윈속 초기화 성공", "성공", MB_OK); // 윈속 종료 WSACleanup(); return 0; }

소켓 생성과 닫기 (1/6) 소켓 생성 함수 사용자가 요청한 프로토콜을 이용하여 통신을 할 수 있도록 내부적으로 리소스를 할당하고, 이를 접근할 수 있는 일종의 핸들값(SOCKET 타입, 32비트 정수)인 소켓 디스크립터(socket descriptor)를 리턴 SOCKET socket ( int af, // 주소 체계 int type, // 소켓 타입 int protocol // 프로토콜 ) ; 성공: 새로운 소켓, 실패: INVALID_SOCKET

소켓 생성과 닫기 (2/6) 주소 체계 #define AF_UNIX 1 /* local to host (pipes, portals) */ #define AF_INET 2 /* internetwork: UDP, TCP, etc. */ #define AF_IMPLINK 3 /* arpanet imp addresses */ #define AF_PUP 4 /* pup protocols: e.g. BSP */ #define AF_CHAOS 5 /* mit CHAOS protocols */ #define AF_NS 6 /* XEROX NS protocols */ #define AF_IPX AF_NS /* IPX protocols: IPX, SPX, etc. */ #define AF_ISO 7 /* ISO protocols */ #define AF_OSI AF_ISO /* OSI is ISO */ ...

소켓 타입 사용할 프로토콜의 특성 소켓 생성과 닫기 (3/6) 예) TCP와 UDP 프로토콜 설정(1) 소켓 타입 특성 SOCK_STREAM 신뢰성 있는 데이터 전송 기능 제공 연결형 프로토콜 SOCK_DGRAM 비신뢰적인 데이터 전송 기능 제공 비연결형 프로토콜 사용할 프로토콜 주소 체계 소켓 타입 TCP AF_INET SOCK_STREAM UDP SOCK_DGRAM

프로토콜 주소 체계와 소켓 타입이 같더라도 이에 해당하는 프로토콜이 두 개 이상 존재할 경우 프로토콜을 명시적으로 지정 소켓 생성과 닫기 (4/6) 프로토콜 주소 체계와 소켓 타입이 같더라도 이에 해당하는 프로토콜이 두 개 이상 존재할 경우 프로토콜을 명시적으로 지정 예) TCP와 UDP 프로토콜 설정(2) 예) TCP와 UDP 프로토콜 설정(3) 사용할 프로토콜 주소 체계 소켓 타입 프로토콜 TCP AF_INET SOCK_STREAM IPPROTO_TCP UDP SOCK_DGRAM IPPROTO_UDP 사용할 프로토콜 주소 체계 소켓 타입 프로토콜 TCP AF_INET SOCK_STREAM UDP SOCK_DGRAM

소켓 종료 함수 소켓을 닫고 관련 리소스를 반환 소켓 생성과 닫기 (5/6) int closesocket ( SOCKET s ) ; 성공: 0, 실패: SOCKET_ERROR

예제 코드: 교재 페이지 61 소켓 생성과 닫기 (6/6) int main(int argc, char* argv[]) { // 윈속 초기화 ... // socket() SOCKET tcp_sock = socket(AF_INET, SOCK_STREAM, 0); if(tcp_sock == INVALID_SOCKET) err_quit("socket()"); MessageBox(NULL, "TCP 소켓 생성 성공", "성공", MB_OK); // closesocket() closesocket(tcp_sock); // 윈속 종료 }