2015년 8월 12일 수요일

네트워크 (3)

연결 지향 소켓 =>  TCP
TCP의 네가지 계층

Application 영역

Transport 영역 =>   TCP  ----------------  UDP

Network 영역

Physical 영역


TCP 기반 서버의 구현
1) 서버에서의 기본적인 함수 호출 순서
  1. socket() -- 소켓 생성
  2. bind() -- 소켓에 주소 할당
---------------------------------------------------------------------------------
  3. listen() -- 연결 요청 대기 상태
  4. accept() -- 연결 허용
  5. read() & write() -- 데이터 송수신
  6. close() -- 연결 종료

2) '연결 요청 대기 상태' 로의 진입
int listen(int s, int backlog);
s: '연결 요청 대기 상태' 에서 클라이언트의 연결 요청을 받아들이는 역할을 하게 될 소켓의 파일 디스크립터
backlog : '연결 요청 대기 큐'의 크기를 나타낸다. 인자로 5가 들어오면, 큐의 크기가 5가 되어 클라이언트의 연결 요청을 5개까지 대기시킬 수 있게 된다.

3) 연결 요청 수락하기
int accept(int s, struct sockaddr *addr, int *addrlen);
s : 서버 소켓의 파일 디스크립터
addr : 연결 요청을 수락할 클라이언트의 주소 정보를 저장할 변수의 포인터
addrlen : 함수 호출 시 인자로 전달된 addr 포인터가 가리키는 구조체의 크기를 저장하고 있는 변수의 포인터( == 리턴 받은 클라이언트의 주소 정보 길이 )
*accept 함수는 호출 성공 시 내부적으로 클라이언트와의 데이터 입출력을 하기 위해 사용될 소켓을 생성하고, 그 소켓의 파일 디스크립터를 리턴해준다.



TCP 기반 클라이언트의 구현
1) 클라이언트의 기본적인 함수 호출 순서
  1. socket() -- 소켓 생성
  2. connect() -- 연결 요청
  3. read() & write() -- 데이터 송수신
  4. close() -- 연결 종료

int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
sockfd : 미리 생성해 놓은 소켓의 파일 디스크립터
serv_addr : 연결 요청을 보낼 서버의 주소 정보를 지닌 구조체 변수의 포인터
addrlen : serv_addr 포인터가 가리키는 주소 정보 구조체 변수의 크기가 된다.
* connect 함수가 리턴되는 시점은, 연결 요청이 서버에 의해 수락되거나, 오류가 발생해서 연결 요청이 중단되는 경우이다. 만약에 연결 요청이 바로 이루어지지 않고 서버의 대기 큐에서 대기하고 있는 상태라면 connect 함수는 리턴되지 않고 블로킹 상태에 있게 된다.


TCP 클라이언트 서버 함수 호출 관계

Iterative 서버의 구현


에코 서버/클라이언트의 구현
에코 클라이언트 서버 모델
1) 에코 서버의 구현
클라이언트가 전송해 주는 데이터를 읽어서 버퍼에 저장한 후에 버퍼에 있는 데이터를 그대로 클라이언트에게 전송해 주게 된다.
while( (str_len = read(clnt_sock,message,BUFSIZE)) != 0) {
write(clnt_sock, message, str_len);
write(1, message, str_len);
}
close(clnt_sock);
return 0;
}

2) 에코 클라이언트의 구현
에코 클라이언트의 구현 단계에서는 데이터를 보낼 서버에 연결 요청을 보내고 수락되는 일반적인 클라이언트의 과정을 거치게 되고, 연결이 완료되면 서버로 데이터를 전송하고 에코되어 돌아오는 데이터를 수신하는 과정을 거치게 된다.
while(1) {
   // 메시지 입력, 전송
   fputs("전송할 메시지를 입력하세요 (q to quit) : ", stdout);
   fgets(message, BUFSIZE, stdin);

   if(!strcmp(message, "q\n")) break;
   write(sock, message, strlen(message));

   // 메시지 수신, 출력
   str_len = read(sock, message, BUFSIZE-1);
   message[str_len] = 0;
   printf("서버로부터 전송된 메시지 : %s \n", message);
  }
   close(sock);
   return 0;
}

에코 클라이언트!   TCP 기반에서의 완벽 구현


비연결 지향 소켓 => UDP

댓글 없음:

댓글 쓰기