SlideShare a Scribd company logo
1 of 18
TCP Echo Server & Client
Basic example
Source
https://www.dropbox.com/s/t1t4kqvauypf121/TCPEcho.zip
TCP Echo Client
1. Socket()을 이용하여 TCP Socket생성
2. connect()를 이용하여 서버와의 연결을 설정
3. send(), recv()를 이용하여 통신을 수행
4. close를 이용하여 통신 종료
SOCKET 생성
WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
(sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)
winsock의 경우 사용 전에 초기화를 해주어야 함(유닉스에서는 없는 부분)
MAKEWORD(2,0)은 winsock 2.0을 쓰겠다는 뜻.
IPPROTO_TCP라는 스트림 기반(SOCK_STREAM) 프로토콜을 이용하여
IPv4(PF_INET)에서 작동하도록 만들어진 소켓이라는 뜻.
socket이라고 다 같은게 아니고 어떤 프로토콜을 사용할지 미리 설정하는 듯
TCP Echo Client
1. Socket()을 이용하여 TCP Socket생성
http://msdn.microsoft.com/en-us/library/windows/desktop/ms740506(v=vs.85).aspx
SERVER 주소 구조체 생성
struct sockaddr_in echoServAddr;
memset(&echoServAddr, 0, sizeof(echoServAddr));
echoServAddr.sin_family = AF_INET;
echoServAddr.sin_addr.s_addr = inet_addr(servIP);
echoServAddr.sin_port = htons(echoServPort);
주소 패밀리를 IPv4(AF_INET)로 지정하고, ip와 port번호를 설정
( 유닉스에서는 inet_addr 대신 inet_pton 사용)
inet_addr로 문자열을 binary로 변환
htons로 port번호도 변환한다.
TCP Echo Client
1. Socket()을 이용하여 TCP Socket생성
연결 설정
connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr))
만들어둔 socket과 socket구조체를 이용하여 연결을 설정
sockaddr_in 구조체가 IPv4를 위한 형식이고
connect에서는 범용적으로 사용할 수 있는 구조체인 sockaddr로 형변환 하여 사용한다.
TCP Echo Client
2. connect()를 이용하여 서버와의 연결을 설정
http://msdn.microsoft.com/en-us/library/windows/desktop/ms740496(v=vs.85).aspx
echo문자열을 서버로 전송
echoStringLen = strlen(echoString);
send(sock, echoString, echoStringLen, 0)
argv로 넘겨준 echoString과 echoStringLen을 이용하여 echo 문자열을 전송한다.
send는 전송한 byte수를 return하며 echoStringLen과 비교하여
제대로 전송되었는지를 확인한다.
TCP Echo Client
3. send(), recv()를 이용하여 통신을 수행
echo 서버의 응답 수신
totalBytesRcvd = 0;
printf("Received: ");
while (totalBytesRcvd < echoStringLen)
{
if ((bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE - 1, 0)) <= 0)
DieWithError("recv() failed or connection closed prematurely");
totalBytesRcvd += bytesRcvd;
echoBuffer[bytesRcvd] = '0';
printf("%s", echoBuffer);
}
서버에서 보낸 메세지가 recv()가 받을 수 있는 크기보다 클 경우가 있으므로 while문을 돌면서
반복해서 데이터를 수신한다.
recv()는 수신할 데이터가 있을 때까지 멈춰있는 block함수라 함
TCP Echo Client
3. send(), recv()를 이용하여 통신을 수행
연결 종료
closesocket(sock);
WSACleanup(); /* Cleanup Winsock */
socket을 close한다.
winsock의 경우 WSACleanup()으로 윈도우 소켓도 닫는다.
TCP Echo Client
4. close를 이용하여 통신 종료
TCP Echo Server
1. Socket()을 이용하여 TCP Socket생성
2. bind()를 통해 소켓에 포트 번호를 할당
3. listen()을 통해 해당 포트가 연결을 받아들이도록 시스템에 알림
4. 다음과 같은 일을 계속적으로 반복
1. accept()를 통해 각 클라이언트와 통신에 필요한 새로운 소켓을 획득
2. 새롭게 생성된 클라이언트 소켓에 send() recv()를 호출하여 통신을 수행
3. close()를 통해 클라이언트와 연결 종료
SOCKET 생성
WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
(sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)
winsock의 경우 사용 전에 초기화를 해주어야 함(유닉스에서는 없는 부분)
MAKEWORD(2,0)은 winsock 2.0을 쓰겠다는 뜻.
IPPROTO_TCP라는 스트림 기반(SOCK_STREAM) 프로토콜을 이용하여
IPv4(PF_INET)에서 작동하도록 만들어진 소켓이라는 뜻.
socket이라고 다 같은게 아니고 어떤 프로토콜을 사용할지 미리 설정하는 듯
TCP Echo Server
1. Socket()을 이용하여 TCP Socket생성 ( client와 동일함 )
http://msdn.microsoft.com/en-us/library/windows/desktop/ms740506(v=vs.85).aspx
SERVER 주소 구조체 생성
struct sockaddr_in echoServAddr;
memset(&echoServAddr, 0, sizeof(echoServAddr));
echoServAddr.sin_family = AF_INET;
echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY);
echoServAddr.sin_port = htons(echoServPort);
IPv4를 사용
htons로 port번호 변환
와일드 카드 주소(INADDR_ANY)로 설정.
시스템에는 하나 이상의 IP주소가 있을 수 있는데 와일드 카드 주소로 설정하면
사용할 IP주소를 알아서 찾아준다고 하는 것 같음.
찾아보니 서버로 연결된 어떤 IP로 들어오든 (포트만 맞다면) 연결해준다는 얘기
TCP Echo Server
1. Socket()을 이용하여 TCP Socket생성
http://zerobell.tistory.com/5
SOCKET을 지정한 IP주소 및 포트에 바인딩
bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr))
client는 connect()하기 위해 서버의 주소가 있어야 하고
server는 bind()하기 위해 자신의 주소가 필요함
위에서 지정한 주소 구조체(자신의 IP주소와 port에 대한 정보가 담긴)를 이용하여
socket과 bind()함
TCP Echo Server
2. bind()를 통해 소켓에 포트 번호를 할당
http://msdn.microsoft.com/en-us/library/windows/desktop/ms737550(v=vs.85).aspx
SOCKET을 연결에 대한 대기상태로 전환
listen(servSock, MAXPENDING)
listen()을 해주어야 연결 요청을 받을 수 있음
listen() 상태가 아닌 서버로의 (client의) connect()호출은 실패하게 된다.
TCP Echo Server
3. listen()을 통해 해당 포트가 연결을 받아들이도록 시스템에 알림
accept()를 통해 각 클라이언트와 통신에 필요한 새로운 소켓을 획득
clntLen = sizeof(echoClntAddr);
clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr, &clntLen
printf("Handling client %sn", inet_ntoa(echoClntAddr.sin_addr));
listen() 상태에서 client의 접속이 감지되면 server에서는 아까 만들어둔 소켓으로 직접 통신을 하는 것
이 아니라, accept()를 이용하여 다른 소켓을 생성한다.
accept()는 새로운 소켓의 식별자를 반환한다. (새로 생성된 소켓은 클라이언트의 소켓과 연결된 소켓임)
inet_ntoa() 는 client에서 사용한 inet_addr로 변환한 binary IP주소를 dotted_quad형식의 문자열로 다
시 변환한다.(정보를 print하기위해 사용하는 것 같음..)
TCP Echo Server
4. 다음과 같은 일을 계속적으로 반복
새롭게 생성된 클라이언트 소켓에 send() recv()를 호출하여 통신을 수행
char echoBuffer[RCVBUFSIZE];
int recvMsgSize;
recvMsgSize = recv(clntSock, echoBuffer, RCVBUFSIZE, 0)
send(clntSock, echoBuffer, recvMsgSize, 0)
client로부터 메세지를 받아서 그대로 다시 돌려주는 부분
위 에코 부분에 대한 함수 HandleTCPClient()라는 함수로 따로 분리되어있는데
서버 코드에서 응용 부분에 대한 자세한 내용을 분리시키는 것이 좋은 습관이라고 함.
TCP Echo Server
4. 다음과 같은 일을 계속적으로 반복
http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms740149(v=vs.85).aspx
close()를 통해 클라이언트와 연결 종료
closesocket(sock);
socket을 close한다.
여기서는 WSACleanup()이 없음.. 루프가 안 끝나서 그런가
TCP Echo Server
4. 다음과 같은 일을 계속적으로 반복
Client
TCP
SOCKET
TCP
PORT
IP
socket()
send()recv()
Server
TCP
SOCKET
TCP
PORT
IP
socket()
send()recv()
connect()
bind()
listen()
TCP
SOCKET
accept()
Conclusion

