본 강의에 들어가기 전

Similar documents
본 강의에 들어가기 전

본 강의에 들어가기 전

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

vi 사용법

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

PowerPoint 프레젠테이션

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

Microsoft PowerPoint - 12 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 1.ppt

Microsoft PowerPoint - Supplement-02-Socket Overview.ppt [호환 모드]

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

제1장 Unix란 무엇인가?

2009년 상반기 사업계획

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

슬라이드 1

PowerPoint 프레젠테이션

Chapter 4 UDP 소켓 사용법

IPv6 적용

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >

The Pocket Guide to TCP/IP Sockets: C Version

<43B7CE20BECBBEC6BAB8B4C220BCD2C4CFC7C1B7CEB1D7B7A1B9D62E687770>

PowerPoint 프레젠테이션

제1장 Unix란 무엇인가?

Microsoft Word - KPMC-400,401 SW 사용 설명서

Microsoft PowerPoint - 13 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 2.ppt

Microsoft PowerPoint - 06-CompSys-16-Socket.ppt

슬라이드 1

Microsoft Word - Network Programming_NewVersion_01_.docx

SYN flooding

Microsoft PowerPoint - 15-EmbedSW-10-Socket

슬라이드 1

Microsoft PowerPoint - 04-UDP Programming.ppt

Microsoft PowerPoint - 09-CE-23-윈도우 소켓

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

2009년 상반기 사업계획

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - 03-TCP Programming.ppt

