|
혀비.오기 님이 쓰신 글 :
: 소켓 통신 프로그램을 작성중
: 서버에서 클라이언트로 정보를 전달해야 하는데
: 일반 텍스트보다는 TStringList를 전달 하는게 좋을거 같은데
: 방법이 있나요?
: 참고로 TServerSocket은 stThreadBlocking모드이고
: TWinSocketStream *pStream;
:
: pStream->Write(void *, int)를 이용합니다.
: 방법이 있으면 어떻게 하면 되는지요
:
: 서버
: TStringList *pStringList = new TStringList();
: // pStringList에 정보를 넣고
: ...
: pStream->Write(pStringList, sizeof(pStringList)) 로 보내고
: 클라
: TStringList *pStringList = new TStringList();
:
: Socket->RecieveBuf(pStringList, RecieveSize);
: 로 받으니 pStringList->Strings[0]은 잘못된 메모리를 참조하는 에러가 나네요.
TStringList는 TStrings를 상속받았으며 이에는 아래의 두 메소드가 있습니다.
virtual void __fastcall SaveToStream(TStream* Stream);
virtual void __fastcall LoadFromStream(TStream* Stream);
한편, TWinSocketStream의 조상 중에는 TStream이 있습니다.
따라서, 아래와 같이 할 수 있습니다.
보내는쪽: pStringList->SaveToStream(pStream);
받는쪽: pStringList->LoadFromStream(pStream);
이렇게 하려면 사전에 양단간에 약속이 되어 있어야 겠습니다(해당 프로그램에 맞는 프로토콜 작성 필요).
현재 내가 받는 것이 TStrings라는 것을 알아야 이렇게 해도 오류가 발생하지 않는 것이니까요.
프로토콜들을 보면 보통 메시지 헤더를 만드는 게 일반적입니다.
처음 몇바이트에 현재 보내는 메시지 본문이 어떤 구조를 사용해야 하는 것인지를 지정하고.
각각의 메시지의 끝은 어떤 마크를 사용할 것인지 등을 지정하는 프로토콜.
그리고, 위의 예에서 양단간의 프로그램 개발 언어의 종류나 개발도구가 다르면 매우 곤란해질 수 있습니다.
잘은 모르겠습니다만, CORBA에 대해 한 번 알아보는 것도 도움이 될것입니다.
|