클라이언트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;
서버쪽은 별거없고
그냥 팅겨주는역활만합니다.
꼭좀 답변부탁드립니다.
나타나는 증상과 소스를 언듯 봤을 때 다음 사항을 체크 해주시기 바랍니다.
Socket.ReceiveBuf(VPacket,sizeof(TVpacket));
에서
리턴값을 체크 하셔서 원하는 사이즈를 다 받았는지 확인해 보시기 바랍니다.