3. 다음장에나오는 sigprocmask 함수의설명을참고하여다음프로그램의출력물과그출력물이화면이표시되는시점을예측하세요. ( 힌트 : 각줄이표시되는시점은다음 6 가지중하나. (1) 프로그램수행직후, (2) 5 초후 (3) 10 초후 (4) 15 #include <signa

[ 목차 ] 1. 취약점개요 2. 배경지식 3. 취약점발생결과 (exploit 테스트 ) 4. 취약점발생원인분석 4.1 취약점 Q&A 5. exploit 분석 6. 보안대책 7. 결론 8. 레퍼런스 2

6주차.key

슬라이드 1

K&R2 Reference Manual 번역본

학번 : 이름 1. 다음프로그램실행결과를예측하시오. $./a.out & [1] 7216 $ kill -USR $ kill -USR 아래학생이작성한쓰레드코드의문제점을설명하시오. void* thread_main() { pthread_mutex_t

untitled

<43B7CE20BECBBEC6BAB8B4C C5EBBDC52E687770>

9장 윈도우 소켓 프로그래밍

bn2019_2

3. 다음장에나오는 sigprocmask 함수의설명을참고하여다음프로그램의출력물과그출력물이화면이표시되는시점을예측하세요. ( 힌트 : 각줄이표시되는시점은다음 4 가지중하나. (1) 프로그램수행직후, (2) kill 명령실행직후, (3) 15 #include <signal.

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

<4D F736F F D204B FC7C1B7CEB1D7B7A55FC0AFB4D0BDBA20B1E2B9DD20BCD2C4CF20C7C1B7CEB1D7B7A1B9D65FC0CCC8A3BCBA2E646F63>

chap7.key

슬라이드 1

PowerPoint 프레젠테이션

Microsoft PowerPoint PythonGUI-socket

The Pocket Guide to TCP/IP Sockets: C Version

Chapter #01 Subject

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

목차 목차포트스캔코드포트스캔결과포트스캔탐지코드포트스캔탐지결과 참조

PowerPoint 프레젠테이션

hd1300_k_v1r2_Final_.PDF

SMB_ICMP_UDP(huichang).PDF

0x00 Contents 0x About Nickster 0x Analaysis 0x Exploit

PowerPoint 프레젠테이션

1217 WebTrafMon II


/chroot/lib/ /chroot/etc/

Network Programming

Microsoft Word doc

10. 시스템 프로그래밍

C++-¿Ïº®Çؼ³10Àå


Network Programming

슬라이드 1

제1장 Unix란 무엇인가?

4. What will be the output of this program? Explain results for each variable and each thread. #include "apue.h" int var=1; pthread_mutex_t lock; void

chapter4

자바-11장N'1-502

TCP.IP.ppt

PowerPoint 프레젠테이션

Unix Network Programming Chapter 4. Elementary TCP Sockets

13주-14주proc.PDF

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

Microsoft PowerPoint UnixNetProg.ppt [호환 모드]


Microsoft PowerPoint - Lecture_Note_2.ppt [Compatibility Mode]

Microsoft PowerPoint - UnixNetProg.ppt [호환 모드]

歯9장.PDF

hd132x_k_v1r3_Final_.PDF

1. What is AX1 AX1 Program은 WIZnet 사의 Hardwired TCP/IP Chip인 iinchip 들의성능평가및 Test를위해제작된 Windows 기반의 PC Program이다. AX1은 Internet을통해 iinchip Evaluation

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

USB USB DV25 DV25 REC SRN-475S REC SRN-475S LAN POWER LAN POWER Quick Network Setup Guide xdsl/cable Modem PC DVR 1~3 1.. DVR DVR IP xdsl Cable xdsl C

Microsoft PowerPoint - 09-CE-24-채팅 프로그램

PWR PWR HDD HDD USB USB Quick Network Setup Guide xdsl/cable Modem PC DVR 1~3 1.. DVR DVR IP xdsl Cable xdsl Cable PC PC DDNS (

11장 포인터

Microsoft PowerPoint C-구조체

Sena Device Server Serial/IP TM Version

Transcription:

인터넷프로토콜 02 장 TCP 소켓

목차 제 2 장 TCP 소켓 2.1 IPv4 TCP 클라이언트 2.2 IPv4 TCP 서버 2.3 소켓의생성과해지 2.4 주소지정 2.5 소켓에연결 2.6 소켓을주소에바인딩하기 2.7 클라이언트의연결요청처리 2.8 데이터주고받기 2.9 IPv6 의사용

소켓통신과정 간략화한소켓통신과정 소켓생성 TCP or UDP 소켓에주소정보할당 IP address, Port number 소켓연결 클라이언트소켓과서버소켓연결 bind(), listen(), connect(), accept() 데이터전송 send(), recv()

TCP/IP 소켓의생성 소켓생성 어떠한소켓을생성할것인가를명시 ( 프로토콜종류 ) int socket(int family,int type,int proto); TCP/IP 소켓의경우 Family Type Protocol TCP PF_INET SOCK_STREAM IPPROTO_TCP UDP SOCK_DGRAM IPPROTO_UDP Socket 식별자 UNIX의파일식별자와동일 Windows의경우, WinSock에서사용하는소켓핸들 Windows의경우, 파일핸들과같지않음 반환값 : 소켓식별자인양의정수, 에러의경우 -1

TCP/IP 소켓식별자 유닉스 / 리눅스계열에서식별자공간 0 1 Descriptor Table Data structure for file 0 Data structure for file 1 2 3 4 Family: PF_INET Service: SOCK_STREAM Local IP: 111.22.3.4 Remote IP: 123.45.6.78 Local Port: 2249 Remote Port: 3726

TCP/IP 소켓의주소지정 (1) struct sockaddr 사용 여러가지프로토콜을사용하기때문에 1) 프로토콜종류, 2) 주소를지정해야함 TCP/IP 의경우는인터넷주소임을알리는 AF_INET, IP 주소, Port 번호가필요 IP : IPv4 주소형식과 IPv6 주소형식으로나뉨 Ports : TCP/UDP 관계없이 0~65535 사이의값사용 well-known (port 0-1023) dynamic or private (port 1024-65535)

TCP/IP 소켓의주소지정 (2) 범용 (Generic) 소켓주소구조체 struct sockaddr { unsigned short sa_family; /* Address family (e.g., AF_INET) */ char sa_data[14]; /* Protocol-specific address information */ }; IPv4 에사용되는소켓주소구조체 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) */ }; 교재본문과비교 sockaddr Family Blob 2 bytes 2 bytes 4 bytes 8 bytes sockaddr_in Family Port Internet address Not used

TCP/IP 소켓의주소지정 (3) IPv6 에사용되는소켓주소구조체 struct sockaddr_in6 { sa_family_t sin6_family; in_port_t sin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr; uint32_t sin6_scope_id; }; // Internet protocol(af_inet6) // Address port(16bits) // Flow information // IPv6 address(128bits) // Scope identifier struct in_addr{ uint32_t s_addr[16]; }; // Internet address(128bits) 모든종류의 sockaddr 을수용하기위한구조체 struct sockaddr_storage { sa_family_t };

주소정보를소켓에할당 bind() 를사용하여주소정보를생성된소켓에할당 int bind( int sockfd, struct sockaddr *localaddr, int addrlen); 성공시 0, 실패시 -1 int mysock,err; struct sockaddr_in myaddr; char* servip; /* ex)203.252.164.143 */ 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));

클라이언트 서버통신 클라이언트가먼저서버에게연결요청 서버의프로세스는미리소켓을열고대기하고있어야함 서버는특정포트를열고대기하여야하며클라이언트는이포트를알고있어야함 클라이언트는서버에연결 이때클라이언트는서버의 IP, Port 정보를응용프로그램에게명시하여접속가능

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

