네트워크 프로그래밍 5주차

Hyun·2024년 10월 15일
0

5.1. 응용 프로그램 프로토콜과 데이터 전송

: 응용 프로그램 수준에서 주고받는 데이터의 형식, 의미, 처리 방식을 정의한 프로토콜,
c언의 구조체로 표현

데이터 전송시 고려할 사항들

1. 메세지의 경계 구분

  • TCP 프로토콜의 특성에 맞게 데이터 전송 필요
  • TCP 프로토콜 => 메세지의 경계를 구분 X, 데이터의 끝을 어디까지 봐야 되는지 추가 작업 필요
  • 메세지 경계 구분 방법 4가지
  1. 고정 길이 전송: 송신자 고정 길이 데이터를 보내고 수신자 고정 데이터 읽음
    => 주고받을 데이터 길이 변동폭이 크지 않을 때 적합

  2. 가변길이전송: 송신자는 가변 길이 데이터를 보내고 끝 부분에 특별 표시 (EOR, End of Record), 수신자는 EOR 이 나올 때까지 데이터 읽음
    => 생성될 데이터 길이를 미리 알 수 없을 때

  3. 고정 + 가변길이 전송: 송신자는 보낼 데이터 크기를 고정 길이 데이터로 보내고 이어서 가변 보냄, 수신자는 고정 길이 데이터를 읽어서 뒤따라올 가변 데이터의 길이를 알아냄, 이 길이만큼 데이터 읽음
    => 일반적으로 권장, 구현의 표의성과 처리 효율에서 유리

  4. 데이터 전송 후 종료: 송신자는 가변 길이 데이터 전송 후 접속을 정상 종료(closesocket() 함수 호출), 수신자는 recv() 함수의 리턴 값이 0(정상 종료) 될 때까지 데이터 읽음
    => 한쪽에서 일방적으로 데이터 보내는 경우

2. 바이트 정렬

  • 정확한 데이터 해석을 위한 통일 필요
  • 가능하면 빅 엔디안 방식으로 통일

3. 구조체 멤버 맞춤

  • 메모리 접근의 효율성
  • 컴퓨터의 cpu는 메모리에서 데이터를 읽을 때, 데이터가 일정한 경계에 맞춰져 있을 때 훨씬 효율적으로 접근 가능
  • 컴파일러는 성능 향상, CPU의 접근 효율성을 위해 구조체의 각 멤버가 정렬 요구 사항을 만족하도록 패 추가 가능
  • 구조체에 선언되는 멤버들이 메모리에 할당 될 때 규칙 통일 필요, 구조체 멤버의 메모리 시작 주소를 결정하는 컴파일러의 규칙
#include <stdio.h>

// 정렬이 적용된 구조체
struct MyMessageUnpacked {
	int a;
    char b;
    int c;
    char d;
}

#prgama pack(1)
struct MyMessagePacked {
	int a;
    char b;
    int c;
    char d;
}

#prgama pack()
int main() {
printf("정렬된 구조체 크기: %d 바이트\n", sizeof(struct MyMessageUnpacked));
printf("정렬되지 않은 구조체 크기: %d 바이트\n", sizeof(struct MyMessagePacked));
return 0;
}

4.2. 다양한 데이터 전송 방식

  1. 고정 길이 데이터 전송
  • 서버와 클라이언트 모두 크기가 같은 버퍼를 정의해두고 데이터를 주고 받음

  1. 가변 길이 데이터 전송
  • 가변 길이 데이터 경계를 구분하기 위해 EOR로 사용할 데이터 패턴을 정해야 함 (흔히 \n 또는 \r\n을 사용)
  • 소켓 수신 버퍼에서 데이터를 한 번에 많이 읽어 1바이트씩 리턴해주는 사용자 정의 함수가 필요

  1. 고정 + 가변 길이 데이터 전송
  • 송신 측에서 가변 길이 데이터의 크기를 미리 계산할 수 있다면 이 전송이 가장 효과적
  • 수신 측에서는 고정 길이 데이터 수신, 가변 길이 데이터 수신 으로 두 번의 데이터 읽기 작업으로 가변 길이 데이터의 경계를 구분해 읽을 수 O

0개의 댓글

관련 채용 정보