40
네네네네 네네 네네네네네 November 14th, 2012

네트워크 소켓 프로그래밍

Embed Size (px)

DESCRIPTION

네트워크 소켓 프로그래밍. November 14th , 2012. Contents. 네트워크 개요 소켓 개요 클라이언트 / 서버 동작 원리 소켓 주소 구조체 소켓 프로그래밍 리눅스 소켓 프로그래밍 윈도우 소켓 프로그래밍. 네트워크 개요. 네트워크 (Network) 각 호스트 (End-System) 들을 연결하는 하나의 단일 시스템 (System) 을 의미 Ex) PC, 워크스테이션 , 네트워크 프린터. 네트워크 개요. 인터넷 (Internet) - PowerPoint PPT Presentation

Citation preview

네트워크 소켓 프로그래밍

November 14th, 2012

Computer Communication Lab.

2

Contents

• 네트워크 개요• 소켓 개요• 클라이언트 / 서버 동작 원리• 소켓 주소 구조체• 소켓 프로그래밍• 리눅스 소켓 프로그래밍• 윈도우 소켓 프로그래밍

Computer Communication Lab.

3

네트워크 개요• 네트워크 (Network)

– 각 호스트 (End-System) 들을 연결하는 하나의 단일 시스템 (Sys-tem) 을 의미

• Ex) PC, 워크스테이션 , 네트워크 프린터

Computer Communication Lab.

4

네트워크 개요• 인터넷 (Internet)

– 전 세계의 컴퓨터가 서로 연결되어 IP 프로토콜을 이용해 정보를 주고받는 컴퓨터 네트워크

– 라우터 (Router) 를 이용해서 서로 다른 네트워크를 연결

Network A

Router

Network B

Computer Communication Lab.

5

네트워크 개요• 클라이언트 / 서버 (Client/Server) 모델

– 클라이언트 : 정보 및 서비스를 요청하는 호스트 – 서버 : 정보 및 서비스를 제공하는 호스트

– 서버의 종류• Iterative Server : 한 순간에 하나의 클라이언트에게 서비스를 제공• Concurrent Server : 동시에 여러 클라이언트에게 서비스를 제공

Server Client Server

Client

Client

Client

Server Client

Request

Response

Server Client Server

Client

Client

Client

Computer Communication Lab.

6

네트워크 개요• 클라이언트 / 서버 모델의 예

웹 클라이언트 웹 클라이언트

웹 서버GET / HTTP/1.1Accept: image/gif, ...

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

Computer Communication Lab.

7

소켓 개요• 소켓 개요

– 네트워크를 통한 입 / 출력을 하기 위한 수단을 제공하는 응용 프로토콜 인터페이스

– 네트워크 입 / 출력을 위한 요소• 프로토콜 (Protocol) : 전송할 프로토콜을 결정 (TCP 또는 UDP)• 소스 IP 주소 (Source IP Address) : 데이터를 전송하는 호스트의

주소• 소스 포트 번호 (Source Port Address) : 데이터를 전송하는

프로세스의 주소• 목적지 IP 주소 (Destination IP Address) : 데이터를 수신하는

호스트의 주소• 목적지 포트 번호 (Destination Port Address) : 데이터를 수신하는

프로세스의 주소

Computer Communication Lab.

8

소켓 개요• 포트번호

– 데이터를 최종으로 전달할 프로세스를 구분하기 위해서 사용됨– TCP 또는 UDP 헤더에 실려서 전송 (16bit)– 범위 : 1 ~ 65535

• 예약된 포트번호– Well-known ports

• 1023 이하로 배정된 번호• Ex) ftp (21), telnet (23), mail=smtp (25)

– 사용자 임의 이용 가능 포트• 1024 이상의 번호

Computer Communication Lab.

9

• 소켓 인터페이스의 위치

소켓 개요

App. 1 App. 2 App. 3

TCP/IP

Network Driver

1 (Phy)

2 (Link)

3 (Network)

4 (Transport)

5-7Ses, Pre, App

Socket Interface

Computer Communication Lab.

10

• 응용 프로그램과 소켓– 응용 프로그램에 소켓 번호를 3 번 부터 배정