More Related Content

What's hot

세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝Jay JH Park
 
Ssh tunneling (1)
Ssh tunneling (1)Ssh tunneling (1)
Ssh tunneling (1)권택 오
 
Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)Fermat Jade
 
Welcome to keystone the open stack identity service_v1.0.0-20141208-1212
Welcome to keystone the open stack identity service_v1.0.0-20141208-1212Welcome to keystone the open stack identity service_v1.0.0-20141208-1212
Welcome to keystone the open stack identity service_v1.0.0-20141208-1212ymtech
 
코어 이더리움
코어 이더리움 코어 이더리움
코어 이더리움 Jay JH Park
 
[NodeJS] - NET 모듈 소개
[NodeJS] - NET 모듈 소개[NodeJS] - NET 모듈 소개
[NodeJS] - NET 모듈 소개문학청년
 
Websocket.. whit http, tcp
Websocket.. whit http, tcpWebsocket.. whit http, tcp
Websocket.. whit http, tcpdana238767
 
7급 공무원도 쉽게 따라하는 쉘 스크립트
7급 공무원도 쉽게 따라하는 쉘 스크립트7급 공무원도 쉽게 따라하는 쉘 스크립트
7급 공무원도 쉽게 따라하는 쉘 스크립트Young-Ho Cha
 
