2 . tcp 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/np_2_1.pdf · $...

42
2 . TCP 소켓 네트워크 프로그램 설계 목포해양대 해양컴퓨터공학과 1

Upload: others

Post on 06-Sep-2019

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

2장. TCP 소켓네트워크 프로그램 설계

목포

해양

대해

양컴

퓨터

공학

1

Page 2: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

목차

제 2장 TCP 소켓

1. IPv4 TCP 클라이언트

2. IPv4 TCP 서버

3. 소켓의 생성과 해지

4. 주소 지정

5. 소켓에 연결

6. 소켓을 주소에 바인딩하기

7. 클라이언트의 연결 요청 처리

8. 데이터 주고받기

9. IPv6의 사용 목포

해양

대해

양컴

퓨터

공학

2

Page 3: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

소켓통신과정

간략화한 소켓 통신 과정

소켓 생성

• TCP or UDP

소켓에 주소 정보 할당

• IP address, Port number

소켓 연결

• 클라이언트 소켓과 서버 소켓 연결

• bind(), listen(), connect(), accept()

데이터 전송

• send(), recv()

목포

해양

대해

양컴

퓨터

공학

3

Page 4: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP/IP 소켓의생성

소켓 생성 어떠한 소켓을 생성할 것인가를 명시(프로토콜 종류)

TCP/IP 소켓의 경우

Socket 식별자 UNIX의 파일 식별자와 동일

Windows의 경우, WinSock에서 사용하는 소켓 핸들• Windows의 경우, 파일 핸들과 같지 않음

반환 값: 소켓 식별자인 양의 정수, 에러의 경우 ‘-1’

목포

해양

대해

양컴

퓨터

공학

4

Family Type Protocol

TCPPF_INET

SOCK_STREAM IPPROTO_TCP

UDP SOCK_DGRAM IPPROTO_UDP

int socket(int family, int type, int proto);

Page 5: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP/IP 소켓식별자

유닉스/리눅스 계열에서 식별자 공간

목포

해양

대해

양컴

퓨터

공학

5

Descriptor Table

0

1

2

3

4

Data structure for file 0

Data structure for file 1

Family: PF_INETService: SOCK_STREAMLocal IP: 111.22.3.4Remote IP: 123.45.6.78Local Port: 2249Remote Port: 3726

Page 6: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP/IP 소켓의주소지정 (1)

struct sockaddr 사용

여러 가지 프로토콜을 사용하기 때문에

• 1) 프로토콜 종류

• 2) 주소를 지정해야 함

TCP/IP의 경우는 인터넷 주소임을 알리는AF_INET, IP 주소, Port번호가 필요

• IP : IPv4 주소 형식과 IPv6 주소 형식으로 나뉨

• Port : TCP/UDP 관계없이 0 ~ 65535 사이의 값사용

well-known (port 0-1023)

dynamic or private (port 1024-65535) 목포

해양

대해

양컴

퓨터

공학

6

Page 7: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP/IP 소켓의주소지정 (2)

범용(Generic) 소켓 주소 구조체

IPv4에 사용되는 소켓 주소 구조체

목포

해양

대해

양컴

퓨터

공학

7

struct sockaddr

{

unsigned short sa_family; /* Address family (e.g., AF_INET) */

char sa_data[14]; /* Protocol-specific address information */

};

struct sockaddr_in

{

unsigned short sin_family; /* Internet protocol (AF_INET) */

unsigned short sin_port; /* Port (16-bits) */

struct in_addr sin_addr; /* Internet address (32-bits) */

char sin_zero[8]; /* Not used */

};

struct in_addr

{

unsigned long s_addr; /* Internet address (32-bits) */

};

Page 8: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP/IP 소켓의주소지정 (3)

IPv6에 사용되는 소켓 주소 구조체

모든 종류의 sockaddr을 수용하기 위한 구조체 목포

해양

대해

양컴

퓨터

공학

8

struct sockaddr_in6

{

sa_family_t sin6_family; // Internet protocol(AF_INET6)

in_port_t sin6_port; // Address port(16bits)

uint32_t sin6_flowinfo; // Flow information

struct in6_addr sin6_addr; // IPv6 address(128bits)

uint32_t sin6_scope_id; // Scope identifier

};

struct in_addr{

uint32_t s_addr[16]; // Internet address(128bits)

};

struct sockaddr_storage

{

sa_family_t

};

