29
Chapter 2 Socket Programming 소소 소소소소소

Chapter 2 Socket Programming

  • Upload
    chipo

  • View
    47

  • Download
    2

Embed Size (px)

DESCRIPTION

Chapter 2 Socket Programming. 소켓 프로그래밍. Socket Programming. 프로젝트 생성 Visual Studio 2008 Visual C# 2008 Express Edition 통합 개발 환경 (IDE) 서버 소켓 클라이언트 소켓 소켓 프로그램 실행 추적과 디버깅 소켓 클래스 메서드 소켓 오류 IP 주소. Visual Studio 2008. Visual Studio 2008. 프로젝트 생성 화면. 프로젝트 형식. 콘솔 응용 프로그램. 프로젝트 이름. - PowerPoint PPT Presentation

Citation preview

Page 1: Chapter 2 Socket Programming

Chapter 2Socket Programming

소켓 프로그래밍

Page 2: Chapter 2 Socket Programming

프로젝트 생성◦ Visual Studio 2008◦ Visual C# 2008 Express Edition◦ 통합 개발 환경 (IDE)

서버 소켓 클라이언트 소켓 소켓 프로그램 실행 추적과 디버깅 소켓 클래스 메서드 소켓 오류 IP 주소

Socket Programming

Page 3: Chapter 2 Socket Programming

Visual Studio 2008

Page 4: Chapter 2 Socket Programming

프로젝트 생성 화면Visual Studio 2008

프로젝트 형식

콘솔 응용 프로그램

프로젝트 이름

저장 위치

솔루션 이름

솔루션 디렉터리 생성 여부

Page 5: Chapter 2 Socket Programming

Visual Studio 2008 생성된 프로젝트

Page 6: Chapter 2 Socket Programming

Visual C# 2008 Express Edition

Page 7: Chapter 2 Socket Programming

Visual C# 2008 Express Edition 프로젝트 생성 화면

콘솔 응용 프로그램

프로젝트 이름

Page 8: Chapter 2 Socket Programming

Visual C# 2008 Express Edition 생성된 프로젝트

Page 9: Chapter 2 Socket Programming

통합 개발 환경 (IDE) 두 개발환경 모두 비슷한 인터페이스를 제공

◦ Type List – 네임스페이스 , 클래스◦ Member List – 선택된 클래스의 멤버들◦ Using 지시어 – Method 접근을 용이하게 함

Page 10: Chapter 2 Socket Programming

솔루션 탐색기 (Solution Explorer)◦ 솔루션 / 프로젝트에 대한 참조 , 파일 목록◦ 프로젝트에 포함되는 소스코드 , 이미지 , 설정파일 등

도구 상자 패널 (Toolbox Panel)◦ GUI 에 필요한 컴포넌트를 제공

속성 패널 (Properties Panel)◦ GUI 컴포넌트 속성과 이벤트 정보 확인 및 수정◦ GUI 컴포넌트 외에도 솔루션 탐색기에 열거된 파일의 속성 정보 확인 및 수정 가능

출력 패널 (Output Panel)◦ 컴파일 정보에 관한 메시지 출력

오류 목록 패널 (Error List Panel)◦ 오류에 대한 정보를 요약하여 표시

통합 개발 환경 (IDE)

Page 11: Chapter 2 Socket Programming

통합 개발 환경 (IDE) Toolbox

panel

Properties panel

Error List panel

Output panel

Solution Explorer panel

Page 12: Chapter 2 Socket Programming

예제 프로그램 : EchoServer.cs

소켓 생성을 위해 Socket 클래스가 사용됨 Socket 생성자

public Socket( SocketInformation ) public Socket( AddressFamily, SocketType, ProtocolType )◦ AddressFamily(열거형 )

소켓의 주소 지정 방법을 선택◦ SocketType(열거형 )

소켓의 종류를 구분◦ ProtocolType(열거형 )

프로토콜의 종류를 구분

서버 소켓

Page 13: Chapter 2 Socket Programming

일반적인 소켓은 통신을 하기 위해 IP 종단점을 필요로 함 IP 종단점의 구성

