|
자답입니다.
혹시나 고생하시는 분 위해 올립니다.
보내는 부분은 그냥 TUDP로 구현했구요
받는부분은 IdUDPServer로 구현했습니다.
하지만 받은데이타의 개수는 알수가 없습니다.
AData->Size개 항상 2048로 고정입니다.
782*3BYTE 10ms로 테스트 해봤는데 잘됩니다.
void __fastcall TForm1::UdpConnect()
{
BYTE buffer[4096];
UdpSocket1->RemoteHost = TCP_IP->UnitIP->Text;
UdpSocket1->RemotePort = StrToInt(TCP_IP->Sel_port->Text);
UdpSocket1->LocalHost = "192.168.60.1";
UdpSocket1->LocalPort = StrToInt(TCP_IP->sever_port->Text);
UdpSocket1->Open();
IdUDPServer1->BroadcastEnabled=true;
IdUDPServer1->DefaultPort = StrToInt(TCP_IP->sever_port->Text);
IdUDPServer1->Active = True;
}
void __fastcall TForm1::IdUDPServer1UDPRead(TObject *Sender,
TStream *AData, TIdSocketHandle *ABinding)
{
int size = 782;
int len = 0;
char szBuf[4096];
memset(szBuf, NULL, sizeof(szBuf));
memset(szBuf1, NULL, sizeof(szBuf1));
AData->Read(szBuf, 1024);//AData->Size); 데이타가 몇개가 넘어오는지 알수 없음
}
: 장비 자체가 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
: 뭘 잘못 한것지 모르겠습니다.
:
: 혹시 아시는 고수님들 답변 부탁드립니다.
:
:
|