도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편Sam Kim
 
이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 Younghoon Moon
 
도커없이컨테이너 만들기 8편 - pid namespace
도커없이컨테이너 만들기 8편 - pid namespace도커없이컨테이너 만들기 8편 - pid namespace
도커없이컨테이너 만들기 8편 - pid namespaceSam Kim
 
Ryu with OpenFlow 1.3, Traffic Monitor
Ryu with OpenFlow 1.3, Traffic MonitorRyu with OpenFlow 1.3, Traffic Monitor
Ryu with OpenFlow 1.3, Traffic Monitorjieun kim
 
네트워크 공격 실습 보고서
네트워크 공격 실습 보고서네트워크 공격 실습 보고서
네트워크 공격 실습 보고서Dong-Jin Park
 
Tcp server / client
Tcp server / clientTcp server / client
Tcp server / client문익 장
 
Cubietruck 리눅스 이미지 설치
Cubietruck 리눅스 이미지 설치Cubietruck 리눅스 이미지 설치
Cubietruck 리눅스 이미지 설치ymtech
 

What's hot (20)

세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝세션2. 이더리움 합의 알고리즘과 마이닝
세션2. 이더리움 합의 알고리즘과 마이닝
 
Ssh tunneling (1)
Ssh tunneling (1)Ssh tunneling (1)
Ssh tunneling (1)
 
Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)Blockchain Study(5) - Smart Contract(스마트 계약)
Blockchain Study(5) - Smart Contract(스마트 계약)
 
Welcome to keystone the open stack identity service_v1.0.0-20141208-1212
Welcome to keystone the open stack identity service_v1.0.0-20141208-1212Welcome to keystone the open stack identity service_v1.0.0-20141208-1212
Welcome to keystone the open stack identity service_v1.0.0-20141208-1212
 
코어 이더리움
코어 이더리움 코어 이더리움
코어 이더리움
 
[NodeJS] - NET 모듈 소개
[NodeJS] - NET 모듈 소개[NodeJS] - NET 모듈 소개
[NodeJS] - NET 모듈 소개
 
