|
답변 감사합니다~~~
패킷의 구조체를 char*형으로 하니까 잘 되더라고요~~ㅎㅎㅎ
맞게 한건진 모르겠는데...
그런데...
처음 보내서 받는부분에서는 UDPRead이벤트를 실행하는데 보낸쪽에서 Receive할때는 UDPRead이벤트가 실행되지 않던데...이걸 실행시킬 방법은 없을까요?
밑부분은 제가 다시 짠 소스입니다...알려주세요!!!
//메시지를 보내라..
void __fastcall TForm1::btnSendClick(TObject *Sender)
{
if(editServerIP->Text == ""){
ShowMessage("접속할 서버 IP주소를 입력하세요.");
return;
}
if(memoSend->Lines->Text == ""){
ShowMessage("보낼 메세지를 입력하세요.");
return;
}
try {
//보낼 패킷을 구성..
UDP udpPacket;
UDP udpRePacket;
char ComputerNameBuff[MAX_COMPUTERNAME_LENGTH+1];
unsigned long ComputerNameLength = MAX_COMPUTERNAME_LENGTH+1;
GetComputerName( ComputerNameBuff, &ComputerNameLength );
StrCopy( udpPacket.Name, ComputerNameBuff );
StrCopy( udpPacket.MSG, memoSend->Text.c_str() );
// 데이터를 보내라..
udpClient->Host = editServerIP->Text;
udpClient->SendBuffer(&udpPacket, sizeof(UDP));
ShowMessage("송신을 성공했습니다");
Application->ProcessMessages();
// 최대 1000ms = 1sec 만큼 응답 데이터를 대기함
udpClient->ReceiveBuffer(&udpRePacket, sizeof(UDP), 1000);
udpReadEvent((char*)udpRePacket.Name, (char*)udpRePacket.MSG, udpClient->Host);
} catch(...) {
ShowMessage("송신을 실패했습니다");
}
}
//패킷을 받았을때 ..
//---------------------------------------------------------------------------
void __fastcall TForm1::udpServerUDPRead(TObject *Sender, TStream *AData,
TIdSocketHandle *ABinding)
{
static char *Name, *MSG;
static UDP udpRePacket; //처음 받았을때..
static UDP ReudpPacket; // 다시 보낼때...
if(AData->Size < 0) return;
AData->Read(&udpRePacket, AData->Size);
Name = udpRePacket.Name;
MSG = udpRePacket.MSG;
// 수신 내용 표기
memoReceive->Lines->Add( Name );
memoReceive->Lines->Add( MSG );
lbClientIP->Caption = ABinding->PeerIP;
lbMyIP->Caption = ABinding->IP;
//보낼 패킷을 구성.. 이건 보낼때 ReceiveBuffer에서 받아보는 부분이다.
char ComputerNameBuff[MAX_COMPUTERNAME_LENGTH+1];
unsigned long ComputerNameLength = MAX_COMPUTERNAME_LENGTH+1;
GetComputerName( ComputerNameBuff, &ComputerNameLength );
StrCopy( ReudpPacket.Name, ComputerNameBuff );
StrCopy( ReudpPacket.MSG, memoSend->Text.c_str() );
// 데이터를 보내라..
ABinding->SendTo(ABinding->PeerIP, ABinding->PeerPort, &ReudpPacket, sizeof(UDP));
Application->ProcessMessages();
}
//------------------------------------------------------------------------------------------
//udpread이벤트를 대신...처음 보낼때 receive받은 응답처리..
void __fastcall TForm1::udpReadEvent(String Name, String MSG, String Addr)
{
memoReceive->Clear();
memoReceive->Lines->Add("컴터이름 : " + Name);
memoReceive->Lines->Add("메세지 : " + MSG);
lbClientIP->Caption = Addr;
}
|