• 표준입력 ( 키보드 ), 표준 출력 및 에러 출력 ( 모니터 ) 장치에 0, 1, 2 배정

소켓 개요

App. 1sd=

3

App. 2 App. 3 App. 4sd=

4sd=

3sd=

3sd=

3

TCP UDP

IP

3000 3001 2000 2001

128.134.65.119

sd : Socket DescriptorTCP : Transmission Control Pro-

tocolUDP : User Datagram Protocol

응용 프로그램( 소켓 번호 )

소켓

포트번호

트랜스포트 계층

인터넷 계층(IP 주소 )

Computer Communication Lab.

11

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

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

TCP App. Serversd=

4

TCP App. Client 1

sd=3

TCP App. Client 2

sd=3

sd=3

sd=3

Computer Communication Lab.

12

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

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

socket

bind

listen

accept

read

write

socket

connect

write

read

close

서버

클라이언트

연결 요청

데이터 수신

통신 소켓 생성

소켓주소와 반환된 소켓번호를 연결

• 소켓 번호 : 생성한 소켓의 번호

• 소켓 주소 : 자신의 IP + 포트

서버와의 연결을 요청

* 상대방 소켓주소 (IP + Port) 구조체를 인자로 넘겨줌

close

데이터 송신

데이터 송신데이터 수신

Computer Communication Lab.

13

• 클라이언트 / 서버 주소 구조– 소켓 주소 = < 주소 체계 (Address Family), IP 주소 , Port 번호– 소켓 주소 구조체는 sockaddr 로 정의

소켓 주소 구조체

IP Address + Port Number Address Family

14 bytes2 bytes

Address

struct sockaddr { u_short sa_family //Address Family char sa_data[14] //Address

}

Computer Communication Lab.

14

• sockaddr vs. sockaddr_in– sockaddr 구조

• IP 와 Port 를 구분하여 쓰거나 읽기에 불편– sockaddr_in

• 인터넷 전용 소켓주소 구조체• 인터넷 프로그래밍의 용이성

– sockaddr_in 구조체

소켓 주소 구조체

struct in_addr { u_long s_addr; };

