Indy UDP를 이용한 통신 예제입니다.
Client -> Server -> Client 로 주고 받는 방식이고요,
UDP 특성상 뒤의 Server -> Client는 공유기 단에서 걸러지는 것도 있습니다.
Indy 버젼은 9.0.11 버젼입니다.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "IdBaseComponent"
#pragma link "IdComponent"
#pragma link "IdUDPBase"
#pragma link "IdUDPClient"
#pragma link "IdUDPServer"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
IdUDPClient1->Host = Edit1->Text;
IdUDPClient1->Port = StrToIntDef(Edit2->Text, 9999);
IdUDPServer1->DefaultPort = StrToIntDef(Edit3->Text, 9999);
try {
IdUDPServer1->Active = true;
} catch(...) {
ShowMessage("서버 실행 오류");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
String stReceive;
try {
// 데이터를 송신
IdUDPClient1->Send(Memo1->Lines->Text);
// Read 이벤트가 병행 실행될 수 있도록 메시지 프로세싱
// 한 클라이언트안에 클라이언트/서버 모듈이 동시에 들어있지 않다면 필요가 없습니다
// 이 것이 없으면 이벤트 순서상 응답 내용이 한번씩 밀려서 처리되게 됩니다.
Application->ProcessMessages();
// 최대 100ms 만큼 응답 데이터를 대기함
stReceive = IdUDPClient1->ReceiveString(100);
ShowMessage("송신을 성공했습니다\n응답 내용 : " + stReceive);
} catch(...) {
ShowMessage("송신을 실패했습니다");
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdUDPServer1UDPRead(TObject *Sender, TStream *AData, TIdSocketHandle *ABinding)
{
char *caBuffer;
String stBuffer, stSum;
if(AData->Size < 3) return;
caBuffer = (char *)malloc(AData->Size + 1);
AData->Read(caBuffer, AData->Size);
caBuffer[AData->Size] = 0;
// 수신 내용 표기
Memo2->Lines->Text = (String)caBuffer;
// 응답 보내기
ABinding->SendTo(ABinding->PeerIP, ABinding->PeerPort, Memo3->Lines->Text.c_str(), Memo3->Lines->Text.Length());
// 메시지 처리
Application->ProcessMessages();
free(caBuffer);
}
//---------------------------------------------------------------------------
|