본문 바로가기
Programming/Linux C/C++

TCP 기반 서버/클라이언트 1

by 개Foot/Dog발?! 2014. 8. 29.

URL : http://christin2.tistory.com/31


.....




.....




연결요청 대기상태로의 진입

ref URL : http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/2/listen


- sock : 연결요청 대기상태에 두고자 하는 소켓의 파일 디스크립터 전달, 이 함수의 인자로 전달된 디스크립터의 소켓이 서버소켓이 됨

- backlog : 연결요청 대기 큐의 크기정보 전달

- listen 함수가 호출되어야 클라이언트가 연결요청을 할 수 있는 상태가 됨

- 클라이언트의 연결요청도 인터넷을 통해서 흘러 들어오는 일종의 데이터 전송이므로 받아들이기 위한 소켓이 하나 필요하고 서버소켓이 그 역할을 함

- 여러 개의 클라이언트가 연결 요청을 했을 때, 연결요청 대기 큐에서 대기



클라이언트의 연결요청 수락

ref URL : http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/2/accept

- sock : 서버 소켓의 파일 디스크립터 전달

- addr : 연결요청 한 클라이언트의 주소정보를 담을 변수의 주소 값 전달

- addrlen : addr에 전달된 주소의 변수 크기를 바이트 단위로 전달

- '연결 요청 대기 큐에서 대기중인 클라이언트의 연결 요청을 수락하는 기능의 함수

- 호출 결과로 소켓이 생성되고 연결요청을 한 클라이언트 소켓과 자동 연결


TCP 클라이언트의 기본적인 함수호출 순서


클라이언트의 연결요청

ref URL : http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/2/connect

- sock : 클라이언트 소켓의 파일 디스크립터 전달

- servaddr : 연결요청 한 클라이언트의 주소정보를 담을 변수의 주소 값 전다

- addrlen : servaddr에 전달된 주소의 변수 크기를 바이트 단위로 전달


* 함수가 반환되는 경우

- 서버에 의해 연결요청이 접수됨

- 네트워크 단절 등 오류상황이 발생해서 연결요청이 중단


* 연결요청의 접수 : 클라이언트의 연결요청 정보가 서버의 연결요청 대기 큐에 등록된 상황을 의미



TCP기반, 서버/클라이언트의 함수 호출 관계


- 클라이언트가 connect 함수를 호출 할 때까지 서버는 accept 함수가 호출된 위치에서 블로킹 상태에 놓임


* 에코서버 : 클라이언트가 저송하는 문자열 데이터를 그대로 재전송하는 서버


Iterative 서버 함수호출 순서

- 계속해서 들어오는 클라이언트의 연결요청을 수락하기 위해서 반복문을 삽입하여 accept함수를 반복 호출

- 서버는 한 순간에 하나의 클라이언트와 연결되어 에코 서비스를 제공


Iterative 에코 클라이언트 문제점


- 둘 이상의 write함수 호출로 전달된 문자열 정보가 묶여서 한번에 서버로 전송 가능

- 클라이언트는 한번에 둘 이상의 문자열 정보를 서버로부터 되돌려 받아서 원하는 결과를 얻지 못 할 수 있음

- 데이터의 모든 조각이 클라이언트에게 전송되지 않았음에도 클라이언트는 read함수를 호출 할 수도 있음



윈도우 기반 에코 서버

- WSAStartup, WSACleanup 함수호출을 통한 소켓 라이브러리의 초기화와 해제

- 자료형과 변수의 이름을 윈도우 스타일로 변경하기

- 데이터 송수신을 위해 read, write 함수 대신 recv, send 함수 호출하기

- 소켓의 종료를 위해서 close 대신 closesocket함수 호출하기