Q&A

  • UDP의 SendStream을 이용한 화상채팅 프로그램에서..
안녕하세요?

C++빌더 프로그램을 짜는데 델파이소스의 도움을 많이 받고 있습니다. ^^



화상이미지데이터를 스트림과 UDP를 이용해서 전달하려고 하는데요,

UDP의 SendStream부분에서 에러가 납니다.

컴파일에는 문제가 없고, Access violation에러가 나네여...

도움 부탁드릴께여~



LRESULT CALLBACK VideoCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)

{

//스트림을 사용해서 비트맵을 전송하기위해 비트맵을 구성하는 부분..

BYTE * BmpBuff = (BYTE *) malloc( sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 320*240*3 );

TMemoryStream* myStream = new TMemoryStream();

Graphics::TBitmap* myBIT = new Graphics::TBitmap();



memcpy( BmpBuff, &Form1->DefaultBmpFileHeader, sizeof(BITMAPFILEHEADER) );

memcpy( ((BYTE *)BmpBuff + sizeof(BITMAPFILEHEADER)), &Form1->DefaultBmpInfo, sizeof(BITMAPINFOHEADER) );

memcpy( ((BYTE *)BmpBuff + sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER)), lpVHdr->lpData, 320*240*3 );



myStream->Position = 0;

myStream->Write(BmpBuff, sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 320*240*3);



myStream->Position = 0;

myBIT->LoadFromStream(myStream);

Form1->Image1->Picture->Assign(myBIT);

Form1->Canvas->Draw( 0, 0, Form1->Image1->Picture->Graphic)



Form1->NMUDP1->LocalPort = 7000;

Form1->NMUDP1->RemoteHost = "33.33.113.83";

Form1->NMUDP1->RemotePort = 6000;

Form1->NMUDP2->LocalPort = 6000;

// 이 부분에서 에러가 납니다. access violation error.....

Form1->NMUDP1->SendStream(myStream);



delete myStream;

delete myBIT;

free(BmpBuff);



return (LRESULT) TRUE;

}