Page 9: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

주소정보를소켓에할당

bind()를 사용하여 주소 정보를 생성된 소켓에 할당

성공 시 ‘0’, 실패 시 ‘-1’

목포

해양

대해

양컴

퓨터

공학

9

int mysock,err;struct sockaddr_in myaddr;char* servIP; /* ex)202.30.49.84 */

mysock = socket(PF_INET,SOCK_STREAM,0);myaddr.sin_family = AF_INET;myaddr.sin_port = htons( portnum );myaddr.sin_addr.s_addr = inet_addr(servIP);

err=bind(mysock, (sockaddr *) &myaddr, sizeof(myaddr));

int bind( int sockfd, struct sockaddr *localaddr, int addrlen);

Page 10: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

클라이언트 –서버통신

클라이언트가 먼저 서버에게 연결 요청

서버의 프로세스는 미리 소켓을 열고 대기하고 있어야 함

서버는 특정 포트를 열고 대기하여야 하며 클라이언트는 이포트를 알고 있어야 함

클라이언트는 서버에 연결

이때 클라이언트는 서버의 IP, Port 정보를 응용 프로그램에게명시하여 접속 가능

목포

해양

대해

양컴

퓨터

공학

10

Page 11: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP 연결흐름도

목포

해양

대해

양컴

퓨터

공학

11

다음클라이언트로부터연결 요청을기다림

연결 요청

Page 12: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

서버의연결대기함수-listen() TCP와 같은 연결 지향 서버에 사용

소켓의 상태를 대기 상태로 바꿈

socket: 생성된 소켓의 식별자

queuelimit : 연결을 수행 중에 다른 연결이 들어오면 연결요청을 queue에 넣고 보류, 이때 사용하는 queue의 크기

목포

해양

대해

양컴

퓨터

공학

12

int listen(int socket, int queuelimit);

Page 13: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

서버의연결대기함수-accept()

listen()호출 후, accept()를 수행하면

클라이언트의 연결 요청(connect())에 대해 응답함

passive open

클라이언트와 데이터 송수신(send/recv)이 가능한 새로운 소켓식별자를 반환

목포

해양

대해

양컴

퓨터

공학

13

int accept(int socket, struct sockaddr *clientAddress, int *addr_len);

Page 14: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

클라이언트의연결함수 -Connect()

클라이언트는 connect()를 호출하여 연결의 상태를 ‘active open’으로 만듬

foreignAddress는 서버의 IP, port를 담고 있는 주소 구조체

목포

해양

대해

양컴

퓨터

공학

14

int connect(int socket, struct sockaddr *foreignAddress, int addr_len);

Page 15: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

Send(to), Recv(from)

연결이 이루어진 후에는 send/recv를 이용하여 데이터의송수신이 가능

목포

해양

대해

양컴

퓨터

공학

15

int send(int socket, char *message, int msg_len, int flags);

주어진 소켓을 통하여 message의 송신이 가능

int recv(int scoket, char *buffer, int buf_len, int flags);

주어진 소켓을 통해 주어진 buffer에 데이터를 수신

Page 16: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

클라이언트와서버의통신

클라이언트 : 연결을 초기화 하는 주체

서버 : 수동적으로 연결을 기다림 목포

해양

대해

양컴

퓨터

공학

16

Client: Bob

“Hi. I’m Bob.”

Server: Jane

“Hi, Bob. I’m Jane”

“Nice to meet you, Jane.”

Page 17: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP 상의서버/클라이언트통신 (1)

서버는 클라이언트의 연결을 받아들일 준비를 하고 시작

목포

해양

대해

양컴

퓨터

공학

17

클라이언트

1. TCP 소켓 생성2. 연결 설정3. 데이터 송수신4. 연결 종료

서버

1. TCP 소켓 생성2. 소켓에 포트 할당3. 소켓 상태를 대기(listen)로

변경4. 다음을 반복적으로 수행

a. 새로운 연결을 받아들임b. 데이터 송수신c. 연결을 종료

Page 18: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP 상의서버/클라이언트통신 (2)

목포

해양

대해

양컴

퓨터

공학

18

클라이언트

1. TCP 소켓 생성2. 연결 설정3. 데이터 송수신4. 연결 종료

서버

1. TCP 소켓 생성2. 소켓에 포트 할당3. 소켓 상태를 대기(listen)로

변경4. 다음을 반복적으로 수행

