Q&A

  • 패킷이 유실되는듯합니다.
클라이언트1은
TVideo콤포넌트 callback 메소드를 잡아서
캠으로 bmp 로 캡춰하고 bmp를 jpg로만들고 다시 array[0..10000] of char
이런형태로 바꾼뒤에.
서버로 날립니다.
서버는 이패킷을 다른 클라이언트2로 보냅니다.
클라이언트 2는 이걸 받아서
다시 jpg로만들고 이미지 콤포넌트 image1 에 뿌려줍니다.


이런형식입니다 헌데 처음에 몇번 잘나오다가 사진이 깨지면서
다시 잘나오다가 깨지다가 jpg #68 에러도나오고
소켓은 Tcp를 씁니다 인디는 아니구요.
클라이언트1이쏘는 패킷을 다른 이미지콤포넌트에 뿌려보면 잘나옵니다만
유달리 소켓을 거쳐서오는 패킷은 잘나오는것도있고
이상하게 깨져서 나오는것도있습니다.
한 10초정도 돌리면 #68 에러가 나오구요.
Tcp를 쓰면 안전하게 패킷이간다는소리를 언뜻들은듯한데
뭐가문제일까요?


해당 소스도 밑에다가 씁니다.
TVideo 콜백 메소드입니다.
procedure Tvchatroomfrm.MyScreenFrameCallback(sender: TObject; lpVhdr: PVIDEOHDR);
var
    vv          : TBitmapInfo;
    nSize,nLoop : Integer;
    VPacket     : TVPacket;
begin
    if ((iIncFrame mod iPtnFrame) = 0) Then Begin
        vv := MyScreen.BitMapInfo;
        FrameToBitmap(bitmap, lpvhdr.lpData, vv);
        nSize   := BitmapToJpg(bitmap);
        if nSize > 0 then begin
            ZeroMemory(@VPacket,sizeof(TVPacket));
            move(Sendbuffer[1], VPacket.Buffer[1], sizeof(Sendbuffer));
            
            VPacket.Header  := 'VPacket'+MAIN_PARTITON_WORD+ThisIdx+MAIN_PARTITON_WORD+includefrm.Myid;
            MycSocket.Socket.SendBuf(VPacket,sizeof(TVPacket));

            end;
    End;
    inc(iIncFrame);
end;


밑에 함수들은 비트맵을 버퍼로 또는 버퍼를 jpg로만드는함수입니다.
Procedure Tvchatroomfrm.BuffertoImg(vImg: TImage; nSize: Integer);
var
  jpg : TJpegImage;
  FSStream : TMemoryStream;
Begin
    try
    FSStream := TMemoryStream.Create;
    FSStream.WriteBuffer(Receivebuffer, nSize);
    jpg := TJpegImage.Create;
    FSStream.Position := 0;
    jpg.LoadFromStream(FSStream);
    vImg.Picture.Graphic := Jpg;
    FSStream.Free;
    jpg.Free;
    except
    end;
End;

Function Tvchatroomfrm.BitmapToJpg(vbitmap: TBitmap): Integer;
var
  jpg : TJpegImage;
  FSStream : TMemoryStream;
Begin
  jpg := TJpegImage.Create;
  FSStream := TMemoryStream.Create;

  jpg.Assign(vBitmap);
  Jpg.Compress;
  jpg.SaveToStream(FSStream);
  FSStream.Position := 0;

  FillChar(Sendbuffer, 0, sizeof(Sendbuffer));
  FSStream.ReadBuffer(Sendbuffer, FSStream.Size);
  Result := FSStream.Size;
  FSStream.Free;
  jpg.Free;
End;

밑에는 Tcp클라이언트 소켓 Read 부분입니다.
procedure Tvchatroomfrm.MycSocketRead(Sender: TObject; Socket: TCustomWinSocket);
var
    TmpSocket   :   TCustomWinSocket;
    VPacket     :   TVpacket;
begin
    try
        Socket.ReceiveBuf(VPacket,sizeof(TVpacket));

        if copy(VPacket.Header,1,7) = 'VPacket' then begin
            move(VPacket.buffer[1],Receivebuffer[1], sizeof(VPacket.buffer));
            BuffertoImg(Image1,sizeof(VPacket.buffer));

        end;
    except
        //
    end;
end;

서버쪽은 별거없고
그냥 팅겨주는역활만합니다.