◦ IP 주소◦ 포트번호

IPEndPoint 클래스 객체를 생성하여 IP 종단점을 정의 IPEndPoint 생성자

public IPEndPoint( long, int ) Long integer 형으로 IP 주소 표현

public IPEndPoint( IPAddress, int ) IPAddress 클래스를 이용하여 IP 주소 표현 IPAddress 클래스는 특수 IP 주소에 대한 열거형 값을 포함하고 있음

◦ 생성자의 두 번째 인자는 포트번호 0 – 65536 의 범위

서버 소켓

Page 14: Chapter 2 Socket Programming

IPAddress 특수 IP 주소서버 소켓

Field Description Version

IPAddress.Any Listen for every interface IPv4

IPAddress.Broadcast Broadcast address IPv4

IPAddress.IPv6Any Listen for every interface IPv6

IPAddress.IPv6Loopback Loopback address IPv6

IPAddress.IPv6None Do not listen for client IPv6

IPAddress.Loopback Loopback address IPv4

IPAddress.None Do not listen for client IPv4

Page 15: Chapter 2 Socket Programming

예제 프로그램 : EchoClient.cs

서버와는 달리 접속할 위치를 알아야 함 Socket, IPEndPoint 객체 생성

◦ IPEndPoint 객체 생성시 IPAddress 객체를 인자로 할 경우 IPAddress.Parse() 메서드는 문자형 IP 주소 (IPv4, IPv6) 를 인자로 받아서 IPAddress 객체를 반환

서버와 클라이언트가 동일한 호스트에 위치할 경우 루프백 주소 127.0.0.1 를 이용할 수 있음 포트번호에 연결하는 것은 서버와 동일

클라이언트 소켓

Page 16: Chapter 2 Socket Programming

서버 프로젝트와 클라이언트 프로젝트 모두 컴파일 및 빌드를 수행 IDE 또는 명령 프롬프트를 통해 서버를 먼저 실행 후 , 클라이언트 실행 방화벽 경고 시 해제

소켓 프로그램 실행

Page 17: Chapter 2 Socket Programming

IDE 를 이용한 프로그램 추적과 디버깅 Locals ( 지역 ), Watch ( 조사식 )

◦ Locals 디버깅 모드 시에 Locals 를 통해 프로그램 내에서 선언된 변수들의 변경사항을 확인할 수 있음 IDE 에 의해 자동으로 출력됨

◦ Watch 특정 변수를 사용자가 직접 감시할 수 있음 변수이름을 입력 후 확인 가능

추적과 디버깅

Page 18: Chapter 2 Socket Programming

Locals 창

Watch 창

추적과 디버깅

Page 19: Chapter 2 Socket Programming

특정 시점의 프로세스를 감시하고자 할 때에는 중단점 (Break Point) 를 설정하여 프로그램을 일시 중지할 수 있음

중단점까지의 실행 후 코드 추적을 어떻게 진행해 나갈지에 대한 방법을 선택◦ Step Into

현재 라인이 메서드 호출을 포함할 경우 메서드가 정의된 곳으로 이동◦ Step Over

메서드가 정의된 곳으로 이동하지 않고 건너뜀◦ Step Out

현재 라인이 메서드 정의 내에 포함될 경우 호출한 위치로 복귀

Example : MainProgram.cs ExternalClass.cs

추적과 디버깅

Page 20: Chapter 2 Socket Programming

public void Bind(EndPoint)◦ 종단점에 소켓을 바인딩

public void Listen(int)◦ 클라이언트로부터의 접속요청을 대기

public void Connect(EndPoint)◦ 서버에 접속을 시도

public Socket Accept()◦ 큐에 대기하고 있는 접속요청을 수락

public int Send(byte[], int, SocketFlags)◦ 데이터 송신 – 보낸 바이트 수를 정수형으로 반환

버퍼 – byte[], 길이 – int, 데이터를 보낼 방법 - SocketFlags public int Receive(byte[])

◦ 데이터 수신 – 받은 바이트 수를 정수형으로 반환 Byte[] 에 수신한 데이터를 저장

