|
장비 자체가 UDP 통신만 지원해서 UDP 짜고 있는데요. 잘안되서 도움 요청합니다.
빌더 6.0으로 하고 있습니다.
아래는 UDP OPEN 하기 위해 저의한 내용입니다.
void __fastcall TForm1::UdpConnect()
{
BYTE buffer[4096];
UdpSocket1->RemoteHost = TCP_IP->UnitIP->Text; //192.168.60.3
UdpSocket1->RemotePort = StrToInt(TCP_IP->Sel_port->Text); //9008
UdpSocket1->LocalHost = "192.168.60.1";
UdpSocket1->LocalPort = StrToInt(TCP_IP->sever_port->Text); //5634
UdpSocket1->Open();
}
보내는것은 잘됩니다.
UdpSocket1->SendBuf(pData, nSize, 0);
받는 부분에서 UDP 5634 포트가 생성이 되야 되는데 생성이 안됩니다.
도스창에서 포트 확인하면 정상적인 포트생성은
UDP 0.0.0.0:5634 *.*
이게 생성이 되야되는데 생성을 하질 않네요. 그래서 UdpSocket1Receive 이벤트가 걸리지 않네요.
void __fastcall TForm1::UdpSocket1Receive(TObject *Sender, PChar Buf,
int &DataLen)
{
int size = 0;
unsigned char szBuf[1024];
int nRecvCount = 0;
int sucess = 0;
FILE *fp;
SYSTEMTIME ttt;
memset(szBuf, 0, sizeof(szBuf));
size = UdpSocket1->ReceiveBuf(szBuf, DataLen, size);
fn_MessageView(szBuf, 1, size, "RX");
Memo1->Lines->Add((char *)szBuf);
if( CheckBox1->Checked == true)
{
GetLocalTime(&ttt);
sprintf(time_save,"%04d%02d%02d%02d.txt", ttt.wYear, ttt.wMonth, ttt.wDay, ttt.wHour);
fp = fopen(time_save, "ab+");
fprintf(fp, "%02d:%02d:%02d.%03d RX ", ttt.wHour, ttt.wMinute, ttt.wSecond, ttt.wMilliseconds);
for(int i=0;i<size;i++)
fprintf(fp, "%02X ", szBuf[i]);
fprintf(fp, "\n");
fclose(fp);
}
}
구글링 및 참고 자료를 아무리 찾아봐도 저와 같은 사례가 많이 있었는데 해답은 없네요.
다른 방법으로 리시브 하는 부분만 TNMUDP로 구현을 해 봤습니다.
포트 생성하고 리시브 이벤트에 잘들어오는데
void __fastcall TForm1::NMUDP1DataReceived(TComponent *Sender,
int NumberBytes, AnsiString FromIP, int Port)
{
int size = 0;
char szBuf[1024];
int nRecvCount = 0;
memset(szBuf, 0, sizeof(szBuf));
NMUDP1->ReadBuffer(szBuf, 1024, nRecvCount);
}
ReadBuffer에서 아래와 같이 에러창이 뜹니다.
access violation at 0x00000000: read of address 0x00000000'. Process Stopped. Use Step or Run To continue
뭘 잘못 한것지 모르겠습니다.
혹시 아시는 고수님들 답변 부탁드립니다.
|