꼭좀 답변부탁드립니다.
1  COMMENTS
  • Profile
    진광진 2004.10.30 00:52
    질문내용을 봐서 TCP를 사용해서 Network쪽에 패킷이 유실되는것 같지는 않습니다. TCP는 그 데이터의 전송에 대한 신뢰성이 높습니다.
    나타나는 증상과 소스를 언듯 봤을 때 다음 사항을 체크 해주시기 바랍니다.

            Socket.ReceiveBuf(VPacket,sizeof(TVpacket));
    에서
    리턴값을 체크 하셔서 원하는 사이즈를 다 받았는지 확인해 보시기 바랍니다.


    • 신석기
    • 2004.10.25 19:03
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 서기원
      2004.12.01 22:38
      http://www.madchick.com/Default.asp?Page=2&SubPage=2# 에 가셔서 "ActiveX 데모 보기" 해보시면 감이 ...
    • 석주현
      2004.10.25 18:08
      stdCTRL.pas 의 소스를 보면 아실 수 있을 것 같네요. ListBox 같은 경우를 보면 TStrings 와 TString...
    • 최용일
      2004.10.25 18:05
      안녕하세요. 최용일입니다. 에러에 나온것처럼.... TStrings는 추상클래스입니다. 하는일이 거의 없...
    • Andrew Choi
    • 2004.10.25 00:50
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2004.10.25 17:59
      안녕하세요. 최용일입니다. 회원인증을 받으셔야 합니다. 가입하실때 적으신 이메일로 인증메일이 가...
    • 유정헌
    • 2004.10.23 23:25
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 진광진
      2004.10.30 00:52
      질문내용을 봐서 TCP를 사용해서 Network쪽에 패킷이 유실되는것 같지는 않습니다. TCP는 그 데이터의 전송...
    • 델사랑
    • 2004.10.23 22:07
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 파멸의슬픔
      2004.10.23 22:26
      스트링그리드 옵션에서 goRangeSelect := False 해보세요...
    • 파멸의슬픔
      2004.10.23 22:29
      업데이트로 검색하시면 제가 올린 샘플 자료 받으실 수 있습니다...
    • 가딘
      2004.10.23 20:38
      저도 그런 경험을 예전에 한것 같은데 아마 도스프로그램 실행 할때 명령프로프트의 visible 을 설정해서 ...
    • 이규하
    • 2004.10.23 20:26
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 착한천사
      2004.10.25 02:04
      착한천사 김경록입니다.. 오라클 버젼을 먼저 올려주셨으면 좋았다고 생각됩니다.. 답은 아니겠지만.. ...
    • 이규하
      2004.10.26 00:12
      안녕하세요 김경록님 ... 오라클 버전은 9i 9.2.1 이구요. 델파이는 7 ent 입니다. Ora client 도 9.2.1...
    • 착한천사
      2004.10.27 06:03
      흠.. 알 수 없는 일이군여.. 일단, 저도 Oracle 9i를 사용하는 관계로 테스트를 해 보았습니다.. 테스트 ...
    • 가딘
    • 2004.10.23 19:41
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 브라운
    • 2004.10.23 07:50
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 정찬희
      2004.10.24 08:07
      두번째 방법은 모르겠구요... 첫번째 방법은 제가 팁게시판에 올려놓았습니다...
    • 최용일
      2004.10.23 03:24
      안녕하세요. 최용일입니다. class reference를 써서 폼의 타입을 저장하세요. var   &nbs...
    • 쁜지아빠
      2004.10.23 18:03
      아 저런 방법이 있었네요~~!!! 정말 감사합니다.!!! 최용일님 만세~~~~~!!! ^^*
    • 애국자
    • 2004.10.22 23:55
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 이규하
      2004.10.26 00:19
      첫번째 방법 ... 1 번 DBGrid 에 연결 되어 있는 TQuery 에서요. AfterScroll 에다가 2 번 DBGrid 에 ...
    • 김지선
    • 2004.10.22 23:41
    • 1 COMMENTS
    • /
    • 0 LIKES
    • ㉳㉥ㅗ㉣ㅐ㉧ㅛ
      2004.10.25 18:35
      TDataBase를 사용하면 됩니다.... OnLogin 이벤트에...    LoginParams.Values['USER ...
    • 공왕주
    • 2004.10.22 22:35
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 이정은
    • 2004.10.22 19:57
    • 5 COMMENTS
    • /
    • 0 LIKES
    • 권태훈
      2004.10.22 22:48
      있습니다. 통신서버의 설정이 어떤 방식인지 알아야 합니다. 일반적으로 리눅스에 NAT(ipchain)설정...
    • 김춘경
      2004.10.22 21:53
      가능합니다. Indy UDP 컴포넌트를 써서 브로드캐스팅으로 a server의 IP 주소를 알아낸 다음에 그 주소...
    • 최용일
      2004.10.22 22:31
      안녕하세요. 최용일입니다. 브로드캐스팅으론 불가능합니다. 이론상으론 님 말씀처럼 가능합니만... ...
    • 김춘경
      2004.10.23 01:16
      ^^ 질문자의 질문이 간단해서 간단하게 답한겁니다. 제 답변이 너무 짧아서 문제가 되는군요...^^ 이...
    • 최용일
      2004.10.23 03:05
      안녕하세요. 최용일입니다. 제 답변에 기분이 상하셨다면 죄송합니다... ^^ 질문을 해석하는 관점의 ...
    • 박원용
      2004.10.22 21:51
      하얀까마귀님... 과 소나기님 그리고 닐리리님 ... 답변주셔서 감사하구요... 하얀까마귀님이 말씀하...
    • 하얀까마귀
      2004.10.22 19:51
      안녕하세요 하얀까마귀 입니다 어제 답변한게 생각나네요. ㅎㅎ 전어제 색상표시하는 셀이 다르다고 봤는...
    • nilriri™
      2004.10.22 19:35
      가운데 정렬    로 검색해 보세요 스트링그리드 관련 가운데 정렬 답변들을 참고하...
    • 석주현
      2004.10.22 19:51
      그냥 소스로 대신합니다. 회사라 ^^ 그럼  아시리라고 생각을 ^^ =========================...