본문 바로가기

카테고리 없음

[C언어] TCP 코딩시

2011.04.08
: 네트워크 프로그래밍 수업
  - 베스킨 라빈스 게임
  - 최대 3명까지 접속 가능하다.
  - 게임 진행방식은 1/2/3 과 같은 입력 방식을 취하며, 최대 3자리 연속적인 숫자를 입력하여 마지막 31을 입력한 사람이
     벌칙에 걸리는 게임이다.
  - 1/2/3을 입력했으면, 다음 순서 사람은 4/5를 입력하고 다음 순서사람은 6/7/8을 입력하여 31을 입력 사람이 진다.
  

- 패킷은 바이트 스트림이다. 그러므로 몇 바이트만큼씩 읽어야할지 알아야한다
- 메모리 구조를 숙지하자
메모리는 리틀인디언이다(x0806) low가 상위로 high가 하위로 배치된다

 typedif struct header{
int type;
int len;
int checksum;
}h;

read(socket, &h, sizeof(struct header));
- &h 부분은 void* 형이다
- h의 주소부터 struct header 크기만큼 데이터를 받는다
- h.type는 구조체 크기(12바이트)의 길이로 데이터가 들어가있고 int(4바이트)를 읽어 올 수 있다.
- 결국, int와 같은 변수형은 연속된 바이트 중에서 변수형 크기만큼 묶어서 읽는다고 보면된다.

- 전송시, 데이터가 클경우 한번에 올거라는 보장은 못한다. 끊겨서 보내 질 수 있다.
nbyte = read(socket, buf, 10);
- 수신을 10개를 받을 수 있다고 지정했지만, 데이터가 6만 보내진다면, 읽은 크기(nbyte)를 확인하여 
   10개가 모두 받을 수 있도록 해야한다.

- socket이 갑자기 끊겼을 경우 대비(우아한 종료)
1. 서버와 클라이언트간 접속 종료 메시지
 - 클라이언트가 서버에게 종료 메시지를 보냄
 - 서버는 종료 메시지를 수신하여 종료된 클라이언트 소켓을 소켓 배열에서 제거한다

2. 강제 종료시
 - 클라이언트가 갑자기 종료되었을 때, 
    서버에게 자신이 강제종료됬다는 것을 알리기위해 atexit()를 사용하여 프로그램 종료시 exit()가 자동으로
    호출되는데 이때 선행 함수를 등록한다. 선행 함수에서는 서버에게 자신이 종료됬다는 것을 알린다.
 
 - 서버도 강제 종료 되었을때 위와같은 행동지침을 따른다.


- 데이터를 보낼때 헤더에 데이터 길이를 우선 보내는 것이 좋다.