처음에 쓰여졌던 글을 보았다면 이제 이 글을 보자. 이 것은 처음의 것을 바탕으로 한 간단한 예제이다.

우선 우리가 이번 편에서 유심히 봐야 할 것들을 집어 보겠다.

1. interative server를 구현 하였다. interative server란. 1개의 서버에 다수의 클라이언트가 접속을 하고자 할때 동시적으로 접속하여 동시에 일을 처리 하는 것이 아니라 클라이언트에게 순서를 부여하여 접속된 순서되로 처리 하는 방식을 말 한다.

우리는 서버쪽 프로그램의 listen(), accept(), close()를 유심히 본다. 전과 다르게 for(;;)를 이용한 무한 루프도 존재한다.

2. 파일 관련 함수 : 여기서는 파일을 전송하다 보니 파일 관련된 함수를 조금 사용한다. 에 대하여 조금 있다 얘기 하겠다 간단하게 fopen(), fread()가 쓰여진다.

여기까지가 전과 달라진 부분일 것이다.

앞에서 말한데로 파일 관련함수를 보자.

fopen() : 파일을 여는 함수이다. 서버 프로그램 85번째하고 95번째 줄을 보자. 그곳에서 함수가 사용되어졌다. 리턴 값으로 식별자가 오고 1번째 인자로 파일명, 2번째로 읽기 전용 옵션이 붙었다.

fread() : 파일의 내용을 포인터로 받아 오는 함수이다. 서버 프로그램 88, 98번째 라인이다. 1번째 인자로 파일을 받아올 포인터 변수, 2번째로 파일의 크기 3번째는 횟수, 4번째는 파일 식별자가 되겠다.

이정도면 어렵지 않것이라고 생각이 든다.

그럼 이제 소스 흐름 설명에 들어가겟다.

전과 같이 서버를 먼저 실행한다.

그럼

순서 1) InterServer.c --> 실행.

  socket() 호출.

  bind()호출.

  listen()호출.

  for(;;)   그리고 무한 루프가 나온다.  --> 유심히 보라. 무한 루프다.

  clntsock = accept()호출.    이제 서버 프로그램은 대기 상태가 되어진다. 만약 신호가 들어오면 리턴값으로 sock식별자를 받는다.

순서 2) InterClient.c --> 실행.

  socket()호출.

  connect()호출.    이제 서버를 깨운다.

  recv()   전송을 기다리며 대기 상태를 유지한다.

순서 3) 서버가 다시 실행된다. 이유는 클라이언트에서 접속(connect())가 실행되었기 때문이겠다.

  fopen()   파일 열고.

  fread()   파일의 정보를 가져온다.

  send()   파일의 정보를 전송한다.

순서 4) 전송된 파일을 받는다. 이제 깨어난다.

  전송받은 파일을 프린트 해준다. 이로서 close()에 의해 소켓을 닫고 프로그램은 종료된다.

순서 5)

  close(clntsock)    클라이언트와의 접속을 끊는다. 이제 다른 클라이언트와 통신을 할 수 있는 준비가 되었다.

  for()에 의하여 다시 accept()를 호출하고 대기 되어 있던 다음 클라이언트를 반복 실행한다. 이것이 interative server의 기본 동작이다. 

  일반적으로 작은 파일을 빠르게 전송하고 종료하는 서버라면 유용할 것이나 그렇지 않는 것이 대부분이기 때문에 마니 사용되지 않을 것으로 생각된다.


InterServer.c

서버용 소스

InterClient.c

클라이언트용 소스


출처 카페 > Micro Korea / 한국
원본 http://cafe.naver.com/microos/68
2006/05/12 02:46 2006/05/12 02:46
Trackback address :: http://4ellene.net/tt/trackback/861

Comments List

  1. distintas shemale 2008/05/23 05:19

  2. 嫄몄

Write a comment.

[로그인][오픈아이디란?]