파일송수신 프로그램을 만들고 있습니다..도움을 주세요.

screen71의 이미지

FTP 같은 파일송수신 프로그램을 만들고 있습니다.
서버는 Linux , 클라이언트는 Windows 계열입니다.
TCP/IP 소켓을 사용하며 논블러킹이며
서버는 데몬형태로 프로세스복제를 하고 있습니다.

가장 단순하게 구조체를 정의하여 클라이언트와 서버간에 send, recv 했으며
실제 data 의 크기는 2048 로 잡고 이름하여 뺑뺑이를 돌렸습니다.
하지만 2048만큼 쪼개서 돌리다보니 너무 많이 발생하는 시스템콜때문에
전송속도가 무지무지 하게 느립니다.

이왕만드는거 한번 제대로 만들어보자는 생각이 들어서 마구마구 생각하는과정
에서 이 초보에게는 감당할수 없는 수많은 의문이 발생해 이렇게 많은분들에게
도움을 요청합니다. 많이 도와주시면 감사하겠습니다.
질문이 말도 안되는 아주 초보적인거겠지만 부디 이해해주시고...부탁드립니다.

<질문1> 패킷정의에 대하여...

typedef struct _packinfo {
        char szcmd[3];    //명령정의
        char szname[50];  //요청 파일명
        long lnsize;      //파일총사이즈
        long lnblock;     //파일블럭수
        long lnmod;       //남은 사이즈
        long lncurrent;   //현재블럭수
        char szdata[2048];//실제데이터
} packinfo;

위의 코드처럼 현재는 패킷정의를 했습니다. 저런형태의 구조체를 보낼때
논블러킹소켓에서 한번에 못받을수 있습니까? 만약 한번에 다 받지 못한다면
데이터가 얼마나 더들어와야 하는지는 어떻게 알수 있을까요?
막연하게 sizeof 로 하면 전제 구조체의 사이즈만 나올텐데...
그리고 한번에 패킷을 다 받지 못하면 결국은 패킷 헤더를 먼저 보내고
데이터를 나중에 보내는 방법을 써야 할텐데 어떤 방법이 더 좋을까요?

<질문2>버퍼링에 대해서 알려주십시요.

결국 시스템콜을 줄이기 위해선 커다란 파일의 일부를 한꺼번에 읽을수
있을만큼 읽어들어 크게 설정된 버퍼에 담아놓고 일정량만 조금씩 조금씩
보내야 될것 같은데 여기서도 버퍼가 어디까지 찼고 어디부터 다시채워야
하는지 어떻게 알수가 있을까요? 즉, 서버쪽 버퍼는 파일에서 한꺼번에 읽고
클라이언트 버퍼는 서버와 같은 크기의 버퍼를 할당하고 패킷으로 조금씩
조금씩 클라이언트버퍼에 채워야 할것 같은데 잘 감(?)이 안옵니다.
간단한 예제라도 보여주시면 어떻게 해볼수 있을것 같은데....

<질문3>가장 최적화된 패킷양은 어떻게 정해야 합니까?

서버와 클라이언트간에 송수신을 할때 한꺼번에 큰 데이터를 보낼수는
없는것 같던데(MTU 값때문이라고 알고 있습니다.) 격국은 원활하게 보낼수
있는 작은 데이터를 꾸준히 받아 채워야 되는겁니까? 아니면 그때그때 상황에
따라 보낼수 있는 양을 알수 있는 방법이 있습니까? 테스트 해본결과 1024와
2048 이 가장원활하고 4096 이후부터는 제대로 보내지 못하더군요.
(이것은 개인적으로 테스트한거라 저의 환경에서만 이러는건지도 모르겠습니다.)
실제 FTP 에서도 고정적인 크기만 보내는가요? 아니면 상황에 따라 때론
작은 데이터를 때론 큰 데이터를 보내는가요?

<질문4>파일을 송수신할때 순차적으로 읽어서 보내는것이 정상적인가요?

질문이 이상한데 저는 파일을 열어서 순서대로 일정한 바이트만큼 보냈습니다.
그런데 ftp 를 이용하여 어떤 미디어 파일을 다운받을때 곰플레이어상에서는
다운받고 있는 중에도 플레이가 되었습니다. 그런데 제가 테스트로 만든 아주
느린 송수신프로그램에서는 곰플레이어가 거부(?)를 하더군요.
제대로된 미디어 파일이 아니라고 나올뿐만 아니라 현재 다른프로그램에서
그 파일을 사용중이라고 나옵니다. 파일송수신을 할때 순차적으로 읽지 않고
다른 방법이 있습니까? 무슨 파일의 헤더를 읽는다든지...등등요.

<요청>저같은 아주 무식한 초보가 봐도 이해가 될만한 송수신 프로그램소스나
FTP 서버와 클라이언트 소스가 있을까요?

추천해주시면 한번 열심히 분석해보겠습니다. 부탁드립니다.

너무 질문할것은 많고 정리는 되지 않아서 마구잡이로 올린것 같아 죄송합니다.
하지만 이곳을 믿습니다. 많은분들 도와주세요..

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.