소켓 프로그래밍에서 파일 다운로드에 대해서...
글쓴이: kernelbomb / 작성시간: 화, 2004/03/16 - 9:31오전
간단한 서버가 있습니다.
클라이언트의 요청이 오면 fork해서 해당 클라이언트가
요청한 파일을 읽어 전송해 줍니다.
테스트를 위해서 클라이언트 30개를 fork 시켜 하나의 파일을
동시에 받게 테스트 해봤는데요.
다운받는 파일을 모니터링 해보니 전송받는 파일들이 일정하게
동시에 받는것이 아니라, n번째 클라이언트가 파일을 선점하면서
받는것을 확인했습니다.
문제는, 이렇게 하지 않고 30개의 접속이 오면 골고루 클라이언트에게
파일을 다운받게 해주고 싶은데요. 서버에서 어떻게 처리를 해줘야 할지
모르겠습니다.
제 테스트 과정에 문제가 있는 건가요?
PS : 소켓은 일반적인 블럭소켓을 사용했습니다.
Forums:
일단 생각해 볼 수 있는게 다운받을 파일이 동일한것에 대한 거라면대상
일단 생각해 볼 수 있는게 다운받을 파일이 동일한것에 대한 거라면
대상 파일로 세마포어를 만들어서 각 프로세스마다 접근 싱크를 관리
할 수 있을거 같네요. 이 방법은 유동적으로 클라언트 관리가 까다로울수
있을거 같은데 이때 각 클라이언트마다 가중치를 가지고 접근에 대한 FIFO
큐에 대기 시킨다음 처리 해 줘도 될거 같습니다.
또 다른 방법으로 대상 파일을 원하는 클라이언트의 수로 1/n 해서
전송 트래픽을 고정으로 가져 가는건 어떨까요.
요즘 PDBOX, ANYFILE 같은 서비스가 인기가 많은듯 한데 아마 이쪽
관련 해서 작업하시나 봐요?.. 요즘 PDBOX는 다운로드 클라이언트가
당나귀의 클라이언트 역할을 하게 제작된거 같더군요. 다운로드만 하는게
아니라 특정 block에 대한 서버 역할도 하게 해서 다운로드 속도를 향상
시키는 방식으로 말이죠.
screen + vim + ctags 좋아요~
일정블럭씩 쪼개서 전송합니다.
보통 한번에 전송하지 않고 일정 블럭으로 쪼개서 전송하는 것을 주로 합니다.
그렇게 함으로서 클라이언트는 받고 해당 블럭을 체크하고(체크섬같은거) 다음거 요청해서 받고... 머 그런방식을 사용하죠.
아니면 당나귀같이 블럭단위로 끊어서 다니면 대규모 데이터를 보낼때 블럭킹 소켓에서 지체되는 것을 막을 수 있죠. 보통 한번에 왕창 보내는 것은 좋지 않습니다.
========================================
* The truth will set you free.
혹시 서버쪽에서 파일 보낼때while (파일 다 보낼때까지)
혹시 서버쪽에서 파일 보낼때
while (파일 다 보낼때까지)
뭐 이런식으로 왕창 보내시지 않았나요? 꼭 파일 전송이 아니더라도 한 프로세스에서 for (;;) 이런식으로 확 돌려버리면 먼저 진입한 녀석이 상당한 리소스를 독점해버립니다.
이런 케이스 아닐까싶은데, 짐작입니다 -_-;;
산넘어 산
핫!
맞습니다. *^^*
while(1)
요런식으로 돌려버렸죠. ㅜㅜ;
일단 fork(); 방식을 사용했기 때문에
알아서 클라이언트를 처리하게 했으니...
한
그런데 전송에 관계된 루프는 fork() 한 후에 돌렸거든요.
당신들을 사랑합니다.
댓글 달기