Q&A

  • 소켓 프로그램에서 대용량의 데이타를 받는 경우의 처리?
안녕하십니까..

클라이언트 소켓프로그램을 짜고 있는데(Indy가 아닌), 서버에서 데이타를 받아오려고 합니다..
그 데이타 양이 65536바이트를 보낸다면,
클라이언트가 한번에 이 양을 다 받을 수도 있겠지만, 망이 안좋아은 경우 몇번에 걸쳐 나누어 받는 경우도 있는 것으로 알고 있습니다.
그래서 버퍼사이즈를 65536으로 하고,Socket1Read이벤트가 발생했을때 데이타 사이즈를 체크해보고 나서 65536바이트가 아니라면 다시 기다려야되는걸루 알고 있습니다.
그렇다면 예를 들어 체크했을때 30000바이트였다면, 어떻게 처리를 해줘야 계속해서 기다리게 되나요? 그리고 운이 좋아서 다음에 받은게 나머지
35536이었다면 이 35536은 알아서 버퍼의 뒤쪽을 채워줍니까,아님 프로그래머가 위치를 지정해주어야합니까..
무슨 뜻인지는 아시겠죠? ^^ 워낙 두서가 없어서리..

그리고 TCP에서 한번에 전송할 수 있는 데이타 사이즈는 최대 몇 바이트 인지요..

부탁드립니다..소켓프로그램은 그 동안 몇 번짰었는데 다 짤막한 것만 해서 별 신경을 안 썼는데 이번은 좀 경우가 다르네요..도와주세요.~~



