chapter 2 소켓 기본

35
Chapter 2 Chapter 2 소소 소소 소소 소소 소소소 소소소소 소소소 TCP/IP 소소 소소소소소 - C 소소 소소소

Upload: farren

Post on 17-Jan-2016

50 views

Category:

Documents


3 download

DESCRIPTION

TCP/IP 소켓 프로그래밍 - C 버전 중에서. Chapter 2 소켓 기본. 최병선 네트워크 실험실. 목차. Part I : 생성 (Creating) 과 해지 (Destroying). Part II : 주소 지정. Part III : TCP 클라이언트. Part IV : TCP 서버. Part I :. 생성 (Creating) 과 해지 (Destroying). socket() 함수. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Chapter 2   소켓 기본

Chapter 2 Chapter 2 소켓 기본소켓 기본

최병선

네트워크 실험실

TCP/IP 소켓 프로그래밍 - C 버전 중에서

Page 2: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

2

목차목차

Part I : Part I : 생성생성 (Creating)(Creating) 과 해지과 해지 (Destroying)(Destroying)

Part II : Part II : 주소 지정주소 지정

Part III : TCP Part III : TCP 클라이언트클라이언트

Part IV : TCP Part IV : TCP 서버서버

Page 3: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

3

Part I :

생성 (Creating) 과 해지 (Destroying)

Page 4: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

4

socket() socket() 함수함수

첫번째 파라미터는 소켓의 프로토콜 패밀리를 결정첫번째 파라미터는 소켓의 프로토콜 패밀리를 결정 PF_INET 은 인터넷 프로토콜 패밀리의 프로토콜을 사용하는 소켓을 명시

두번째 파라미터는 소켓의 형태를 지정두번째 파라미터는 소켓의 형태를 지정 상수 SOCK_STREAM 은 신뢰성 있는 데이터 스트림 전송을 위한 소켓을 나타냄 상수 SOCK_DGRAM 은 단순 데이터 전송에 목적을 두는 소켓을 나타냄

세번째 파라미터는 소켓이 데이터전송을 위해 사용하는 프로토콜을 세번째 파라미터는 소켓이 데이터전송을 위해 사용하는 프로토콜을 명시명시 TCP – 스트림 소켓을 위해 , IPPROTO_TCP 로 표시 UDP – 데이터그램 소켓을 위해 , IPPROTO_UDP 로 표시

socket()socket() 의 리턴값의 리턴값 socket() 의 반환값은 하나의 정수 음이 아닌 값이면 성공 , –1 이면 실패를 의미 실패가 아닌 경우 , 반환 값은 소켓 식별자 (socket descriptor) 라 부르는 핸들로서

다른 API 함수들에 전달되어 연산이 수행될 소켓을 지정하는 역할

int socket(int protocolFamily, int type, int protocol)int socket(int protocolFamily, int type, int protocol)

Page 5: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

5

close() close() 함수함수

어플리케이션이 소켓을 종료할때 어플리케이션이 소켓을 종료할때 close()close() 를 호출를 호출

더 이상 사용하지 않을 소켓 식별자를 반환하는 역할더 이상 사용하지 않을 소켓 식별자를 반환하는 역할

성공시에 성공시에 00 을을 , , 실패시에 실패시에 -1-1 을 반환한다을 반환한다 ..

int close(int socket)int close(int socket)

Page 6: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

6

Part II :

주소 지정

Page 7: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

7

주소 구조체주소 구조체

소켓을 사용하는 어플리케이션들은 커널에 인터넷주소와 포트를 지정할 소켓을 사용하는 어플리케이션들은 커널에 인터넷주소와 포트를 지정할

수 있는 방법이 필요수 있는 방법이 필요

소켓 소켓 APIAPI 는 소켓과 관련된 주소를 지정하기 위해 총괄적인 데이터 는 소켓과 관련된 주소를 지정하기 위해 총괄적인 데이터

형태인 소켓 구조체형태인 소켓 구조체 (socket structure)(socket structure) 를 정의를 정의

struct sockaddr {

u_short sa_family; /* 주소 패밀리 (e.g AF_INET)*/

char sa_data[14]; /* 주소 */

};

struct sockaddr {

u_short sa_family; /* 주소 패밀리 (e.g AF_INET)*/

char sa_data[14]; /* 주소 */

};