a. 새로운 연결을 받아들임b. 데이터 송수신c. 연결을 종료

/* Create socket for incoming connections */

if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)DieWithSystemMessage("socket() failed");

Page 19: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP 상의서버/클라이언트통신 (3)

목포

해양

대해

양컴

퓨터

공학

19

클라이언트

1. TCP 소켓 생성2. 연결 설정3. 데이터 송수신4. 연결 종료

서버

1. TCP 소켓 생성2. 소켓에 포트 할당3. 소켓 상태를 대기(listen)로

변경4. 다음을 반복적으로 수행

a. 새로운 연결을 받아들임b. 데이터 송수신c. 연결을 종료

echoServAddr.sin_family = AF_INET; /* Internet address family */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)DieWithSystemMessage("bind() failed");

Page 20: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP 상의서버/클라이언트통신 (4)

목포

해양

대해

양컴

퓨터

공학

20

클라이언트

1. TCP 소켓 생성2. 연결 설정3. 데이터 송수신4. 연결 종료

서버

1. TCP 소켓 생성2. 소켓에 포트 할당3. 소켓 상태를 대기(listen)로

변경4. 다음을 반복적으로 수행

a. 새로운 연결을 받아들임b. 데이터 송수신c. 연결을 종료

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

DieWithSystemMessage("listen() failed");

Page 21: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP 상의서버/클라이언트통신 (5)

목포

해양

대해

양컴

퓨터

공학

21

클라이언트

1. TCP 소켓 생성2. 연결 설정3. 데이터 송수신4. 연결 종료

서버

1. TCP 소켓 생성2. 소켓에 포트 할당3. 소켓 상태를 대기(listen)로

변경4. 다음을 반복적으로 수행

a. 새로운 연결을 받아들임b. 데이터 송수신c. 연결을 종료

for (;;) /* Run forever */{

clntLen = sizeof(echoClntAddr);

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

Page 22: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP 상의서버/클라이언트통신 (6)

서버는 이 시점에서 클라이언트의 연결을 처리하기 위해서대기

클라이언트는 서버에 연결 시도

목포

해양

대해

양컴

퓨터

공학

22

클라이언트

1. TCP 소켓 생성2. 연결 설정3. 데이터 송수신4. 연결 종료

서버

1. TCP 소켓 생성2. 소켓에 포트 할당3. 소켓 상태를 대기(listen)로

변경4. 다음을 반복적으로 수행

a. 새로운 연결을 받아들임b. 데이터 송수신c. 연결을 종료

Page 23: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP 상의서버/클라이언트통신 (7)

목포

해양

대해

양컴

퓨터

공학

23

클라이언트

1. TCP 소켓 생성2. 연결 설정3. 데이터 송수신4. 연결 종료

서버

1. TCP 소켓 생성2. 소켓에 포트 할당3. 소켓 상태를 대기(listen)로

변경4. 다음을 반복적으로 수행

a. 새로운 연결을 받아들임b. 데이터 송수신c. 연결을 종료

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

DieWithSystemMessage("socket() failed");

Page 24: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP 상의서버/클라이언트통신 (8)

목포

해양

대해

양컴

퓨터

공학

24

클라이언트

1. TCP 소켓 생성2. 연결 설정3. 데이터 송수신4. 연결 종료

서버

1. TCP 소켓 생성2. 소켓에 포트 할당3. 소켓 상태를 대기(listen)로

변경4. 다음을 반복적으로 수행

a. 새로운 연결을 받아들임b. 데이터 송수신c. 연결을 종료

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)DieWithSystemMessage ("connect() failed");

Page 25: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP 상의서버/클라이언트통신 (9)

목포

해양

대해

양컴

퓨터

공학

25

클라이언트

1. TCP 소켓 생성2. 연결 설정3. 데이터 송수신4. 연결 종료

서버

1. TCP 소켓 생성2. 소켓에 포트 할당3. 소켓 상태를 대기(listen)로

변경4. 다음을 반복적으로 수행

a. 새로운 연결을 받아들임b. 데이터 송수신c. 연결을 종료

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

Page 26: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP 상의서버/클라이언트통신 (10)

목포

해양

대해

양컴

퓨터

공학

26

클라이언트

1. TCP 소켓 생성2. 연결 설정3. 데이터 송수신4. 연결 종료

서버

