소켓 프로그래밍에서 파일 다운로드에 대해서...

kernelbomb의 이미지

간단한 서버가 있습니다.

클라이언트의 요청이 오면 fork해서 해당 클라이언트가

요청한 파일을 읽어 전송해 줍니다.

테스트를 위해서 클라이언트 30개를 fork 시켜 하나의 파일을

동시에 받게 테스트 해봤는데요.

다운받는 파일을 모니터링 해보니 전송받는 파일들이 일정하게

동시에 받는것이 아니라, n번째 클라이언트가 파일을 선점하면서

받는것을 확인했습니다.

문제는, 이렇게 하지 않고 30개의 접속이 오면 골고루 클라이언트에게

파일을 다운받게 해주고 싶은데요. 서버에서 어떻게 처리를 해줘야 할지

모르겠습니다.

제 테스트 과정에 문제가 있는 건가요?

PS : 소켓은 일반적인 블럭소켓을 사용했습니다.

김충길의 이미지

일단 생각해 볼 수 있는게 다운받을 파일이 동일한것에 대한 거라면
대상 파일로 세마포어를 만들어서 각 프로세스마다 접근 싱크를 관리
할 수 있을거 같네요. 이 방법은 유동적으로 클라언트 관리가 까다로울수
있을거 같은데 이때 각 클라이언트마다 가중치를 가지고 접근에 대한 FIFO
큐에 대기 시킨다음 처리 해 줘도 될거 같습니다.

또 다른 방법으로 대상 파일을 원하는 클라이언트의 수로 1/n 해서
전송 트래픽을 고정으로 가져 가는건 어떨까요.

요즘 PDBOX, ANYFILE 같은 서비스가 인기가 많은듯 한데 아마 이쪽
관련 해서 작업하시나 봐요?.. 요즘 PDBOX는 다운로드 클라이언트가
당나귀의 클라이언트 역할을 하게 제작된거 같더군요. 다운로드만 하는게
아니라 특정 block에 대한 서버 역할도 하게 해서 다운로드 속도를 향상
시키는 방식으로 말이죠.

screen + vim + ctags 좋아요~

sunyzero의 이미지

보통 한번에 전송하지 않고 일정 블럭으로 쪼개서 전송하는 것을 주로 합니다.
그렇게 함으로서 클라이언트는 받고 해당 블럭을 체크하고(체크섬같은거) 다음거 요청해서 받고... 머 그런방식을 사용하죠.
아니면 당나귀같이 블럭단위로 끊어서 다니면 대규모 데이터를 보낼때 블럭킹 소켓에서 지체되는 것을 막을 수 있죠. 보통 한번에 왕창 보내는 것은 좋지 않습니다.

========================================
* The truth will set you free.

dudungsil의 이미지

혹시 서버쪽에서 파일 보낼때

while (파일 다 보낼때까지)

뭐 이런식으로 왕창 보내시지 않았나요? 꼭 파일 전송이 아니더라도 한 프로세스에서 for (;;) 이런식으로 확 돌려버리면 먼저 진입한 녀석이 상당한 리소스를 독점해버립니다.

이런 케이스 아닐까싶은데, 짐작입니다 -_-;;

산넘어 산

kernelbomb의 이미지

맞습니다. *^^*

while(1)

요런식으로 돌려버렸죠. ㅜㅜ;

일단 fork(); 방식을 사용했기 때문에

알아서 클라이언트를 처리하게 했으니...

Quote:
프로세스에서 for

그런데 전송에 관계된 루프는 fork() 한 후에 돌렸거든요.

당신들을 사랑합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.