인터넷 주소 패밀리를 나타내는

상수 AF_INET 을 사용

모양이 주소 패밀리에 따라 정해지는 비트들의 조합이기종 방식을 다루기 위한 전형적인 기법

소켓주소는 32 비트의 인터넷 주소와 16 비트의 포트 번호로 나뉨

Page 8: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

8

주소 구조체주소 구조체

구조체 구조체 socketaddr_insocketaddr_in 은 주소 패밀리에 추가하여 포트 번호와 인터넷 주소를 위한 필드를 가지고 있음은 주소 패밀리에 추가하여 포트 번호와 인터넷 주소를 위한 필드를 가지고 있음

socketaddr_insocketaddr_in 은 은 socketaddr socketaddr 구조체의 데이터를 인터넷 프로토콜에서 사용하기에 적합하도록 수정한 것임구조체의 데이터를 인터넷 프로토콜에서 사용하기에 적합하도록 수정한 것임

구조체 구조체 socketaddr_insocketaddr_in 의 필드를 채운 후의 필드를 채운 후 , socketaddr, socketaddr 에 캐스트에 캐스트 (cast)(cast) 시켜 결과적으로 소켓 함수에 전달시켜 결과적으로 소켓 함수에 전달

소켓 함수는 소켓 함수는 sa_family sa_family 필드를 조사하여 주소의 나머지 부분이 어떻게 구성되었는지 알게됨 필드를 조사하여 주소의 나머지 부분이 어떻게 구성되었는지 알게됨

struct in_addr {

u_long s_addr; /* 32 비트의 IP 주소를 저장할 구조체 */

};

struct sockaddr_in {

short sin_family; /* 주소 체계 */

u_short sin_port; /* 16 비트 포트번호 */

struct in_addr sin_addr; /* 32 비트 IP 주소 */

char sin_zero[8]; /* 16 바이트 크기를 맞추기 위한 dummy */

};

struct in_addr {

u_long s_addr; /* 32 비트의 IP 주소를 저장할 구조체 */

};

struct sockaddr_in {

short sin_family; /* 주소 체계 */

u_short sin_port; /* 16 비트 포트번호 */

struct in_addr sin_addr; /* 32 비트 IP 주소 */

char sin_zero[8]; /* 16 바이트 크기를 맞추기 위한 dummy */

};

Page 9: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

9

주소 구조체주소 구조체

Family Blob(14 bytes)

Family Port Internet Address Unused

< 그림 2-1> 주소 구조체 , p. 28

sa_family sa_data

sin_family sin_port sin_addr sin_zero

sockaddr_in

sockaddr

2bytes 2bytes 4bytes 8bytes

Page 10: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

10

Part III :

TCP 클라이언트

Page 11: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

11

TCP TCP 소켓 프로그래밍 절차소켓 프로그래밍 절차

< 참고 > TCP/IP 프로토콜 , 미래컴 , p. 775

recv()recv()

send()send()

Page 12: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

12

TCP TCP 소켓 프로그래밍 절차소켓 프로그래밍 절차

Client ServerSocket()Socket() Socket()Socket()

bind()bind()

Listen()Listen()connect()connect()

accept()accept()

send()send()

recv()recv()

recv()recv()

send()send()

close()close()

데이터 송수신데이터 송수신

종료종료

연결요청연결요청

Page 13: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

13

TCP TCP 클라이언트의 통신단계클라이언트의 통신단계

socket()socket() 을 사용하여 을 사용하여 TCP TCP 소켓 생성한다소켓 생성한다 ..

connect()connect() 을 사용하여 서버와 연결을 사용하여 서버와 연결 (connection)(connection) 을 을

설정한다설정한다 ..

send()send() 와 와 recv()recv() 를 사용하여 통신한다를 사용하여 통신한다 ..

close()close() 로 연결을 닫는다로 연결을 닫는다 ..

Page 14: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

14

TCP TCP 클라이언트의 주요 소켓 함수들클라이언트의 주요 소켓 함수들

TCPTCP 소켓은 이 소켓을 통해 데이터를 보내기 전에 반드시 다른 소켓은 이 소켓을 통해 데이터를 보내기 전에 반드시 다른 소켓과 연결되어 있어야 함소켓과 연결되어 있어야 함

