|
하하하 저에게 거래를 제안하시다니.. 제가 통신 프로그램만 7년을 넘게 해오다 보니. ㅋㅋㅋ
인디는 사실 저는 잘 안씁니다. 왜냐구요? 그게 컴포넌트를 설치를 해야 하니깐요.. ㅡㅡ; 귀찮아서 .....
어지간히 큰 프로젝트 아니면, 빌더 기본컴포넌트로 충분하더군요.
큰 프로젝트는 대부분 만들어서 썻습니다.
그렇다고, 모르는건 아닙니다. 통밥이라는게 생기죠...
제가 이상한건지는 모르지만, 인디 9를 사용하고 UDP, client server 메시지 교환 5분만에 완성 ㅡㅡ;
예상은 하셨겠지만, 로컬에서만 테스트 해봤습니다.
클라이언트 소스는
void __fastcall TForm1::FormCreate(TObject *Sender)
{
IdUDPClient1->Host = "192.168.123.2";
IdUDPClient1->Port = 1000;
IdUDPClient1->Active = true;
IdUDPClient1->ReceiveTimeout = 5000; // 밀리섹
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString strReceiveString;
//데이터 보내기
IdUDPClient1->SendBuffer(edtSendData->Text.c_str(), edtSendData->Text.Length());
//데이터 받기
strReceiveString = IdUDPClient1->ReceiveString();
//받은 데이터 표기
Memo1->Lines->Add(strReceiveString);
}
//---------------------------------------------------------------------------
서버 소스는
void __fastcall TForm1::FormCreate(TObject *Sender)
{
IdUDPServer1->DefaultPort = 1000;
IdUDPServer1->Active = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdUDPServer1UDPRead(TObject *Sender,
TStream *AData, TIdSocketHandle *ABinding)
{
char String[1024];
memset(String, 0x00, sizeof(String));
//데이터 받기
AData->ReadBuffer(String, AData->Size);
Memo1->Lines->Add(String);
//데이터 보낸 곳으로 데이터 다시 보내기
ABinding->SendTo(ABinding->PeerIP, ABinding->PeerPort, edtSendData->Text.c_str(), edtSendData->Text.Length());
}
//---------------------------------------------------------------------------
설마 모르셨을리는 없을테구.. 저두 ReceiveBuffer로 안되던 경험이 있었는데, 위의 방식으로 그냥 지나갔습니다.
뭐.. 그담부터는 위 ReceiveString으로 몇번 사용을 해봤던 경험이 있죠... ㅡㅡ;
이 것이 답이 될른지는 모르겠습니다.
하지만, 인디 샘플에도 위와 같은 방식으로 사용한다는 것을 알아두세요. ^^;
초보맨 님이 쓰신 글 :
: 안녕하세요?
: 상당히 초보적인 질문인데 부끄럽네요. UDP는 처음이라서
:
: 실제아이피를 쓰는 서버가있고, 가상아이피를 쓰는 클라이언트가 있다고 가정했을때입니다.
: 인디에 TIdUDPServer, TIdUDPClient 컴포넌트를 이용했습니다.
:
: UDPClient ----> UDPServer 로 데이터는 잘 갑니다.
: 그런데 서버에서 클라이언트로 응답을 해주는 메시지가 도착하지 않습니다.
:
: 서버는 UDPRead이벤트에서 코딩하고
: 클라이언트는 UDPClient->ReceiveBuffer 를 해주는 쓰레드를 만들었습니다.
: 로그를 남겨보니 서버에선 잘 읽고 데이터도 제대로 들어왔더군요.
: 서버에서 클라이언트로 보내는데서 문제가 있습니다.
:
: UDP의 경우 NAT 문제로 데이터가 전달되지 않을수 있다는건 알고있습니다.
: 그래서 홀펀칭을 이용하려고 합니다.
: 근데 홀펀칭이 100% 되는게 아니기 때문에 그때 서버를 통해 데이터를 중계해주려고 합니다.
: 지금하는게 중계서버 부분인데 여기서도 버벅거리는군요.
:
: 길게적었는데..
: 제 질문을 요약하겠습니다.
: UDP 채팅프로그램을 만든다고 가정했을때, 1명이 대화한 내용을 다른 한명에게도 전해줘야 하는데
: 유저는 NAT아래에 있습니다.
: TIdUDPServer, TIdUDPClient 컴포넌트를 이용할때 어떻게 구현이 가능한지요?
: 홀펀칭을 쓰지 않고 불가능합니까?
|