Nodejs_chapter3
Nodejs_chapter3Nodejs_chapter3
Nodejs_chapter3
 
shell and process
shell and processshell and process
shell and process
 
DNS
DNSDNS
DNS
 
Websocket.. whit http, tcp
Websocket.. whit http, tcpWebsocket.. whit http, tcp
Websocket.. whit http, tcp
 
7급 공무원도 쉽게 따라하는 쉘 스크립트
7급 공무원도 쉽게 따라하는 쉘 스크립트7급 공무원도 쉽게 따라하는 쉘 스크립트
7급 공무원도 쉽게 따라하는 쉘 스크립트
 
Websocket
WebsocketWebsocket
Websocket
 
도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편
 
이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력 이더리움의 현황, 한계점 및 개선노력
이더리움의 현황, 한계점 및 개선노력
 
도커없이컨테이너 만들기 8편 - pid namespace
도커없이컨테이너 만들기 8편 - pid namespace도커없이컨테이너 만들기 8편 - pid namespace
도커없이컨테이너 만들기 8편 - pid namespace
 
Linux+정리
Linux+정리Linux+정리
Linux+정리
 
Ryu with OpenFlow 1.3, Traffic Monitor
Ryu with OpenFlow 1.3, Traffic MonitorRyu with OpenFlow 1.3, Traffic Monitor
Ryu with OpenFlow 1.3, Traffic Monitor
 
네트워크 공격 실습 보고서
네트워크 공격 실습 보고서네트워크 공격 실습 보고서
네트워크 공격 실습 보고서
 
Tcp server / client
Tcp server / clientTcp server / client
Tcp server / client
 
Cubietruck 리눅스 이미지 설치
Cubietruck 리눅스 이미지 설치Cubietruck 리눅스 이미지 설치
Cubietruck 리눅스 이미지 설치
 

Viewers also liked

이펙티브 C++ 789 공부
이펙티브 C++ 789 공부이펙티브 C++ 789 공부
이펙티브 C++ 789 공부quxn6
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디quxn6
 
C++11 Tuple
C++11 TupleC++11 Tuple
C++11 Tuplequxn6
 
모어이펙티브 C++ 5,6
모어이펙티브 C++ 5,6모어이펙티브 C++ 5,6
모어이펙티브 C++ 5,6quxn6
 
모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디quxn6
 
모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디quxn6
 
RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개Wonchang Song
 
SOAP 기반/ RESTful기반 웹서비스 비교
SOAP 기반/ RESTful기반 웹서비스 비교SOAP 기반/ RESTful기반 웹서비스 비교
SOAP 기반/ RESTful기반 웹서비스 비교seungdols
 
SOAP REST 이해
SOAP REST 이해SOAP REST 이해
SOAP REST 이해Jake Yoon
 
Victoria's Secret Angels Campaign
Victoria's Secret Angels CampaignVictoria's Secret Angels Campaign
Victoria's Secret Angels CampaignJohn White
 

Viewers also liked (13)

이펙티브 C++ 789 공부
이펙티브 C++ 789 공부이펙티브 C++ 789 공부
이펙티브 C++ 789 공부
 
모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디모어 이펙티브 c++ 1,2장 스터디
모어 이펙티브 c++ 1,2장 스터디
 
C++11 Tuple
C++11 TupleC++11 Tuple
C++11 Tuple
 
모어이펙티브 C++ 5,6
모어이펙티브 C++ 5,6모어이펙티브 C++ 5,6
모어이펙티브 C++ 5,6
 
모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디모어 이펙티브 c++ 5장 스터디
모어 이펙티브 c++ 5장 스터디
 
모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디모어이펙티브 C++ 3,4장 예외, 효율 스터디
모어이펙티브 C++ 3,4장 예외, 효율 스터디
 
Tcp sockets
Tcp socketsTcp sockets
Tcp sockets
 
Socket Programming
Socket ProgrammingSocket Programming
Socket Programming
 
Socket System Calls
Socket System CallsSocket System Calls
Socket System Calls
 
RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개RPC에서 REST까지 간단한 개념소개
RPC에서 REST까지 간단한 개념소개
 
SOAP 기반/ RESTful기반 웹서비스 비교
SOAP 기반/ RESTful기반 웹서비스 비교SOAP 기반/ RESTful기반 웹서비스 비교
SOAP 기반/ RESTful기반 웹서비스 비교
 
SOAP REST 이해
SOAP REST 이해SOAP REST 이해
SOAP REST 이해
 
Victoria's Secret Angels Campaign
Victoria's Secret Angels CampaignVictoria's Secret Angels Campaign
Victoria's Secret Angels Campaign
 

Similar to TCP echo 서버 및 클라이언트 예제 스터디

(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원탑크리에듀(구로디지털단지역3번출구 2분거리)
 
TCP/IP 발표자료 - 김연수
TCP/IP 발표자료 - 김연수TCP/IP 발표자료 - 김연수
TCP/IP 발표자료 - 김연수Yeon Soo Kim
 
소켓프로그래밍 기초요약
소켓프로그래밍 기초요약소켓프로그래밍 기초요약
소켓프로그래밍 기초요약세빈 정
 
리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초Yu Yongwoo
 
Python으로 채팅 구현하기
Python으로 채팅 구현하기Python으로 채팅 구현하기
Python으로 채팅 구현하기Tae Young Lee
 
AWS 아마존 웹 서비스 책 없이 시작하기 - AWS 유저그룹 엔터프라이즈 모임 발표 20180514 이준구(SDS)
AWS 아마존 웹 서비스 책 없이 시작하기 - AWS 유저그룹 엔터프라이즈 모임 발표 20180514 이준구(SDS)AWS 아마존 웹 서비스 책 없이 시작하기 - AWS 유저그룹 엔터프라이즈 모임 발표 20180514 이준구(SDS)
AWS 아마존 웹 서비스 책 없이 시작하기 - AWS 유저그룹 엔터프라이즈 모임 발표 20180514 이준구(SDS)AWSKRUG - AWS한국사용자모임
 
Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명진우 이
 
Blockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreBlockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreihpark92
 
스트리밍 프로토콜
스트리밍 프로토콜스트리밍 프로토콜
스트리밍 프로토콜greenday96
 
Wiznet Academy - WizFi250 기초교육 및 실습
Wiznet Academy - WizFi250 기초교육 및 실습Wiznet Academy - WizFi250 기초교육 및 실습
Wiznet Academy - WizFi250 기초교육 및 실습Steve Kim
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js연웅 조
 
Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Sung-jae Park
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기흥배 최
 
중급 소켓프로그래밍
중급 소켓프로그래밍중급 소켓프로그래밍
중급 소켓프로그래밍quxn6
 
자바 다중 채팅 프로그램
자바 다중 채팅 프로그램자바 다중 채팅 프로그램
자바 다중 채팅 프로그램Hwangcy
 
Spring-WebSocket 기반 Full-Featured 채팅 구현
Spring-WebSocket 기반 Full-Featured 채팅 구현Spring-WebSocket 기반 Full-Featured 채팅 구현
Spring-WebSocket 기반 Full-Featured 채팅 구현Hongchae Lee
 
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...JooHyung Kim
 
Icmp Attak Against Tcp
Icmp Attak Against TcpIcmp Attak Against Tcp
Icmp Attak Against Tcpxyzlee
 
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]지환 김
 

Similar to TCP echo 서버 및 클라이언트 예제 스터디 (20)