socket 은 socket() 에 의해 생성된 식별자이다 . struct sockaddr * foreignAddress 는 서버의 인터넷 주소 및 포트 번호를

포함하는 sockaddr_in 을 가리키는 포인터 adderssLength 는 주소구조체의 길이를 나타내며 고정적으로 sizeof(soc

kaddr_in) 으로 주어진다 .

메시지 전송함수들메시지 전송함수들

send() 와 recv() 는 보내거나 받은 데이터의 바이트 수 또는 실패를 나타내는 -1 을 반환

int connect(int socket , struct sockaddr * foreignAddress, unsigned int addressLength)int connect(int socket , struct sockaddr * foreignAddress, unsigned int addressLength)

int send(int socket,const void *msg,unsigned int msgLength,int flags)

int recv(int socket,void *revbuffer,unsigned int bufferLength,int flags)

int send(int socket,const void *msg,unsigned int msgLength,int flags)

int recv(int socket,void *revbuffer,unsigned int bufferLength,int flags)

Page 15: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

15

Part IV :

TCP 서버

Page 16: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

16

TCP TCP 서버의 통신 단계서버의 통신 단계

socket()socket() 을 사용하여 을 사용하여 TCP socketTCP socket 을 생성한다을 생성한다 ..

bind()bind() 로 소켓에 한 포트 번호를 부여한다로 소켓에 한 포트 번호를 부여한다 ..

시스템에 시스템에 listen()listen() 을 이용 그 포트로 연결 요구를 허락하도록 을 이용 그 포트로 연결 요구를 허락하도록

알린다알린다 ..

다음 과정을 반복한다다음 과정을 반복한다 각 클라이언트 연결에 대해 새로운 소켓을 얻기 위해 accept() 를 호출한다 .

send() 와 recv() 를 사용 새로운 소켓을 통해 클라이언트와 통신한다 .

close()close() 을 사용하여 해당 클라이언트와의 연결을 닫는다을 사용하여 해당 클라이언트와의 연결을 닫는다 ..

Page 17: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

17

TCP TCP 서버의 주요 소켓 함수들서버의 주요 소켓 함수들

클라이언트가 서버에 접속 하기 위해서 서버의 소켓은 지정된 내부주소 클라이언트가 서버에 접속 하기 위해서 서버의 소켓은 지정된 내부주소

및 포트를 가지고 있어야 하는데 이일을 하는 함수가 및 포트를 가지고 있어야 하는데 이일을 하는 함수가 bind()bind() 이다이다 ..

첫번째 파라미터는 이전의 첫번째 파라미터는 이전의 socket()socket() 호출에서 반환된 식별자 값이다호출에서 반환된 식별자 값이다 .. connect()connect() 에서와 마찬가지로 에서와 마찬가지로 sockaddr sockaddr 구조체가 선언된다구조체가 선언된다 .. addressLengthaddressLength 는 주소구조체의 길이로 는 주소구조체의 길이로 sizeof(struct sockaddr_in)sizeof(struct sockaddr_in) 이 이

전달된다전달된다 .. 성공시 성공시 0, 0, 실패시 –실패시 – 11 을 반환을 반환 성공인 경우성공인 경우 , , 결과 식별자가 나타내는 소켓은 유일하게 주어진 인터넷 결과 식별자가 나타내는 소켓은 유일하게 주어진 인터넷

주소와 포트에 결합한다주소와 포트에 결합한다 ..

int bind(int socket , struct sockaddr * localAddress , unsigned int addressLength)int bind(int socket , struct sockaddr * localAddress , unsigned int addressLength)

Page 18: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

18

TCP TCP 서버의 주요 소켓 함수들서버의 주요 소켓 함수들 listen()listen() 은 주어진 소켓에 대해 내부 상태의 변경을 유발하여 은 주어진 소켓에 대해 내부 상태의 변경을 유발하여

들어오는 들어오는 TCP TCP 연결 요구들이 처리될수 있도록 큐에 저장하는 것을 연결 요구들이 처리될수 있도록 큐에 저장하는 것을 가능하게 한다가능하게 한다 ..

