본문 바로가기

Network/초급 TCP/IP socket

04. Server / Client TCP통신흐름 리눅스 프로그래밍

TCP/IP통신의 흐름을 리눅스 프로그래밍을 통하여  살펴보도록하겠습니다

참고1)구조체

sockaddr_in구조체

{

ip주소, 포트번호, 설정

}

 

참고2)server프로그램


공통 socket생성

Socket()
응용프로그램이 이를 통해 데이터를 송수신할수 있는 추상화된 개념

#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
    socket(PF_INET,SOCK_STREAM,0);


int domain : 소켓의 통신 영역을 결정합니다 AF_INET(IPv4)(IPv6) PF_INET 

int type : 생성될 소켓이 어떠한 방식으로 데이터를 전송할지를 결정합니다 SOCK_STREAM /DGRAM

int protocol : 사용될 종단 간 프로토콜을 구체적으로 명시합니다 주로 0을 넣으면 앞의 인자를 확인하여 자동으로 선택을 합니다



Server 서버 (위 그림 참고)

 

소켓주소할당 bind()

: sickaddr_in구조체(해당주소와 포트)를 소켓에 연결하는것

간단하게 소켓에 주소를 할당하는 함수다

 

int bind(int socket, struct sockaddr *localAddress, socklen_t addressSize)

bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))


1)
     
소켓식별자 serv_sock


2)
     
구조체의 주소(포인터로 접금) (struct sockaddr*)&serv_addr


3)
     
구조체의 크기 sizeof(serv_addr)


 
와일드카드 주소(INADDR_ANY)?

:지정한 아무 주소에나 연결된다는 의미이고 서버의 경우 어떤 호스트의 주소로 들어오는 연결이라도 받아들인다는 의미

 

연결대기 listen()

:주소 연결(bind)를 하게 되면 서버 소켓은 주소를 가지게 된다 서버 소켓으로 하여금 클라이언트로부터 연결을 대기하게 하기 위해서는 또하나의 과정을 하부 프로토콜 내부가 수행해야 되는데 listen을 통하여 가능하다

 

간단하게 말해서 연결요청을 대기모드로 설정하는것

 

중요한점은 주소와 포트에 연결되고 대기를 하고 있는 코세은 실제로 절대 송수신에 사용되지 않으며 각 클라이언트를 연결하기 위한 새로운 소켓을 획득하기 위한 수단으로만 사용한다

 

int listen(int socket, int queueLimit)

    listen(serv_sock, 5)

 

queue : 먼저 들어간 것이 먼저 처리된다는 의미

int queueLimit 연결을 기다리는 클라이언트의 대수를 뜻함

listen(  ,5) 연결요청을 하는 클라이언트의 최대 갯수를 5개로 함

 

5개의 연결대기 클라이언트로 가능

listen(  ,1) 1개의 클라이언트만 가능하고 통신중 다른 클라이언트가 들어와도 대기하지 못하다 튕기게 된다

 

소켓 생성 accept()

:연결을 위해 새로운 소켓을 생성한다

 

accept함수의 기본형은 socket descript(같다)이다

 

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

   accept(serv_sock,(struct_sockaddr*)&clntaddr, &clnt_addr_size);

클라이언트의 주소를 담은 구조체와 길이

 

Server 동작순서

 

server socket생성

ò

sockadd_in 구조체에 주소설정(ip,port)

ò

bind() 소켓에 구조체 값 할당(nonblocking)

ò

listen() 서버소켓에 대기모드, 클라이언트 최대 접속수 설정하고 나옴(nonblocking)

ò

accept() 연결요청한 클라이언트와 통신할 송수신용 소켓생성(blocking)

  -연결 요청이(connect)들어 올때까지 대기함

 

 

 참고3) client 프로그램

   

Client 클라이언트(위 그림 참고)

 

서버와연결 connect()

:서버는 클라이언트가 접속하기를 수동적으로 기다리는데 반해 클라이언트는 연결을 직접시도한다

 

int connect(int socket, const struct sockaddr *foreignAddress, socklen_t addressLength)

connect(sock, (struck sockaddr*)&serv_addr, sizeof(serv_addr))

*bind()와 비슷하게 생겼다

 

client 동작순서

 

socket() 소켓생성

ò

구조체에 접속할 서버주소 설정

ò

connect() 연결요청

참고4) 주고 받는 ip / port
위 두함수(client/server)를 통하여 통하여 주고 받는 ip,port를 printf 를 server프로그램에 추가하여 출력하여 보았습니다

결과>>



참고5) 전체 흐름