http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_res&no=261
에 실행 파일과 프로젝트 올려 두었습니다.
BCB 5 버젼이고, Indy 버젼은 9.0.11 버젼입니다.
아시겠지만 UDP 특성상 데이터가 정확히 도달하지 않기 때문에, 차후 SUM Code 등으로 데이터가
정확히 맞는지 체크, 또한 데이터 수신 순서도 체크하셔서 더욱 정확한 수신이 될 수 있도록
강화 하시면 좋으실것 같습니다.
좋은 프로그램 만드시기 바랍니다.
cuperido
//---------------------------------------------------------------------------
#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);
}
//---------------------------------------------------------------------------
김준원 님이 쓰신 글 :
: 오랬동안 알아보고 있지만 아직도 풀리고 있지를 않습니다.
: 혹 간단한 예제 소스를 가지고 계신분은 부탁드립니다.
:
: 컴파일해서 돌아가는것을 확인해 볼 수 있도록 가급적 프로젝트 내용을 압축해서 부탁드립니다.
:
: UDP를 이용하여 특정 IP의 대상과 통신을 할때 (ex.글자,숫자)정보를 전달하는것과 수신하는것의 방법을 간단히 알아볼 수 있게끔 해주시면 감사하겠습니다.