accept()accept() 는 는 socketsocket 을 위한 큐에서 다음 연결을 하나 꺼낸다을 위한 큐에서 다음 연결을 하나 꺼낸다 . . 만약 만약 큐가 비어 있다면 큐가 비어 있다면 accept()accept() 는 연결요구가 도착할때 까지 블록 된다는 연결요구가 도착할때 까지 블록 된다 ..

성공적인경우성공적인경우 , accept, accept 는 해당 클라이언트와 연결된 새로운 는 해당 클라이언트와 연결된 새로운 소켓식별자를 반환한다소켓식별자를 반환한다 ..

int listen(int socket,int queueLimit);int listen(int socket,int queueLimit);

int accept(int socket,struct sockaddr *clientAddress,unsigned int * addressLength)int accept(int socket,struct sockaddr *clientAddress,unsigned int * addressLength)

Page 19: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

19

TCPEchoServer.cTCPEchoServer.c 의 처리 과정의 처리 과정

listening listening 소켓을 설정하고 클라이언틀부터 들어오는 소켓을 설정하고 클라이언틀부터 들어오는

연결요구를 기다린다연결요구를 기다린다 .. 요구가 도착했을 때 바이트들을 수신하고 받은것 을 다시 보내는

작업을 클라이언트가 종료할때 까지 반복한다 .

클라이언트 연결을 닫는다 .

Page 20: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

20

DieWithError.cDieWithError.c 와 와 HandleTCPClient.cHandleTCPClient.c

DieWithError.cDieWithError.c 어플리케이션들은 표준 에러 함수로 DieWithError() 를 사용

이 책의 모든 예제 어플리케이션과 같이 컴파일 및 링크 되어야 함

HandleTCPClient.cHandleTCPClient.c HandleTCPClient() 는 주어진 소켓으로 데이터를 수신하고 같은

소켓으로 그 데이터를 되돌려 보냄

recv() 가 양수를 반환하는 한 반복

recv() 는 데이터를 수신하거나 또는 클라이언트가 연결을 닫을 때까지 블록된다 .

클라이언트가 연결을 정상적으로 닫은 경우 , recv() 는 0 을 반환

Page 21: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

21

TCP Client/Server TCP Client/Server 통신 통신 (1)(1)

ClientClient

1.1. Create a TCP socketCreate a TCP socket

2.2. Establish connectionEstablish connection

3.3. CommunicateCommunicate

4.4. Close the connectionClose the connection

ServerServer

1.1. Create a TCP socketCreate a TCP socket

2.2. Assign a port to socketAssign a port to socket

3.3. Set socket to listenSet socket to listen

4.4. Repeatedly:Repeatedly:a. Accept new connectionb. Communicatec. Close the connection

server 는 client 의 연결을 받기 위한 준비를 한다 .server 는 client 의 연결을 받기 위한 준비를 한다 .

Page 22: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

22

TCP Client/Server TCP Client/Server 통신 통신 (2)(2)

ClientClient

1.1. Create a TCP socketCreate a TCP socket

2.2. Establish connectionEstablish connection

3.3. CommunicateCommunicate

4.4. Close the connectionClose the connection

ServerServer

1.1. Create a TCP socketCreate a TCP socket

2.2. Bind socket to a portBind socket to a port

3.3. Set socket to listenSet socket to listen

4.4. Repeatedly:Repeatedly:a. Accept new connectionb. Communicatec. Close the connection

/* 들어오는 연결을 위한 소켓을 생성 */ if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) DieWithError("socket() failed");

/* 들어오는 연결을 위한 소켓을 생성 */ if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) DieWithError("socket() failed");

Page 23: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

23

TCP Client/Server TCP Client/Server 통신 통신 (3)(3)

ClientClient

1.1. Create a TCP socketCreate a TCP socket

2.2. Establish connectionEstablish connection

3.3. CommunicateCommunicate

4.4. Close the connectionClose the connection

ServerServer

1.1. Create a TCP socketCreate a TCP socket

2.2. Bind socket to a portBind socket to a port

3.3. Set socket to listenSet socket to listen

4.4. Repeatedly:Repeatedly:a. Accept new connectionb. Communicatec. Close the connection

echoServAddr.sin_family = AF_INET; /* 인터넷 주소 패밀리 */ echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);/* Any incoming interface */ echoServAddr.sin_port = htons(echoServPort); /* Local port */

if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) DieWithError("bind() failed");