1. TCP 소켓 생성2. 소켓에 포트 할당3. 소켓 상태를 대기(listen)로

변경4. 다음을 반복적으로 수행

a. 새로운 연결을 받아들임b. 데이터 송수신c. 연결을 종료

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

/* Send the string to the server */if (send(sock, echoString, echoStringLen, 0) != echoStringLen)

DieWithUserMessage ("send() sent a different number of bytes than expected");

Page 27: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP 상의서버/클라이언트통신 (11)

목포

해양

대해

양컴

퓨터

공학

27

클라이언트

1. TCP 소켓 생성2. 연결 설정3. 데이터 송수신4. 연결 종료

서버

1. TCP 소켓 생성2. 소켓에 포트 할당3. 소켓 상태를 대기(listen)로

변경4. 다음을 반복적으로 수행

a. 새로운 연결을 받아들임b. 데이터 송수신c. 연결을 종료

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

DieWithSystemMessage("recv() failed");

Page 28: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP 상의서버/클라이언트통신 (12)

목포

해양

대해

양컴

퓨터

공학

28

클라이언트

1. TCP 소켓 생성2. 연결 설정3. 데이터 송수신4. 연결 종료

서버

1. TCP 소켓 생성2. 소켓에 포트 할당3. 소켓 상태를 대기(listen)로

변경4. 다음을 반복적으로 수행

a. 새로운 연결을 받아들임b. 데이터 송수신c. 연결을 종료

close(sock); close(clntSocket);

Page 29: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCP 데이터교환

클라이언트는 사전에 서버의 주소 정보(IP, port)를알아야함

서버는 클라이언트가 접속할 포트만 정하고 있음

send()와 recv() 간에는 어떠한 정해진 룰이 없음

목포

해양

대해

양컴

퓨터

공학

29

Clientsend(“Hello Bob”)

recv() -> “Hi Jane”

Server

recv() -> “Hello ”

recv() -> “Bob”

send(“Hi ”)

send(“Jane”)

Page 30: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

연결종료

연결을 종료하기 위해서 close()를 사용

파일의 EOF와 유사

목포

해양

대해

양컴

퓨터

공학

30

echo Client

send(string)

while (not received entire string)

recv(buffer)

print(buffer)

close(socket)

echo Server

recv(buffer)

while(client has not closed connection)

send(buffer)

recv(buffer)

close(client socket)

Page 31: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

Practical.h

목포

해양

대해

양컴

퓨터

공학

31

Page 32: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCPEchoClient4.c (1)

목포

해양

대해

양컴

퓨터

공학

32

Page 33: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCPEchoClient4.c (2)

목포

해양

대해

양컴

퓨터

공학

33

Page 34: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCPEchoClient4.c (3)

목포

해양

대해

양컴

퓨터

공학

34

Page 35: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCPEchoServer4.c (1)

목포

해양

대해

양컴

퓨터

공학

35

Page 36: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

TCPEchoServer4.c (2)

목포

해양

대해

양컴

퓨터

공학

36

Page 37: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

HandleTCPClient() inTCPServerUtility.c

목포

해양

대해

양컴

퓨터

공학

37

Page 38: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

Makefile

목포

해양

대해

양컴

퓨터

공학

38

Page 39: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

DieWithMessage.c

목포

해양

대해

양컴

퓨터

공학

39

Page 40: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

AddressUtility.c (1)

목포

해양

대해

양컴

퓨터

공학

40

Page 41: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

AddressUtility.c (2)

목포

해양

대해

양컴

퓨터

공학

41

Page 42: 2 . TCP 소켓 해양컴퓨터공학과 - lily.mmu.ac.krlily.mmu.ac.kr/lecture/18np/NP_2_1.pdf · $ gcc  -o   주의

컴파일방법 –리눅스환경

Native 리눅스/VMware 리눅스/ Cygwin 환경

목포

해양

대해

양컴

퓨터

공학

42

• 유닉스 기반 (iris.mmu.ac.kr) $ gcc <컴파일 옵션> -o <실행파일> <소스파일들> -lsocket –lnsl

• 리눅스 기반 (lily.mmu.ac.kr) $ gcc <컴파일 옵션> -o <실행파일> <소스파일들>

주의

• –std=c99로 컴파일할 때 일부 헤더파일(netdb.h)을 제대로 포함시키지못하는 오류가 확인되었습니다.

• -std=gnu99로 컴파일!!!