Struct sockaddr_in { short sin_family; //Address Family u_short sin_port; //16bits Port Number struct in_addr sin_addr; // 32bits IP Address char sin_zero[8] // dummy}

sin_family : AF_INET ( 인터넷 주소 체계 ) AF_UNIX ( 유닉스 파일 주소 체계 ) AF_NS (XEROX 주소 체계 )

Computer Communication Lab.

15

• 소켓 함수– 소켓 생성 : socket ()

• 통신을 위한 소켓 생성• 소켓 번호 리턴

소켓 프로그래밍

Int socket( int domain, // Protocol Family int type, // Service Type int protocol); // Protocol

Domain : AF_INET, AF_UNIX, AF_NSType : SOCK_STREAM, SOCK_DGRAM, SOCK_RAW Protocol : protocol for socket. Usually 0

Computer Communication Lab.

16

• 소켓 함수– 소켓 생성 : socket ()

• Int domain– PF_INET : 인터넷 프로토콜 체계 사용– PF_INET5 : IPv6 프로토콜 체계 사용– PF_UNIX : 유닉스 방식의 프로토콜 체계 사용

• Int type – SOCK_STREAM : 스트림 방식의 소켓 생성 (TCP)– SOCK_DGRAM : 데이터그램 방식의 소켓 생성 (UDP)– SOCK_RAW : 사용자가 직접 정의

• Int Protocol– 구체적인 프로토콜을 정의 할 때 사용– 대부분의 응용 프로그램에서 ‘ 0’ 사용

소켓 프로그래밍

Computer Communication Lab.

17

• 소켓 함수– 주소 할당 : bind ()

• 소켓 번호와 소켓 주소 연결

소켓 프로그래밍

Int bind( int sockfd, // Socket Number struct sockaddr * sv_addr , // Server Socket Structure int addr_len); // Structure Size

sockfd : socket() 함수가 반환한 소켓 번호*sy_addr : IP 주소 , 프로토콜 , 포트 번호를 저장하는 구조체addr_len : 구조체 sockaddr 의 크기

Computer Communication Lab.

18

• 소켓 함수– 연결 요청 대기 : Listen()

• 클라이언트로부터 연결 요청을 기다리는 수동 대기 모드

소켓 프로그래밍

Int listen( int sockfd, // Socket Number int log); // Number of Clients

sockfd : 소켓 번호log : 접속 요청을 동시에 받아들일 수 있는 큐의 크기를 지정 . n 이 5 일 경우 서버는 동시에 5 개의 클라이언트 접속 요청을 받을 수 있음

Computer Communication Lab.

19

• 소켓 함수– 연결 요청 수락 : accept()

• 클라이언트의 연결 요청을 받아 들임• 새로운 소켓 번호 생성 >> 클라이언트와 통신

소켓 프로그래밍

Int accept( int sockfd, // Socket Number struct sockaddr * addr, // Client Socket Structure int *addr_len); // Size of Struc-ture

sockfd : 소켓 번호*addr : 접속을 허가해 준 클라이언트에 대한 소켓 구조체로 클라이언트의 정보를 알 수 있음addr_len : 구조체 sockaddr 의 크기

Computer Communication Lab.

20

• 소켓 함수– 데이터 전송 : send()

• 소켓을 통해 데이터를 송신

소켓 프로그래밍

Int send( int sockfd, // Socket Number char* buf, // Buffer int buflen, // Buffer Length int flags ); // Transfer Method (Usually 0)

sockfd : 소켓 번호*buf : 전송할 데이터가 저장된 버퍼의 포인터buflen : buf 의 크기flags : 데이터에 대한 처리 요구 지정 ( 대개의 경우 , 0)

Computer Communication Lab.

21

• 소켓 함수– 데이터 수신 : recv()

• 소켓을 통해 데이터를 수신

소켓 프로그래밍

Int recv( int sockfd, // Socket Number char* buf, // Buffer int buflen, // Buffer Length int flags); // Receive Method (Usually 0)

sockfd : 소켓 번호*buf : 전송할 데이터가 저장된 버퍼의 포인터buflen : buf 의 크기Flags : 데이터에 대한 처리 요구 지정

Computer Communication Lab.

22

• 소켓 함수– 소켓 연결 : connect()

• 클라이언트가 서버에게 접속을 요청할 때 사용하는 함수• 서버의 listen() 함수는 클라이언트의 connect() 요청을 기다리다가

요청이 들어오다 accept() 함수를 수행

소켓 프로그래밍

Int connect( int sockfd, // Socket Number struct sockaddr *serv_addr, // Buffer int addr_len); // Buffer Length

sockfd : 소켓 번호*serv_addr: 접속하고자 하는 서버의 정보가 있는 소켓 구조체addr_len : 구조체 sockaddr 의 크기

Computer Communication Lab.

23

• 소켓 함수– 소켓 종료 : close()

• 소켓을 종료• socket() 에 의해 생성된 sockfd 와 관련된 접속을 닫음• 대부분의 경우 클라이언트가 서버와의 접속을 끊을 때 사용• 네트워크 입출력에서는 반드시 close() 를 통해 소켓에 대한 작업을

종료한다 .

소켓 프로그래밍

Int close( int sockfd ); // Socket Number

sockfd : 소켓 번호

Computer Communication Lab.

24

• 서버 소켓 구현

리눅스 소켓 프로그래밍

서버 소켓 생성서버

구조체및 변수

생성 정보설정

소켓 생성 소켓 주소 할당

할당 및에러 처리

서버 소켓주소 연결 요청 대기 상태

요청 버퍼설정

연결 요청대기 연결 및 데이터 전송

클라이언트연결 요청

수락 및소켓 연결

데이터전송 연결 종료

연결 종료 소켓종료

에러 처리

socket() 에러 처리

bind() 에러 처리

listen() 에러 처리

accept() 에러 처리

Computer Communication Lab.

25

• 서버 소켓 구현

리눅스 소켓 프로그래밍

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char **argv){

int serv_sock;

int clnt_sock;

serv_sock=socket(PF_INET, SOCK_STREAM, 0); /* 서버 소켓 생성 */

if(serv_sock == -1)

error_handling("socket() error");

if( bind(serv_sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1 ) /* 소켓에 주소 할당 */

if( listen(serv_sock, 5)==-1 ) /* 연결 요청 대기 상태로 진입 */

clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr,&clnt_addr_size); /* 연결 요청 수락 */

write(clnt_sock, “Hello World!”, sizeof(“Hello World!”)); /* 데이터 전송 */

close(clnt_sock); /* 연결 종료 */

Computer Communication Lab.

26

• 클라이언트 소켓 구현

리눅스 소켓 프로그래밍

클라이언트 소켓 생성

구조체및 변수

생성 정보설정

소켓 생성 서버로 연결 요청

연결요청

서버 주소소켓 번호 데이터 수신

데이터수신

데이터출력 연결 종료

연결 종료 소켓종료

에러 처리

socket() 에러 처리

connect() 에러 처리

read() 에러 처리

Computer Communication Lab.

27

• 클라이언트 소켓 구현

리눅스 소켓 프로그래밍

#include <stdio.h>

#include <stdlib.h>

main(int argc, char **argv){

int sock;

struct sockaddr_in serv_addr;

sock=socket(PF_INET, SOCK_STREAM, 0); /* 서버 접속을 위한 클라이언트 소켓 생성 */

if(sock == -1)

error_handling("socket() error");

if( connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))==-1) /* 서버로 연결 요청 */

str_len=read(sock, message, sizeof(message)-1); /* 데이터 수신 */

message[str_len]=0;

printf("Message from server : %s \n", message);

close(sock); /* 연결 종료 */

Computer Communication Lab.

28

• 실행 결과

리눅스 소켓 프로그래밍

서버 프로그램 실행

클라이언트 프로그램 실행

Computer Communication Lab.

29

• 윈도우 소켓– WinSock 을 사용

• BSD 계열 유닉스 소켓을 참고로 설계되어서 많은 부분이 리눅스 기반 소켓과 유사

– WinSock 사용을 위한 설정• Winsock2.h 헤더파일을 포함• Ws2_32.lib 라이브러리를 링크• WinSock 사용을 위한 라이브러리 초기화 및 해제

윈도우 소켓 프로그래밍

Computer Communication Lab.

30

• 윈도우 소켓

윈도우 소켓 프로그래밍

Computer Communication Lab.

31

• WinSock 함수– WSAStartup() : WinSock 초기화

• 프로그램에 호출하는 WinSock 버전을 알림• 해당 버전의 WinSock 사용을 위한 라이브러리 초기화

윈도우 소켓 프로그래밍

#include <winsock2.h>

int WSAStartup( WORD wVersionRequested, //WinSock Ver-

sion LPWSADATA lpWSAData); // Pointer

wVersionRequested : 프로그램에서 요구하는 윈속의 최상위 버전을 알려줌 WORD 는 16 비트 unsigned int 를 의미 lpWSAData : WSADATA 타입 변수의 포인터를 인자로 전달

Computer Communication Lab.

32

• WinSock 함수– WSACleanup() : WinSock 해제

• 소켓에 대한 연결이 종료되었을 경우 할당 받은 리소스를 해제하는 작업을 수행

윈도우 소켓 프로그래밍

int WSACleanup (void);

Computer Communication Lab.

33

• WinSock 소켓 함수

윈도우 소켓 프로그래밍

SOCKET socket(int af, int type, int protocol);

int bind (SOCKET s, const struct sockaddr FAR * name, int namelen);

int listen(SOCKET s, int backlog);

SOCKET accept(SOCKET s, struct sockaddr FAR * addr, int FAR * addrlen);

int connect(SOCKET s, const struct sockaddr FAR * name, int namelen);

Computer Communication Lab.

34

• WinSock 소켓 함수– Send() : 데이터 전송

• BSD 기반과 다른 함수를 활용

윈도우 소켓 프로그래밍

#include <winsock2.h>

int send( SOCKET s, //Socket Handler const char FAR *buf, //Buffer int len, //Bytes int flags ); //Option

S : 데이터를 전송할 호스트에 연결된 소켓의 핸들을 인자로 전달 *buf : 전송할 데이터를 저장하고 있는 버퍼를 가리키는 포인터 len : 전송할 바이트 수를 인자로 전달 flags : 함수 호출 시 , 여러가지 옵션을 설정하기 위해 사용

Computer Communication Lab.

35

• WinSock 소켓 함수– recv() : 데이터 수신

• BSD 기반과 다른 함수를 활용

윈도우 소켓 프로그래밍

#include <winsock2.h>

int recv( SOCKET s, // Socket Handler char FAR *buf, //Buffer int len, // Bytes int flags ); // Option

s : 데이터를 수신할 영역을 나타내는 소켓의 핸들 *buf : 수신할 데이터를 저장할 버퍼를 가리키는 포인터 len : 수신할 최대 바이트 수 flags : 함수 호출 시 , 여러 가지 옵션을 설정하기 위해서 사용

Computer Communication Lab.

36

• 서버 소켓 구현

윈도우 소켓 프로그래밍

서버 소켓 생성

구조체및 변수

생성 정보설정

소켓 생성 소켓 주소 할당

할당 및에러 처리

서버 소켓주소 연결 요청 대기 상태

요청 버퍼설정

연결 요청대기 연결 및 데이터 전송

클라이언트연결 요청

수락 및소켓 연결

데이터전송

연결 종료

소켓종료

윈속반환

윈속 초기화

윈속초기화

초기화변수

에러 처리

socket() 에러 처리

bind() 에러 처리

listen() 에러 처리

accept() 에러 처리

WSAStartup() 에러 처리

Computer Communication Lab.

37

• 서버 소켓 구현

윈도우 소켓 프로그래밍

#include <winsock2.h>

int main(int argc, char **argv)

{

WSADATA wsaData;

SOCKET hServSock;

if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) /* Load Winsock 2.2 DLL */

ErrorHandling("WSAStartup() error!");

hServSock=socket(PF_INET, SOCK_STREAM, 0); /* 서버 소켓 생성 */

if( bind(hServSock, (SOCKADDR*) &servAddr, sizeof(servAddr))==SOCKET_ERROR ) /* 소켓에 주소 할당 */

if( listen(hServSock, 5)==SOCKET_ERROR) /* 연결 요청 대기 상태 */

hClntSock=accept(hServSock, (SOCKADDR*)&clntAddr,&szClntAddr); /* 연결 요청 수락 */

send(hClntSock, message, sizeof(message), 0); /* 데이터 전송 */

closesocket(hClntSock); /* 연결 종료 */

WSACleanup();

return 0;

}

Computer Communication Lab.

38

• 클라이언트 소켓 구현

윈도우 소켓 프로그래밍

클라이언트 소켓 생성

구조체및 변수

생성 정보설정

소켓 생성 서버로 연결 요청

연결요청

서버 주소소켓 번호 데이터 수신

데이터수신

데이터출력 연결 종료

소켓종료

윈속반환

에러 처리

socket() 에러 처리

connect() 에러 처리

read() 에러 처리

윈속 초기화

윈속초기화

초기화변수

WSAStartup() 에러 처리

Computer Communication Lab.

39

• 클라이언트 소켓 구현

윈도우 소켓 프로그래밍

#include <winsock2.h>

int main(int argc, char **argv)

{

WSADATA wsaData;

SOCKET hSocket;

if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) /* Load WinhSocket 2.2 DLL */

ErrorHandling("WSAStartup() error!");

hSocket=socket(PF_INET, SOCK_STREAM, 0); /* 서버 접속을 위한 소켓 생성 */

if( connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr))==SOCKET_ERROR ) /* 서버로 연결 요청 */

strLen=recv(hSocket, message, sizeof(message)-1, 0); /* 데이터 수신 */

message[strLen]=0;

closesocket(hSocket); /* 연결 종료 */

WSACleanup();

return 0;

}

Computer Communication Lab.

40

• 실행 결과

윈도우 소켓 프로그래밍

서버 프로그램 실행

클라이언트 프로그램 실행