1  COMMENTS
  • Profile
    이준희 2002.02.05 18:44

    TCP 전송의 경우 최대 1460 바이트가 전송됩니다.

    그렇다고 무조건 1460을 채우는 것은 아닙니다.

    가령 65535 바이트를 한방에 전송한다면 1460 씩 한 10번 나오고 220 바이트가 나왔다

    다시 1460바이트씩 전송되기도 합니다. 그것은 클라이언트에서 버퍼를 읽는

    속도와 관련이 있겠지요... 그러므로 일정한 패킷크기로 잘라서 보내면

    각각의 패킷을 버퍼링 하므로 버퍼링 속도가 양호해 져서 원하는 패킷사이즈

    가 날라갈겁니다.

    그냥 소켓으로 무작정 파일을 한방에 전송하면 클라이언트 모듈은 간단해 집니다만

    서버쪽 모듈 (혹은 받는 클라이언트 쪽)은 무척 난감합니다. 통신망의 상태에

    따라서 나중에 보낸 패킷이 먼저 도착하기도 하기때문입니다. 그렇기 때문에

    어떤 프로토콜을 정의해야 합니다.

    예를 들자면

    TmyProtocolPacket = record
        FileID : String[20];         // unique 한 값을 만들어 줘야 하죠...
        PacketNo : Integer;        // 지금 보낸 패킷이 몇번째 인가
        Length     : Integer;        // 이번 날라온 넘의 유효 크기
        TotalPacket : Integer;    // 전체 패킷은 몇개가 될건가
        Body : Array [1..256] of Byte ;  // 실제 바디
    end;

    물론 이 패킷을 보내기 전에 앞으로 파일을 보낼 작정인데 파일명은 뭐고

    사이즈는 얼마다 하는 정보를 먼저 보내주는 것이 좋습니다. 위의 패킷에

    추가해도 되지만 쓸데없이 중복된 내용을 보낼 필요는 없지요...

    보내는 놈은 파일을 잘라서 바디에 복사해서 보내면 되고,

    받는 넘은 ReceiveThread에서 OnRecieve Event 발생시에

    처음에 파일정보를 받고 메모리를 할당하거나 파일스트림을 열어놓고

    파일 내용이 날라오면 받을때 마다 해당 위치에다가 Write해주면 되지요..

    도움이 되었기를 바랍니다.


         -- 지도 잘 모르는 넘
    • 돌멩이
      2002.02.05 06:17
      ListBox1.Style := lbOwnerDrawVariable; procedure TForm1.ListBox1DrawItem(Control: TWinControl;...
    • 김재오
    • 2002.02.05 03:00
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이준희
      2002.02.05 18:44
      TCP 전송의 경우 최대 1460 바이트가 전송됩니다. 그렇다고 무조건 1460을 채우는 것은 아닙니다. ...
    • 박경록
    • 2002.02.05 00:24
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 박경록
      2002.02.05 01:23
    • 장지용
      2002.02.05 00:29
      Label.Caption := ComboBox.Items[2];
    • 박경록
      2002.02.05 00:52
      그게 아니라여.. 콤보박스 내용이 나타나기를... 1 - AA       --itemi...
    • 이성훈
      2002.02.05 01:16
      for i := 0 to CBox1.Items.Count - 1 do      if Copy(CBox1.Items[i], 0, 1) = '1'...
    • 공성환
      2002.02.05 01:01
      코드값은 1부터 시작이고 ItemIndex는 0부터 시작하니깐... 저장시점에서는 ItemIndex + 1로 조회시 보여...
    • BlueSea
    • 2002.02.04 23:44
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 장지용
      2002.02.05 00:34
      "NMFTP Component" 의 "OnListItem" Event 에 Parameter 로 넘어오는 "Listing...
    • 이미진
      2002.02.04 23:12
      BatchMove를 사용하면 됩니다. BatchMove의 Source와 Destination에 각각의 DataSet을 연결해 주시면 ...
    • * 아자!! *
      2002.02.05 00:07
      답변주셔서 너무고마워요.. 참, 델파이라는게........ 웬지 쉬울것 같으면서두 참 어려운것 같아요. 완전...
    • 이미진
      2002.02.08 23:50
      BatchMove의 Mode 프로퍼티를 Setting 하지 않으신것 같은데여... 꼬옥 batCopy루 해주셔야 해여... 그래...
    • jshope
    • 2002.02.04 21:16
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 갱민이
      2002.02.04 23:49
      Raize 컴포넌트에 보면 TRzMenuButton이란게 있습니다.. 상용 컴포넌트이긴 하지만... 참고하세요..
    • 장명선
      2002.02.04 22:30
      에공 밑에 알려주었는데...검색을 먼저 하시고 올려주세요 이런씩으로 코팅을 하면 됩니다. procedure ...
    • 장석정
      2002.02.19 06:53
      라이센스를 걸려면 일반적으로 하드웨어 종속되게 만들어야 되는데여... 결국 하드웨어에 종속된 키값을 ...
    • 장명선
      2002.02.04 22:32
      소프트웨어적으로 할려면 사용자가 다 만들어야만 가능합니다. 만드는 방법은 어려가지가 있는데 Ini 나 ...
    • 하얀까마귀
      2002.02.04 20:38
      델파이에 들어있는 인스톨쉴드에는 기능이 없구요.. 6은 모르겠구. 인스톨쉴드 프로페셔널에 보시면 그러...
    • 장지용
      2002.02.06 00:01
      BDE > Configuration > System > INIT > "SHAREDMEMSIZE" 값을 증가시켜 보세요. ...
    • major
      2002.02.04 20:34
      흠 좀 그렇겠군여.. 저두 얼마전에 오라클8i를 썼었는 데... 그런데 그런 에러는 없었거든여.. 글구 에...
    • 브래드
    • 2002.02.04 18:54
    • 1 COMMENTS
    • /
    • 0 LIKES
    • skpark
      2002.02.04 19:19
      Insufficient memory for this operation 메모가 모잘라 나는 에러입니다. 혹 어떤system은 (제경험으론&...
    • 서영택
      2002.02.04 14:02
      이방법은 마우스를 클릭했을때 선택한 내용이 뿌려지는 방법입니다... 스트링그리드 이벤트에 onSelectCel...
    • 이경철
    • 2002.02.04 08:24
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 장명선
      2002.02.04 22:35
      MDIWallPaper 라를 컴포넌트가 있습니다. 이걸 이용하면 MDI Form에서도 그림을 집어 넣을수 있을겁니다. ...
    • 이경철
      2002.02.05 06:55
      답변 감사합니다만,... MDIWallPaper 라는 컴포넌트가 어디에 있구.... 쓰는 방법은 무엇인지.... 다...
    • 5782_Click
      2002.02.04 18:45
      image컴포넌트를 사용하심 댑니당..^^
    • 정규성
    • 2002.02.04 06:34
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 최대룡
    • 2002.02.04 03:10
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 5782_Click
      2002.02.04 18:50
      안녕하세요.. 음.... 이게 맞을려나 모르겠네염..ㅡ.ㅡ Qrgroup컴포넌트의 속성중에 Forcenewpage를 Tru...
    • 김기수
      2002.02.04 09:26
      맞습니다. 넘어가지 않는다는게 컴파일시 오류가 난다는 말씀인지요? uses 절에 Qprinters를 추가해 보십...
    • 김태룡
    • 2002.02.04 00:19
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 장지용
      2002.02.05 00:40
      "NMFtp.TimeOut" Property 에 "0"으로 셋팅되어 있지 않다면 "0"으로 셋...
    • 노명환
    • 2002.02.03 09:32
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 데빠이
      2002.02.03 06:35
      안녕하세염...ㅋㅋㅋ 여기 자료실 찾아보면 스트링그리드에 관한 자료는 굉장히 많을줄로 알고 있는데염....
    • 김인수
      2002.02.04 06:27
      고수님 감사합니다 이 은혜를 어떻게 갚아야 할쥐... 너무너무 감사드립니다 항상 몸건강하시구요 술...