다양한 데이터 전송 방식에 대해 설명할 것이다.
송신자: 항상 고정 길이 데이터를 보낸다.
수신자: 항상 고정 길이 데이터를 읽는다.
개념도 쉽고 구현도 편리한 방식으로 서버로 클라이언트 모두 크기가 같은 버퍼를 정의해두고 데이터를 주고 받는다.
실행 시 클라이언트와 서버가 고정 길이 데이터(50바이트)를 각각 보내고 받음을 알 수 있다.
가변 길이 데이터를 주고받으려면 EOR로 사용할 데이터 패턴을 정해야 한다. 흔히 \n
이나 \r\n
을 사용한다. 여기서는 \n
을 EOR로 정의해 구현하는데, \n
을 검출하는 가상의 코드를 작성하면 다음과 같다.
while (1)
{
-> 소켓 수신 버퍼에서 1바이트 데이터를 읽는다.
읽은 데이터가 '\n'이 아니면 응용 프로그램 버퍼에 저장한다.
읽은 데이터가 '\n'이면 루프를 빠져나온다.
}
응용 프로그램 버퍼에 저장된 데이터를 사용한다.
이와 같이 구현하면 동작은 하지만 '->'로 표시한 부분 때문에 성능이 떨어진다. '->' 부분에서 성능을 높이려면 소켓 수신 버퍼에서 데이터를 한 번에 많이 읽어 1바이트씩 리턴해주는 사용자 정의 함수를 만드는 것이 좋다.
실행 시 클라이언트가 가변 길이 데이터를 보내면, 서버가 데이터를 정확히 구분해 읽음을 알 수 있다.
송신 측에서 가변 길이 데이터의 크기를 바로 계산할 수 있다면 고정길이 + 가변 길이 전송이 효과적이다. 수신 측에서는 [1. 고정길이 데이터 수신 / 2. 가변 길이 데이터 수신] 두 번의 데이터 수신으로 가변 길이 데이터의 경계를 구분해 읽을 수 있다.
실행 시 클라이언트가 고정 길이 + 가변 길이 데이터를 보내면, 서버가 데이터를 정확히 구분해 읽음을 알 수 있다.
recv()
함수의 리턴 값이 '0'(=정상종료)이 될 때까지 데이터를 읽는다.데이터 전송 후 종료 방식은 일종의 가변 길이 데이터 전송 방식이다. EOR로 특별한 데이터 패턴을 사용하는 대신 연결 종료를 사용한다.
실행 시 클라이언트가 데이터를 하나 보낼 때마다 접속과 접속 종료를 반복함을 알 수 있다.
(5-8 그림)
참고 자료
김성우 저, "TCP/IP 윈도우 소켓 프로그래밍", 한빛아카데미, 2018