2  COMMENTS
  • Profile
    이경문 2001.01.11 08:08
    Stream의 크기가 넘 크네요.

    UDP는 TCP와는 다르게 그 크기가 제한되어 있습니다.

    정확한 사이즈는 네트워크의 성격과 관련되기 때문에 잘 모르겠지만

    암튼 320x240x3 바이트도 넘는 것을 한번에 보낸 수는 없습니다.

    잘라서 보내 보시기 바랍니다.



    Applekiss wrote:

    > 안녕하세요?

    > C++빌더 프로그램을 짜는데 델파이소스의 도움을 많이 받고 있습니다. ^^

    >

    > 화상이미지데이터를 스트림과 UDP를 이용해서 전달하려고 하는데요,

    > UDP의 SendStream부분에서 에러가 납니다.

    > 컴파일에는 문제가 없고, Access violation에러가 나네여...

    > 도움 부탁드릴께여~

    >

    > LRESULT CALLBACK VideoCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)

    > {

    > //스트림을 사용해서 비트맵을 전송하기위해 비트맵을 구성하는 부분..

    > BYTE * BmpBuff = (BYTE *) malloc( sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 320*240*3 );

    > TMemoryStream* myStream = new TMemoryStream();

    > Graphics::TBitmap* myBIT = new Graphics::TBitmap();

    >

    > memcpy( BmpBuff, &Form1->DefaultBmpFileHeader, sizeof(BITMAPFILEHEADER) );

    > memcpy( ((BYTE *)BmpBuff + sizeof(BITMAPFILEHEADER)), &Form1->DefaultBmpInfo, sizeof(BITMAPINFOHEADER) );

    > memcpy( ((BYTE *)BmpBuff + sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER)), lpVHdr->lpData, 320*240*3 );

    >

    > myStream->Position = 0;

    > myStream->Write(BmpBuff, sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 320*240*3);

    >

    > myStream->Position = 0;

    > myBIT->LoadFromStream(myStream);

    > Form1->Image1->Picture->Assign(myBIT);

    > Form1->Canvas->Draw( 0, 0, Form1->Image1->Picture->Graphic)

    >

    > Form1->NMUDP1->LocalPort = 7000;

    > Form1->NMUDP1->RemoteHost = "33.33.113.83";

    > Form1->NMUDP1->RemotePort = 6000;

    > Form1->NMUDP2->LocalPort = 6000;

    > // 이 부분에서 에러가 납니다. access violation error.....

    > Form1->NMUDP1->SendStream(myStream);

    >

    > delete myStream;

    > delete myBIT;

    > free(BmpBuff);

    >

    > return (LRESULT) TRUE;

    > }

  • Profile
    Applekiss 2001.01.12 02:07
    ^^

    먼저 답변 감사드립니다..

    ㅠ.ㅠ쪼개서 보내는 것까지는 구현에 성공했습니다.

    udp에가 2048까지는 무리없이 보내는데 그 이상은 안되더군요...

    쪼개서 보내고 받은 거 붙이는데 문제가...

    TMemoryStream의 SetSize가능 크기가150000정도 밖에 안되더군요...

    White또는 CopyFrom를 이용하면 계속 붙이는게 가능한것 같습니다..



    잘라서 붙이는데 문제가 생겨서 헤메고 있는중입다...ㅠ.ㅠ

    UDP Api로 구현하는 방법 일러 주시면 감사 하겠습니다..

    컴포넌트를 쓰니....넘 구속되는 느낌이..글구 안되고 그래서 부탁드립니다..ㅠ.ㅠ

    그럼...

    좋은 하루 되세요~





    이경문 wrote:

    > Stream의 크기가 넘 크네요.

    > UDP는 TCP와는 다르게 그 크기가 제한되어 있습니다.

    > 정확한 사이즈는 네트워크의 성격과 관련되기 때문에 잘 모르겠지만

    > 암튼 320x240x3 바이트도 넘는 것을 한번에 보낸 수는 없습니다.

    > 잘라서 보내 보시기 바랍니다.

    >

    > Applekiss wrote:

    > > 안녕하세요?

    > > C++빌더 프로그램을 짜는데 델파이소스의 도움을 많이 받고 있습니다. ^^

    > >

    > > 화상이미지데이터를 스트림과 UDP를 이용해서 전달하려고 하는데요,

    > > UDP의 SendStream부분에서 에러가 납니다.

    > > 컴파일에는 문제가 없고, Access violation에러가 나네여...

    > > 도움 부탁드릴께여~

    > >

    > > LRESULT CALLBACK VideoCallbackProc(HWND hWnd, LPVIDEOHDR lpVHdr)

    > > {

    > > //스트림을 사용해서 비트맵을 전송하기위해 비트맵을 구성하는 부분..

    > > BYTE * BmpBuff = (BYTE *) malloc( sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 320*240*3 );

    > > TMemoryStream* myStream = new TMemoryStream();

    > > Graphics::TBitmap* myBIT = new Graphics::TBitmap();

    > >

    > > memcpy( BmpBuff, &Form1->DefaultBmpFileHeader, sizeof(BITMAPFILEHEADER) );

    > > memcpy( ((BYTE *)BmpBuff + sizeof(BITMAPFILEHEADER)), &Form1->DefaultBmpInfo, sizeof(BITMAPINFOHEADER) );

    > > memcpy( ((BYTE *)BmpBuff + sizeof(BITMAPFILEHEADER)+ sizeof(BITMAPINFOHEADER)), lpVHdr->lpData, 320*240*3 );

    > >

    > > myStream->Position = 0;

    > > myStream->Write(BmpBuff, sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + 320*240*3);

    > >

    > > myStream->Position = 0;

    > > myBIT->LoadFromStream(myStream);

    > > Form1->Image1->Picture->Assign(myBIT);

    > > Form1->Canvas->Draw( 0, 0, Form1->Image1->Picture->Graphic)

    > >

    > > Form1->NMUDP1->LocalPort = 7000;

    > > Form1->NMUDP1->RemoteHost = "33.33.113.83";

    > > Form1->NMUDP1->RemotePort = 6000;

    > > Form1->NMUDP2->LocalPort = 6000;

    > > // 이 부분에서 에러가 납니다. access violation error.....

    > > Form1->NMUDP1->SendStream(myStream);

    > >

    > > delete myStream;

    > > delete myBIT;

    > > free(BmpBuff);

    > >

    > > return (LRESULT) TRUE;

    > > }