echoServAddr.sin_family = AF_INET; /* 인터넷 주소 패밀리 */ echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);/* Any incoming interface */ echoServAddr.sin_port = htons(echoServPort); /* Local port */

if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) DieWithError("bind() failed");

Page 24: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

24

TCP Client/Server TCP Client/Server 통신 통신 (4)(4)

ClientClient

1.1. Create a TCP socketCreate a TCP socket

2.2. Establish connectionEstablish connection

3.3. CommunicateCommunicate

4.4. Close the connectionClose the connection

ServerServer1.1. Create a TCP socketCreate a TCP socket

2.2. Bind socket to a portBind socket to a port

3.3. Set socket to listenSet socket to listen

4.4. Repeatedly:Repeatedly:a. Accept new connectionb. Communicatec. Close the connection

/* Mark the socket so it will listen for incoming connections */ if (listen(servSock, MAXPENDING) < 0) DieWithError("listen() failed");

/* Mark the socket so it will listen for incoming connections */ if (listen(servSock, MAXPENDING) < 0) DieWithError("listen() failed");

Page 25: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

25

TCP Client/Server TCP Client/Server 통신 통신 (5)(5)

ClientClient

1.1. Create a TCP socketCreate a TCP socket

2.2. Establish connectionEstablish connection

3.3. CommunicateCommunicate

4.4. Close the connectionClose the connection

ServerServer

1.1. Create a TCP socketCreate a TCP socket

2.2. Bind socket to a portBind socket to a port

3.3. Set socket to listenSet socket to listen

4.4. Repeatedly:Repeatedly:a. Accept new connectionb. Communicatec. Close the connection

for (;;) /* Run forever */{ clntLen = sizeof(echoClntAddr);

if ((clntSock=accept(servSock,(struct sockaddr *)&echoClntAddr,&clntLen)) < 0) DieWithError("accept() failed");

for (;;) /* Run forever */{ clntLen = sizeof(echoClntAddr);

if ((clntSock=accept(servSock,(struct sockaddr *)&echoClntAddr,&clntLen)) < 0) DieWithError("accept() failed");

Page 26: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

26

TCP Client/Server TCP Client/Server 통신 통신 (6)(6)

ClientClient

1.1. Create a TCP socketCreate a TCP socket

2.2. Establish connectionEstablish connection

3.3. CommunicateCommunicate

4.4. Close the connectionClose the connection

ServerServer

1.1. Create a TCP socketCreate a TCP socket

2.2. Bind socket to a portBind socket to a port

3.3. Set socket to listenSet socket to listen

4.4. Repeatedly:Repeatedly:a. Accept new connectionb. Communicatec. Close the connection

서버는 클라이언트로부터 연결을 기다리기 위해 블록되어 진다.서버는 클라이언트로부터 연결을 기다리기 위해 블록되어 진다.

Page 27: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

27

TCP Client/Server TCP Client/Server 통신 통신 (7)(7)

ClientClient

1.1. Create a TCP socketCreate a TCP socket

2.2. Establish connectionEstablish connection

3.3. CommunicateCommunicate

4.4. Close the connectionClose the connection

ServerServer

1.1. Create a TCP socketCreate a TCP socket

2.2. Bind socket to a portBind socket to a port

3.3. Set socket to listenSet socket to listen

4.4. Repeatedly:Repeatedly:a. Accept new connectionb. Communicatec. Close the connection

클라이언트가 서버에 연결을 시도하려 한다 .클라이언트가 서버에 연결을 시도하려 한다 .

Page 28: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

28

TCP Client/Server TCP Client/Server 통신 통신 (8)(8)

ClientClient

1.1. Create a TCP socketCreate a TCP socket

2.2. Establish connectionEstablish connection

3.3. CommunicateCommunicate

4.4. Close the connectionClose the connection

ServerServer

1.1. Create a TCP socketCreate a TCP socket

2.2. Bind socket to a portBind socket to a port

3.3. Set socket to listenSet socket to listen

4.4. Repeatedly:Repeatedly:a. Accept new connectionb. Communicatec. Close the connection

/* Create a reliable, stream socket using TCP */ if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) DieWithError("socket() failed");

/* Create a reliable, stream socket using TCP */ if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) DieWithError("socket() failed");

Page 29: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

29

TCP Client/Server TCP Client/Server 통신 통신 (9)(9)