(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
 
TCP/IP 발표자료 - 김연수
TCP/IP 발표자료 - 김연수TCP/IP 발표자료 - 김연수
TCP/IP 발표자료 - 김연수
 
소켓프로그래밍 기초요약
소켓프로그래밍 기초요약소켓프로그래밍 기초요약
소켓프로그래밍 기초요약
 
리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초
 
Python으로 채팅 구현하기
Python으로 채팅 구현하기Python으로 채팅 구현하기
Python으로 채팅 구현하기
 
AWS 아마존 웹 서비스 책 없이 시작하기 - AWS 유저그룹 엔터프라이즈 모임 발표 20180514 이준구(SDS)
AWS 아마존 웹 서비스 책 없이 시작하기 - AWS 유저그룹 엔터프라이즈 모임 발표 20180514 이준구(SDS)AWS 아마존 웹 서비스 책 없이 시작하기 - AWS 유저그룹 엔터프라이즈 모임 발표 20180514 이준구(SDS)
AWS 아마존 웹 서비스 책 없이 시작하기 - AWS 유저그룹 엔터프라이즈 모임 발표 20180514 이준구(SDS)
 
Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명
 
Blockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreBlockchain 2nd ethereum_core
Blockchain 2nd ethereum_core
 
스트리밍 프로토콜
스트리밍 프로토콜스트리밍 프로토콜
스트리밍 프로토콜
 
Wiznet Academy - WizFi250 기초교육 및 실습
Wiznet Academy - WizFi250 기초교육 및 실습Wiznet Academy - WizFi250 기초교육 및 실습
Wiznet Academy - WizFi250 기초교육 및 실습
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js
 
Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Implementing remote procedure calls rev2
Implementing remote procedure calls rev2
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
중급 소켓프로그래밍
중급 소켓프로그래밍중급 소켓프로그래밍
중급 소켓프로그래밍
 
자바 다중 채팅 프로그램
자바 다중 채팅 프로그램자바 다중 채팅 프로그램
자바 다중 채팅 프로그램
 
Spring-WebSocket 기반 Full-Featured 채팅 구현
Spring-WebSocket 기반 Full-Featured 채팅 구현Spring-WebSocket 기반 Full-Featured 채팅 구현
Spring-WebSocket 기반 Full-Featured 채팅 구현
 
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
 
Winsock
WinsockWinsock
Winsock
 
Icmp Attak Against Tcp
Icmp Attak Against TcpIcmp Attak Against Tcp
Icmp Attak Against Tcp
 
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
 

More from quxn6

이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디quxn6
 
비실사렌더링-툰 쉐이딩
비실사렌더링-툰 쉐이딩비실사렌더링-툰 쉐이딩
비실사렌더링-툰 쉐이딩quxn6
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부quxn6
 
이펙티브 C++ 스터디
이펙티브 C++ 스터디이펙티브 C++ 스터디
이펙티브 C++ 스터디quxn6
 
입체충돌처리
입체충돌처리입체충돌처리
입체충돌처리quxn6
 
introduce unity3D and playmaker basic
introduce unity3D and playmaker basicintroduce unity3D and playmaker basic
introduce unity3D and playmaker basicquxn6
 

More from quxn6 (6)

이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디이펙티브 C++ 5,6 장 스터디
이펙티브 C++ 5,6 장 스터디
 
비실사렌더링-툰 쉐이딩
비실사렌더링-툰 쉐이딩비실사렌더링-툰 쉐이딩
비실사렌더링-툰 쉐이딩
 
이펙티브 C++ 공부
이펙티브 C++ 공부이펙티브 C++ 공부
이펙티브 C++ 공부
 
이펙티브 C++ 스터디
이펙티브 C++ 스터디이펙티브 C++ 스터디
이펙티브 C++ 스터디
 
입체충돌처리
입체충돌처리입체충돌처리
입체충돌처리
 
introduce unity3D and playmaker basic
introduce unity3D and playmaker basicintroduce unity3D and playmaker basic
introduce unity3D and playmaker basic
 

TCP echo 서버 및 클라이언트 예제 스터디

  • 1. TCP Echo Server & Client Basic example
  • 3. TCP Echo Client 1. Socket()을 이용하여 TCP Socket생성 2. connect()를 이용하여 서버와의 연결을 설정 3. send(), recv()를 이용하여 통신을 수행 4. close를 이용하여 통신 종료
  • 4. SOCKET 생성 WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) (sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) winsock의 경우 사용 전에 초기화를 해주어야 함(유닉스에서는 없는 부분) MAKEWORD(2,0)은 winsock 2.0을 쓰겠다는 뜻. IPPROTO_TCP라는 스트림 기반(SOCK_STREAM) 프로토콜을 이용하여 IPv4(PF_INET)에서 작동하도록 만들어진 소켓이라는 뜻. socket이라고 다 같은게 아니고 어떤 프로토콜을 사용할지 미리 설정하는 듯 TCP Echo Client 1. Socket()을 이용하여 TCP Socket생성 http://msdn.microsoft.com/en-us/library/windows/desktop/ms740506(v=vs.85).aspx
  • 5. SERVER 주소 구조체 생성 struct sockaddr_in echoServAddr; memset(&echoServAddr, 0, sizeof(echoServAddr)); echoServAddr.sin_family = AF_INET; echoServAddr.sin_addr.s_addr = inet_addr(servIP); echoServAddr.sin_port = htons(echoServPort); 주소 패밀리를 IPv4(AF_INET)로 지정하고, ip와 port번호를 설정 ( 유닉스에서는 inet_addr 대신 inet_pton 사용) inet_addr로 문자열을 binary로 변환 htons로 port번호도 변환한다. TCP Echo Client 1. Socket()을 이용하여 TCP Socket생성
  • 6. 연결 설정 connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) 만들어둔 socket과 socket구조체를 이용하여 연결을 설정 sockaddr_in 구조체가 IPv4를 위한 형식이고 connect에서는 범용적으로 사용할 수 있는 구조체인 sockaddr로 형변환 하여 사용한다. TCP Echo Client 2. connect()를 이용하여 서버와의 연결을 설정 http://msdn.microsoft.com/en-us/library/windows/desktop/ms740496(v=vs.85).aspx
  • 7. echo문자열을 서버로 전송 echoStringLen = strlen(echoString); send(sock, echoString, echoStringLen, 0) argv로 넘겨준 echoString과 echoStringLen을 이용하여 echo 문자열을 전송한다. send는 전송한 byte수를 return하며 echoStringLen과 비교하여 제대로 전송되었는지를 확인한다. TCP Echo Client 3. send(), recv()를 이용하여 통신을 수행
  • 8. echo 서버의 응답 수신 totalBytesRcvd = 0; printf("Received: "); while (totalBytesRcvd < echoStringLen) { if ((bytesRcvd = recv(sock, echoBuffer, RCVBUFSIZE - 1, 0)) <= 0) DieWithError("recv() failed or connection closed prematurely"); totalBytesRcvd += bytesRcvd; echoBuffer[bytesRcvd] = '0'; printf("%s", echoBuffer); } 서버에서 보낸 메세지가 recv()가 받을 수 있는 크기보다 클 경우가 있으므로 while문을 돌면서 반복해서 데이터를 수신한다. recv()는 수신할 데이터가 있을 때까지 멈춰있는 block함수라 함 TCP Echo Client 3. send(), recv()를 이용하여 통신을 수행
  • 9. 연결 종료 closesocket(sock); WSACleanup(); /* Cleanup Winsock */ socket을 close한다. winsock의 경우 WSACleanup()으로 윈도우 소켓도 닫는다. TCP Echo Client 4. close를 이용하여 통신 종료
  • 10. TCP Echo Server 1. Socket()을 이용하여 TCP Socket생성 2. bind()를 통해 소켓에 포트 번호를 할당 3. listen()을 통해 해당 포트가 연결을 받아들이도록 시스템에 알림 4. 다음과 같은 일을 계속적으로 반복 1. accept()를 통해 각 클라이언트와 통신에 필요한 새로운 소켓을 획득 2. 새롭게 생성된 클라이언트 소켓에 send() recv()를 호출하여 통신을 수행 3. close()를 통해 클라이언트와 연결 종료
  • 11. SOCKET 생성 WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) (sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) winsock의 경우 사용 전에 초기화를 해주어야 함(유닉스에서는 없는 부분) MAKEWORD(2,0)은 winsock 2.0을 쓰겠다는 뜻. IPPROTO_TCP라는 스트림 기반(SOCK_STREAM) 프로토콜을 이용하여 IPv4(PF_INET)에서 작동하도록 만들어진 소켓이라는 뜻. socket이라고 다 같은게 아니고 어떤 프로토콜을 사용할지 미리 설정하는 듯 TCP Echo Server 1. Socket()을 이용하여 TCP Socket생성 ( client와 동일함 ) http://msdn.microsoft.com/en-us/library/windows/desktop/ms740506(v=vs.85).aspx
  • 12. SERVER 주소 구조체 생성 struct sockaddr_in echoServAddr; memset(&echoServAddr, 0, sizeof(echoServAddr)); echoServAddr.sin_family = AF_INET; echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); echoServAddr.sin_port = htons(echoServPort); IPv4를 사용 htons로 port번호 변환 와일드 카드 주소(INADDR_ANY)로 설정. 시스템에는 하나 이상의 IP주소가 있을 수 있는데 와일드 카드 주소로 설정하면 사용할 IP주소를 알아서 찾아준다고 하는 것 같음. 찾아보니 서버로 연결된 어떤 IP로 들어오든 (포트만 맞다면) 연결해준다는 얘기 TCP Echo Server 1. Socket()을 이용하여 TCP Socket생성 http://zerobell.tistory.com/5
  • 13. SOCKET을 지정한 IP주소 및 포트에 바인딩 bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) client는 connect()하기 위해 서버의 주소가 있어야 하고 server는 bind()하기 위해 자신의 주소가 필요함 위에서 지정한 주소 구조체(자신의 IP주소와 port에 대한 정보가 담긴)를 이용하여 socket과 bind()함 TCP Echo Server 2. bind()를 통해 소켓에 포트 번호를 할당 http://msdn.microsoft.com/en-us/library/windows/desktop/ms737550(v=vs.85).aspx
  • 14. SOCKET을 연결에 대한 대기상태로 전환 listen(servSock, MAXPENDING) listen()을 해주어야 연결 요청을 받을 수 있음 listen() 상태가 아닌 서버로의 (client의) connect()호출은 실패하게 된다. TCP Echo Server 3. listen()을 통해 해당 포트가 연결을 받아들이도록 시스템에 알림
  • 15. accept()를 통해 각 클라이언트와 통신에 필요한 새로운 소켓을 획득 clntLen = sizeof(echoClntAddr); clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr, &clntLen printf("Handling client %sn", inet_ntoa(echoClntAddr.sin_addr)); listen() 상태에서 client의 접속이 감지되면 server에서는 아까 만들어둔 소켓으로 직접 통신을 하는 것 이 아니라, accept()를 이용하여 다른 소켓을 생성한다. accept()는 새로운 소켓의 식별자를 반환한다. (새로 생성된 소켓은 클라이언트의 소켓과 연결된 소켓임) inet_ntoa() 는 client에서 사용한 inet_addr로 변환한 binary IP주소를 dotted_quad형식의 문자열로 다 시 변환한다.(정보를 print하기위해 사용하는 것 같음..) TCP Echo Server 4. 다음과 같은 일을 계속적으로 반복
  • 16. 새롭게 생성된 클라이언트 소켓에 send() recv()를 호출하여 통신을 수행 char echoBuffer[RCVBUFSIZE]; int recvMsgSize; recvMsgSize = recv(clntSock, echoBuffer, RCVBUFSIZE, 0) send(clntSock, echoBuffer, recvMsgSize, 0) client로부터 메세지를 받아서 그대로 다시 돌려주는 부분 위 에코 부분에 대한 함수 HandleTCPClient()라는 함수로 따로 분리되어있는데 서버 코드에서 응용 부분에 대한 자세한 내용을 분리시키는 것이 좋은 습관이라고 함. TCP Echo Server 4. 다음과 같은 일을 계속적으로 반복 http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ms740149(v=vs.85).aspx
  • 17. close()를 통해 클라이언트와 연결 종료 closesocket(sock); socket을 close한다. 여기서는 WSACleanup()이 없음.. 루프가 안 끝나서 그런가 TCP Echo Server 4. 다음과 같은 일을 계속적으로 반복