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

Slides:



Advertisements
Similar presentations
TCP 서버/클라이언트 동작 원리 - (1) TCP 서버/클라이언트 예 웹 서버 웹 클라이언트 웹 클라이언트
Advertisements

2016 ITA 1월 강의 C Programming -4일차- 포인터배열 및 이중포인터 정대진 ( )
Network Lab. Byoung-Son, Choi
6장. 멀티스레드 멀티스레드 프로그래밍의 필요성을 이해하고 기본 개념을 익힌다.
Chapter 09. 소켓 입출력 모델(I).
Understanding of Socket and File I/O
TCP/IP Network Experimental Programming [IPv6에 의한 통신 실험]
13장 소켓.
Chapter 06. UDP 서버/클라이언트.
TCP/IP Socket Cover Slide 조태문.
TCP/IP 소켓 프로그래밍 - C 버전 중에서
Department of Computer Engineering
네트워크 프로그래밍 Unix Network Programming, 2nd Ed., W. Richard Stevens, Prentice Hall PTR, 한국어 판 Unix Network Programming, Stevens 저, 김치하, 이재용 역, 대영사,
4장. 소켓 유형과 프로토콜 Network Lab. 이 원 구 1.
PHP 웹 프로그래밍 (PHP Web Programming) 네트워크 프로그래밍 문양세 강원대학교 IT대학 컴퓨터과학전공.
TCP/IP Socket Cover Slide 조태문.
Department of Computer Engineering
Multi-thread Programming
얇지만 얇지 않은 TCP/IP 소켓 프로그래밍 C 2판
TCP Client/Server Program
Network Lab. Seoung Hyeon, Lee
얇지만 얇지 않은 TCP/IP 소켓 프로그래밍 C 2판
Multimedia & Mobile Communications Lab.
Chapter 11. Raw 소켓.
배열, 포인터, 참조 배열은 같은 형을 가지는 변수들의 묶음이다..
Linux System Programming
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
11 소켓 프로그래밍 기초.
인터넷 주소 변환 School of Electronics and Information. Kyung Hee University.
14장 소켓.
제 12장 I/O멀티플렉싱(Multiplexing)
25장. 메모리 관리와 동적 할당.
Window socket programming
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
Department of Computer Engineering
(Web Programming & Practice)
Socket Address Structure and Byte Ordering Functions
Department of Computer Engineering
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express.
Term Project Team Member
Socket Address Structure and Byte Ordering Functions
Homework 6… 12월 2일(금) 11:59pm까지 자신의 이름과 학번을 출력해 주는 유닉스/리눅스 네트워크 소켓 서버 프로그램 과 클라이언트 프로그램 을 작성해 보세요 참고 (실습1) Hello 프로그램 helloserver.c helloclient.c 컴파일.
7장. UDP 서버-클라이언트 UDP 서버-클라이언트의 기본 구조와 동작 원리를 이해한다.
Chapter 8 연결형 프로토콜 서버 발표자 : SE Lab 황 성 하
Department of Computer Engineering
Chapter 12. 직렬 통신과 무선 프로토콜.
(ioctl, mmap, fsync&flush)
Department of Computer Engineering
UDP Test 프로그램 분석.
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
7장. UDP 서버-클라이언트 UDP 서버-클라이언트의 기본 구조와 동작 원리를 이해한다.
Computer Graphics OpenGL 설치 및 설정
Chapter 09. 소켓 입출력 모델(I).
School of Electronics and Information. Kyung Hee University.
Chapter 4 컬러( COLOR ).
WSAAsync Select 김대열 Bit - Academy Sunmoon University, Korea.
Chapter 16 Socket Interface.
조 병 규 Software Quality Lab. 한국교통대학교
Department of Computer Engineering
Department of Computer Engineering
윤성우의 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판
C89(C++03) 프로그래밍 (Part 2) 7 배열 8 변수 범위 9 포인터 10 유도 자료형.
Chapter 02. 윈도우 소켓 시작하기.
제 14 장 응용 계층과 클라이언트-서버 모델 클라이언트-서버 모델 14.2 동시성 14.3 프로세스 14.4 요약.
Department of Computer Engineering
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
argc, argv 의 사용방법 #include <stdio.h>
소켓의 생성과 프로토콜의 설정 School of Electronics and Information.
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
Department of Computer Engineering
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

예제 코드 윈속 초기화와 종료 (3/3) #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

예제 코드 소켓 생성과 닫기 (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); // 윈속 종료 }