서버의연결대기함수 - listen() TCP 와같은연결지향서버에사용 소켓의상태를대기상태로바꿈 int listen(int socket, int queuelimit); socket: 생성된소켓의식별자 queuelimit : 연결을수행중에다른연결이들어오면연결요청을 queue 에넣고보류, 이때사용하는 queue 의크기

서버의연결대기함수 - accept() int accept(int socket, struct sockaddr *clientdaddress, int addr_len); listen() 호출후, accept() 를수행하면 클라이언트의연결요청 (connect()) 에대해응답합 passive open 클라이언트와데이터송수신 (send/recv) 이가능한새로운소켓식별자를반환

클라이언트의연결함수 - Connect() int connect(int socket, struct sockaddr *foreignaddress, int addr_len); 클라이언트는 connect() 를호출하여연결의상태를 active open 으로만듬 foreignaddress 는서버의 IP, port 를담고있는주소구조체

Send(to), Recv(from) 연결이이루어진후에는 send/recv 를이용하여데이터의송수신이가능 int send(int socket, char *message, int msg_len, int flags); 주어진소켓을통하여 message 의송신이가능 int recv(int scoket, char *buffer, int buf_len, int flags) 주어진소켓을통해주어진 buffer 에데이터를수신

클라이언트와서버의통신 클라이언트 : 연결을초기화하는주체 Client: Bob Server: Jane Hi. I m Bob. Hi, Bob. I m Jane Nice to meet you, Jane. 서버 : 수동적으로연결을기다림

TCP 상의서버 / 클라이언트통신 서버는클라이언트의연결을받아들일준비를하고시작 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료

