: 응용 프로그램 수준에서 주고받는 데이터의 형식, 의미, 처리 방식을 정의한 프로토콜,
c언의 구조체로 표현
- 고정 길이 전송: 송신자 고정 길이 데이터를 보내고 수신자 고정 데이터 읽음
=> 주고받을 데이터 길이 변동폭이 크지 않을 때 적합
- 가변길이전송: 송신자는 가변 길이 데이터를 보내고 끝 부분에 특별 표시 (EOR, End of Record), 수신자는 EOR 이 나올 때까지 데이터 읽음
=> 생성될 데이터 길이를 미리 알 수 없을 때
- 고정 + 가변길이 전송: 송신자는 보낼 데이터 크기를 고정 길이 데이터로 보내고 이어서 가변 보냄, 수신자는 고정 길이 데이터를 읽어서 뒤따라올 가변 데이터의 길이를 알아냄, 이 길이만큼 데이터 읽음
=> 일반적으로 권장, 구현의 표의성과 처리 효율에서 유리
- 데이터 전송 후 종료: 송신자는 가변 길이 데이터 전송 후 접속을 정상 종료(closesocket() 함수 호출), 수신자는 recv() 함수의 리턴 값이 0(정상 종료) 될 때까지 데이터 읽음
=> 한쪽에서 일방적으로 데이터 보내는 경우
#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;
}