public void Close()◦ 소켓을 닫고 리소스 해제

소켓 클래스 메서드

Page 21: Chapter 2 Socket Programming

TCP 소켓 함수 호출순서Socket()

Bind()

Receive()

Send()

Close()

Socket()

Send()

Receive()

Close()

TCP 서버 TCP 클라이언트

Connect()

Listen()

Accept()

네트워크

Page 22: Chapter 2 Socket Programming

소켓에서의 실행시간 오류 SocketException 예외 발생 SocketException 은 어떤 오류가 발생했는지를 나타내는 ErrorCode 속성을 포함하고 있음 오류코드는 Winsock 2 오류코드와 동일

Example : EchoServerSE.cs EchoClientSE.cs 오류를 처리하기 위해 try-catch 블록 사용

소켓 오류

Page 23: Chapter 2 Socket Programming

바이트 정렬◦ Big-endian – 최상위 바이트를 가장 높은 주소에 저장◦ Little-endian – 최상위 바이트를 가장 낮은 주소에 저장

◦ Example : LongEndPoint.cs

IP 주소

01111111000000000000000000000001 (2130706433)

127 0 0 1. . .

Big-endian

IP Address

Little-endian 00000001000000000000000001111111 (16777343)

Page 24: Chapter 2 Socket Programming

바이트 정렬 함수 (1/5) 바이트 정렬 (byte ordering)

◦ 메모리에 데이터를 저장할 때의 바이트 순서 빅 엔디안 (big-endian), 리틀 엔디안 (little-endian)

0x12 0x34 0x56 0x78

0x78 0x56 0x34 0x12

빅 엔디안리틀 엔디안

0x1000 0x1001 0x1002 0x1003

Page 25: Chapter 2 Socket Programming

바이트 정렬 함수 (2/5) 네트워크 애플리케이션에서 바이트 정렬 방식을 고려해야 하는 경우

종단 시스템 라우터 종단 시스템라우터

데이터IP 주소포트 번호

??

?

(a)

(b)

(c)

Page 26: Chapter 2 Socket Programming

바이트 정렬 함수 (3/5) 네트워크 애플리케이션에서 바이트 정렬 방식을 고려해야 하는 경우 (cont’d)

◦ 프로토콜 구현을 위해 필요한 정보 (a) IP 주소 빅 엔디안 (b) 포트 번호 빅 엔디안

◦ 애플리케이션이 주고 받는 데이터 (c) 빅 엔디안 또는 리틀 엔디안으로 통일

네트워크 바이트 정렬 (network byte ordering) : 빅 엔디안 방식 호스트 바이트 정렬 (host byte ordering) : 시스템이 사용하는 고유한 바이트 정렬 방식

참고

Page 27: Chapter 2 Socket Programming

바이트 정렬 함수 (4/5) 바이트 정렬 함수 ( 유닉스 호환 )

바이트 정렬 함수 ( 윈속 확장 )

u_short htons (u_short hostshort); // host-to-network-shortu_long htonl (u_long hostlong); // host-to-network-longu_short ntohs (u_short netshort); // network-to-host-shortu_long ntohl (u_long netlong); // network-to-host-long

int WSAHtons (SOCKET s, u_short hostshort, u_short* lpnetshort);int WSAHtonl (SOCKET s, u_long hostlong, u_long* lpnetlong);int WSANtohs (SOCKET s, u_short netshort, u_short* lphostshort);int WSANtohl (SOCKET s, u_long netlong, u_long* lphostlong);

Page 28: Chapter 2 Socket Programming

바이트 정렬 함수 (5/5) 바이트 정렬 함수 사용

소켓 함수

hton*( )

소켓 함수에게넘겨줄 데이터

소켓 함수

ntoh*( )

애플리케이션이 사용

소켓 함수가 결과로 전달

Page 29: Chapter 2 Socket Programming

Current host IP address◦ 예제 프로그램 : HostIP.cs

DNS lookup◦ 예제 프로그램 : IPLookup.cs

Retrieving client’s IP address◦ 예제 프로그램 : WelcomeServer.cs WelcomeClient.cs

IP 주소