다양한 데이터 전송 방식

bolee·2022년 4월 11일
0
post-custom-banner

다양한 데이터 전송 방식에 대해 설명할 것이다.

고정 길이 데이터 방식

  • 송신자: 항상 고정 길이 데이터를 보낸다.

  • 수신자: 항상 고정 길이 데이터를 읽는다.

    개념도 쉽고 구현도 편리한 방식으로 서버로 클라이언트 모두 크기가 같은 버퍼를 정의해두고 데이터를 주고 받는다.

고정길이 데이터 방식

실행 시 클라이언트와 서버가 고정 길이 데이터(50바이트)를 각각 보내고 받음을 알 수 있다.

가변 길이 데이터 전송

  • 송신자: 가변 길이 데이터를 보내고 끝 부분에 특별한 표시(EOR, End Of Record)를 붙인다.
  • 수신자: EOR이 나올 때까지 데이터를 읽는다.

가변 길이 데이터를 주고받으려면 EOR로 사용할 데이터 패턴을 정해야 한다. 흔히 \n이나 \r\n을 사용한다. 여기서는 \n을 EOR로 정의해 구현하는데, \n을 검출하는 가상의 코드를 작성하면 다음과 같다.

while (1)
{
->	소켓 수신 버퍼에서 1바이트 데이터를 읽는다.
	읽은 데이터가 '\n'이 아니면 응용 프로그램 버퍼에 저장한다.
    읽은 데이터가 '\n'이면 루프를 빠져나온다.
}
응용 프로그램 버퍼에 저장된 데이터를 사용한다.

이와 같이 구현하면 동작은 하지만 '->'로 표시한 부분 때문에 성능이 떨어진다. '->' 부분에서 성능을 높이려면 소켓 수신 버퍼에서 데이터를 한 번에 많이 읽어 1바이트씩 리턴해주는 사용자 정의 함수를 만드는 것이 좋다.

가변 길이 데이터 전송

실행 시 클라이언트가 가변 길이 데이터를 보내면, 서버가 데이터를 정확히 구분해 읽음을 알 수 있다.

고정 길이 + 가변 길이 데이터 전송

  • 송신자: 보낼 데이터 크기를 데이터로 보내고, 이어서 가변 길이 데이터를 보낸다.
  • 수신자: 고정 실이 데이터를 읽어서 뒤따라올 가변 데이터의 길이를 알아내고, 이 길이만큼 데이터를 읽는다.

송신 측에서 가변 길이 데이터의 크기를 바로 계산할 수 있다면 고정길이 + 가변 길이 전송이 효과적이다. 수신 측에서는 [1. 고정길이 데이터 수신 / 2. 가변 길이 데이터 수신] 두 번의 데이터 수신으로 가변 길이 데이터의 경계를 구분해 읽을 수 있다.

고정 길이 + 가변 길이 데이터 전송

실행 시 클라이언트가 고정 길이 + 가변 길이 데이터를 보내면, 서버가 데이터를 정확히 구분해 읽음을 알 수 있다.

데이터 전송 후 종료

  • 송신자: 가변 길이 데이터 전송 후 접속 종료
  • 수신자: recv() 함수의 리턴 값이 '0'(=정상종료)이 될 때까지 데이터를 읽는다.

데이터 전송 후 종료 방식은 일종의 가변 길이 데이터 전송 방식이다. EOR로 특별한 데이터 패턴을 사용하는 대신 연결 종료를 사용한다.

데이터 전송 후 종료

실행 시 클라이언트가 데이터를 하나 보낼 때마다 접속과 접속 종료를 반복함을 알 수 있다.
(5-8 그림)

참고 자료
김성우 저, "TCP/IP 윈도우 소켓 프로그래밍", 한빛아카데미, 2018

post-custom-banner

0개의 댓글