TCP 상의서버 / 클라이언트통신 /* Create socket for incoming connections */ if ((servsock = socket(pf_inet, SOCK_STREAM, IPPROTO_TCP)) < 0) DieWithSystemMessage("socket() failed"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료

TCP 상의서버 / 클라이언트통신 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"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료

TCP 상의서버 / 클라이언트통신 /* Mark the socket so it will listen for incoming connections */ if (listen(servsock, MAXPENDING) < 0) DieWithSystemMessage("listen() failed"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료

TCP 상의서버 / 클라이언트통신 for (;;) /* Run forever */ { clntlen = sizeof(echoclntaddr); if ((clntsock=accept(servsock,(struct sockaddr *)&echoclntaddr,&clntlen)) < 0) DieWithError("accept() failed"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료

TCP 상의서버 / 클라이언트통신 서버는이시점에서클라이언트의연결을처리하기위해서대기 클라이언트는서버에연결시도 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료

TCP 상의서버 / 클라이언트통신 /* Create a reliable, stream socket using TCP */ if ((sock = socket(pf_inet, SOCK_STREAM, IPPROTO_TCP)) < 0) DieWithSystemMessage("socket() failed"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료

TCP 상의서버 / 클라이언트통신 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"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료

TCP 상의서버 / 클라이언트통신 if ((clntsock=accept(servsock,(struct sockaddr *)&echoclntaddr,&clntlen)) < 0) DieWithError("accept() failed"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료

TCP 상의서버 / 클라이언트통신 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"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료

TCP 상의서버 / 클라이언트통신 /* Receive message from client */ if ((recvmsgsize = recv(clntsocket, echobuffer, RCVBUFSIZE, 0)) < 0) DieWithSystemMessage("recv() failed"); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료

TCP 상의서버 / 클라이언트통신 close(sock); close(clntsocket); 서버 클라이언트 2. 연결설정 3. 데이터송수신 4. 연결종료 2. 소켓에포트할당 3. 소켓상태를대기 (listen) 로변경 4. 다음을반복적으로수행 a. 새로운연결을받아들임 b. 데이터송수신 c. 연결을종료

TCP 데이터교환 클라이언트는사전에서버의주소정보 (IP, port) 를알아야함 서버는클라이언트가접속할포트만정하고있음 send() 와 recv() 간에는어떠한정해진룰이없음 Client send( Hello Bob ) recv() -> Hi Jane Server recv() -> Hello recv() -> Bob send( Hi ) send( Jane )

연결종료 연결을종료하기위해서 close() 를사용 파일의 EOF 와유사 echo Client echo Server send(string) while (not received entire string) recv(buffer) print(buffer) recv(buffer) while(client has not closed connection) send(buffer) recv(buffer) close(socket) close(client socket)

Practical.h #ifndef PRACTICAL_H_ #define PRACTICAL_H_ #include <stdbool.h> #include <stdio.h> #include <sys/socket.h> // Handle error with user msg void DieWithUserMessage(const char *msg, const char *detail); // Handle error with sys msg void DieWithSystemMessage(const char *msg); // Print socket address void PrintSocketAddress(const struct sockaddr *address, FILE *stream); // Test socket address equality bool SockAddrsEqual(const struct sockaddr *addr1, const struct sockaddr *addr2); // Create, bind, and listen a new TCP server socket int SetupTCPServerSocket(const char *service); // Accept a new TCP connection on a server socket int AcceptTCPConnection(int servsock); // Handle new TCP client void HandleTCPClient(int clntsocket); // Create and connect a new TCP client socket int SetupTCPClientSocket(const char *server, const char *service); enum sizeconstants { MAXSTRINGLENGTH = 128, BUFSIZE = 512, }; #endif // PRACTICAL_H_

TCPEchoClient4.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5 #include <sys/types.h> 6 #include <sys/socket.h> 7 #include <netinet/in.h> 8 #include <arpa/inet.h> 9 #include "Practical.h" 10 11 int main(int argc, char *argv[]) { 12 13 if (argc < 3 argc > 4) // Test for correct number of arguments 14 DieWithUserMessage("Parameter(s)", 15 "<Server Address> <Echo Word> [<Server Port>]"); 16 17 char *servip = argv[1]; // First arg: server IP address (dotted quad) 18 char *echostring = argv[2]; // Second arg: string to echo 19 20 // Third arg (optional): server port (numeric). 7 is well-known echo port 21 in_port_t servport = (argc == 4)? atoi(argv[3]) : 7; 22 23 // Create a reliable, stream socket using TCP 24 int sock = socket(af_inet, SOCK_STREAM, IPPROTO_TCP); 25 if (sock < 0) 26 DieWithSystemMessage("socket() failed");

TCPEchoClient4.c 27 28 // Construct the server address structure 29 struct sockaddr_in servaddr; // Server address 30 memset(&servaddr, 0, sizeof(servaddr)); // Zero out structure 31 servaddr.sin_family = AF_INET; // IPv4 address family 32 // Convert address 33 int rtnval = inet_pton(af_inet, servip, &servaddr.sin_addr.s_addr); 34 if (rtnval == 0) 35 DieWithUserMessage("inet_pton() failed", "invalid address string"); 36 else if (rtnval < 0) 37 DieWithSystemMessage("inet_pton() failed"); 38 servaddr.sin_port = htons(servport); // Server port 39 40 // Establish the connection to the echo server 41 if (connect(sock, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) 42 DieWithSystemMessage("connect() failed"); 43 44 size_t echostringlen = strlen(echostring); // Determine input length 45 46 // Send the string to the server 47 ssize_t numbytes = send(sock, echostring, echostringlen, 0); 48 if (numbytes < 0) 49 DieWithSystemMessage("send() failed"); 50 else if (numbytes!= echostringlen) 51 DieWithUserMessage("send()", "sent unexpected number of bytes");

TCPEchoClient4.c 52 53 // Receive the same string back from the server 54 unsigned int totalbytesrcvd = 0; // Count of total bytes received 55 fputs("received: ", stdout); // Setup to print the echoed string 56 while (totalbytesrcvd < echostringlen) { 57 char buffer[bufsize]; // I/O buffer 58 /* Receive up to the buffer size (minus 1 to leave space for 59 a null terminator) bytes from the sender */ 60 numbytes = recv(sock, buffer, BUFSIZE - 1, 0); 61 if (numbytes < 0) 62 DieWithSystemMessage("recv() failed"); 63 else if (numbytes == 0) 64 DieWithUserMessage("recv()", "connection closed prematurely"); 65 totalbytesrcvd += numbytes; // Keep tally of total bytes 66 buffer[numbytes] = '\0'; // Terminate the string! 67 fputs(buffer, stdout); // Print the echo buffer 68 } 69 70 fputc('\n', stdout); // Print a final linefeed 71 72 close(sock); 73 exit(0); 74 }

TCPEchoServer4.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <sys/types.h> 5 #include <sys/socket.h> 6 #include <netinet/in.h> 7 #include <arpa/inet.h> 8 #include "Practical.h" 9 10 static const int MAXPENDING = 5; // Maximum outstanding connection requests 11 12 int main(int argc, char *argv[]) { 13 14 if (argc!= 2) // Test for correct number of arguments 15 DieWithUserMessage("Parameter(s)", "<Server Port>"); 16 17 in_port_t servport = atoi(argv[1]); // First arg: local port 18 19 // Create socket for incoming connections 20 int servsock; // Socket descriptor for server 21 if ((servsock = socket(af_inet, SOCK_STREAM, IPPROTO_TCP)) < 0) 22 DieWithSystemMessage("socket() failed"); 23

TCPEchoServer4.c 24 // Construct local address structure 25 struct sockaddr_in servaddr; // Local address 26 memset(&servaddr, 0, sizeof(servaddr)); // Zero out structure 27 servaddr.sin_family = AF_INET; // IPv4 address family 28 servaddr.sin_addr.s_addr = htonl(inaddr_any); // Any incoming interface 29 servaddr.sin_port = htons(servport); // Local port 30 31 // Bind to the local address 32 if (bind(servsock, (struct sockaddr*) &servaddr, sizeof(servaddr)) < 0) 33 DieWithSystemMessage("bind() failed"); 34 35 // Mark the socket so it will listen for incoming connections 36 if (listen(servsock, MAXPENDING) < 0) 37 DieWithSystemMessage("listen() failed"); 38 39 for (;;) { // Run forever 40 struct sockaddr_in clntaddr; // Client address 41 // Set length of client address structure (in-out parameter) 42 socklen_t clntaddrlen = sizeof(clntaddr); 43 44 // Wait for a client to connect 45 int clntsock = accept(servsock, (struct sockaddr *) &clntaddr, &clntaddrlen); 46 if (clntsock < 0) 47 DieWithSystemMessage("accept() failed");

TCPEchoServer4.c 48 49 // clntsock is connected to a client! 50 51 char clntname[inet_addrstrlen]; // String to contain client address 52 if (inet_ntop(af_inet, &clntaddr.sin_addr.s_addr, clntname, 53 sizeof(clntname))!= NULL) 54 printf("handling client %s/%d\n", clntname, ntohs(clntaddr.sin_port)); 55 else 56 puts("unable to get client address"); 57 58 HandleTCPClient(clntSock); 59 } 60 // NOT REACHED 61 }

HandleTCPClient() 1 void HandleTCPClient(int clntsocket) { 2 char buffer[bufsize]; // Buffer for echo string 3 4 // Receive message from client 5 ssize_t numbytesrcvd = recv(clntsocket, buffer, BUFSIZE, 0); 6 if (numbytesrcvd < 0) 7 DieWithSystemMessage("recv() failed"); 8 9 // Send received string and receive again until end of stream 10 while (numbytesrcvd > 0) { // 0 indicates end of stream 11 // Echo message back to client 12 ssize_t numbytessent = send(clntsocket, buffer, numbytesrcvd, 0); 13 if (numbytessent < 0) 14 DieWithSystemMessage("send() failed"); 15 else if (numbytessent!= numbytesrcvd) 16 DieWithUserMessage("send()", "sent unexpected number of bytes"); 17 18 // See if there is more data to receive 19 numbytesrcvd = recv(clntsocket, buffer, BUFSIZE, 0); 20 if (numbytesrcvd < 0) 21 DieWithSystemMessage("recv() failed"); 22 } 23 24 close(clntsocket); // Close client socket 25 }

컴파일방법 리눅스환경 Native 리눅스 /VMware 리눅스 / Cygwin 환경 유닉스기반 (iris.mmu.ac.kr) $ gcc < 컴파일옵션 > -o < 실행파일 > < 소스파일들 > -lsocket lnsl 리눅스기반 (lily.mmu.ac.kr) $ gcc < 컴파일옵션 > -o < 실행파일 > < 소스파일들 > 주의 std=c99 로컴파일할때일부헤더파일 (netdb.h) 을제대로포함시키지못하는오류가확인되었습니다. for 루프안에서변수선언하는부분만수정해서컴파일하세요.

과제 클라이언트 서버프로그램작성 ( 총 200점 ) 동작확인 (100점) echo_srv 6000 echo_cli 203.232.252.110 Test 6000 (lily) echo_cli 203.232.252.109 Test 6000 (iris) 프로그램설명 ( 발표자료또는보고서형식 100점 ) 컴파일과정 주요헤더파일설명 프로그램코드설명 제출기한 : 3월 19일자정 응용 클라이언트프로그램개선 1 (100 점 ) echo_cli 주소포트번호문장순서로변경 echo_cli 203.232.252.110 6000 This is a test 클라이언트프로그램개선 2 (200점) echo_cli 주소포트번호 키보드로부터입력을받아서버에게전달 서버로부터응답받은후다시반복 제출기한 : 3월 23일자정