ClientClient

1.1. Create a TCP socketCreate a TCP socket

2.2. Establish connectionEstablish connection

3.3. CommunicateCommunicate

4.4. Close the connectionClose the connection

ServerServer

1.1. Create a TCP socketCreate a TCP socket

2.2. Bind socket to a portBind socket to a port

3.3. Set socket to listenSet socket to listen

4.4. Repeatedly:Repeatedly:a. Accept new connectionb. Communicatec. Close the connection

echoServAddr.sin_family = AF_INET; /* Internet address family */ echoServAddr.sin_addr.s_addr = inet_addr(servIP); /* Server IP address */ echoServAddr.sin_port = htons(echoServPort); /* Server port */

if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) DieWithError("connect() failed");

echoServAddr.sin_family = AF_INET; /* Internet address family */ echoServAddr.sin_addr.s_addr = inet_addr(servIP); /* Server IP address */ echoServAddr.sin_port = htons(echoServPort); /* Server port */

if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) DieWithError("connect() failed");

Page 30: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

30

TCP Client/Server TCP Client/Server 통신 통신 (10)(10)

ClientClient

1.1. Create a TCP socketCreate a TCP socket

2.2. Establish connectionEstablish connection

3.3. CommunicateCommunicate

4.4. Close the connectionClose the connection

ServerServer

1.1. Create a TCP socketCreate a TCP socket

2.2. Bind socket to a portBind socket to a port

3.3. Set socket to listenSet socket to listen

4.4. Repeatedly:Repeatedly:a. Accept new connectionb. Communicatec. Close the connection

echoStringLen = strlen(echoString); /* Determine input length */

/* Send the string to the server */ if (send(sock, echoString, echoStringLen, 0) != echoStringLen) DieWithError("send() sent a different number of bytes than expected");

echoStringLen = strlen(echoString); /* Determine input length */

/* Send the string to the server */ if (send(sock, echoString, echoStringLen, 0) != echoStringLen) DieWithError("send() sent a different number of bytes than expected");

Page 31: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

31

TCP Client/Server TCP Client/Server 통신 통신 (11)(11)

ClientClient

1.1. Create a TCP socketCreate a TCP socket

2.2. Establish connectionEstablish connection

3.3. CommunicateCommunicate

4.4. Close the connectionClose the connection

ServerServer

1.1. Create a TCP socketCreate a TCP socket

2.2. Bind socket to a portBind socket to a port

3.3. Set socket to listenSet socket to listen

4.4. Repeatedly:Repeatedly:a. Accept new connectionb. Communicatec. Close the connection

/* Receive message from client */ if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE, 0)) < 0) DieWithError("recv() failed");

/* Receive message from client */ if ((recvMsgSize = recv(clntSocket, echoBuffer, RCVBUFSIZE, 0)) < 0) DieWithError("recv() failed");

Page 32: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

32

TCP Client/Server TCP Client/Server 통신 통신 (12)(12)

ClientClient

1.1. Create a TCP socketCreate a TCP socket

2.2. Establish connectionEstablish connection

3.3. CommunicateCommunicate

4.4. Close the connectionClose the connection

ServerServer

1.1. Create a TCP socketCreate a TCP socket

2.2. Bind socket to a portBind socket to a port

3.3. Set socket to listenSet socket to listen

4.4. Repeatedly:Repeatedly:a. Accept new connectionb. Communicatec. Close the connection

close(sock); close(clntSocket) close(sock); close(clntSocket)

Page 33: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

33

실행 결과 화면실행 결과 화면

ServerServer ClientClient

Page 34: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

34

참고문헌참고문헌

UNIX Network Programming, UNIX Network Programming, 교보문고교보문고

Linux Socket Programming by Example, Warren W. Gay, Linux Socket Programming by Example, Warren W. Gay,

QUE '00QUE '00

http://kldp.org/Translations/html/Socket_Programming-KLDP/Sochttp://kldp.org/Translations/html/Socket_Programming-KLDP/Soc

ket_Programming -KLDP.htmlket_Programming -KLDP.html

Page 35: Chapter 2   소켓 기본

HANNAM UNIVERSITY

TCP/IP 소켓 프로그래밍 - C 버전…

http://netwk.hannam.ac.kr

35

Q & AQ & A