|
ADO를 연결해서 DB에서 몇개의 int값을 불러서 ... 소켓으로UDP통신으로 BroadCasting하는 소스인데요...구조체로
Send했는데 문제가 있는지...고수님들이 좀 봐주셧음 해서요...BufferSend가 아닌 구조체 ...라서 ..지식도 짧구해서염..
시간내서 좀 봐주셧음 감사하겠습니다...틀린데두 팍팍 찍어주시구염...
typedef struct _UDPDATA
{
BYTE MACHINE_ID; //소켓으로 날릴 데이터 define
BYTE RUNSTATE;
int PRODCOUNT;
BYTE MACHINESTATE;
BYTE ONLINESTATE;
BYTE CYCLETIME;
}UDPDATA;
void __fastcall TForm3::Timer2Timer(TObject *Sender) //일정시간마다 UDP패킷을 구조체로 보내려고...0.2초
{
int Count;
ADOQuery1->Active=true;
ADOQuery1->First();
Count = ADOQuery1->RowsAffected;
struct _UDPDATA *UDPDATA1= new struct _UDPDATA[Count];
struct TMachineData *MachineData = new struct TMachineData[Count];
if (Count !=0)
{
for(int i=0; i<Count ; i++)
{
MachineData[i].Machine_No = ADOQuery1->FieldByName("Machine_No")->AsInteger; //Byte change
MachineData[i].Run_State = ADOQuery1->FieldByName("RunState")->AsInteger; //Byte change
MachineData[i].Curr_Count =ADOQuery1->FieldByName("CurrProdCount")->AsInteger;
MachineData[i].Machine_State = ADOQuery1->FieldByName("MachineState")->AsInteger;//Byte change
MachineData[i].CycleTime =ADOQuery1->FieldByName("CycleTime")->AsInteger; //Byte change
MachineData[i].OnLineState =ADOQuery1->FieldByName("OnlineState")->AsInteger; //Byte change
}
for(int i=0; i<Count; i++)
{
UDPDATA1[i].MACHINE_ID = ByteChange(MachineData[i].Machine_No); //Byte
UDPDATA1[i].RUNSTATE = ByteChange(MachineData[i].Run_State); //Byte
UDPDATA1[i].PRODCOUNT = MachineData[i].Curr_Count; //Int
UDPDATA1[i].MACHINESTATE = ByteChange(MachineData[i].Machine_State); //Byte
UDPDATA1[i].CYCLETIME = ByteChange(MachineData[i].CycleTime); //Byte
UDPDATA1[i].RUNSTATE = ByteChange(MachineData[i].Run_State); //Byte
}
}
char *m_SendBuffer = (char*)UDPDATA1;
int err_check;
int send_sock; // Send소켓 에러 확인용
int retval=0; // Send Byte Buf (int)
int sockfd; // Send Socket
int SockOpt_ErorrCheck;
unsigned long conv; // USER IP 에러확인
char *addr1; // Send Address 주소
struct sockaddr_in seraddr; // Send Address의 구조체
DWORD sockver = MAKEWORD(2, 2);
WSADATA sockdata;
err_check = WSAStartup(sockver, &sockdata); // Load Win Sock 2.2 Dll
if (err_check)
{
WSACleanup();
return ;
}
sockfd=socket(AF_INET, SOCK_DGRAM, 0); //UDP WinSock 소켓 생성
if(sockfd == INVALID_SOCKET) // if Socket에러라면..
{
ShowMessage("The application create Fail. Try again");
return ;
}
memset(&seraddr , 0 , sizeof(seraddr)); //구조체 초기화..
seraddr.sin_family=AF_INET; // Protocol Type
seraddr.sin_port=htons(9099); // Host to network - Send Port
if(CheckBox1->Checked)
{
addr1="192.168.0.255"; // Default IP
seraddr.sin_addr.S_un.S_addr=inet_addr(addr1); // INADDR_BROADCAST = 0xffffffff
}
if(!CheckBox1->Checked)
{
if(conv== INADDR_NONE || Edit1->Text=="") // USER IP
{
ShowMessage("허용되지 않거나 알수 없는 IP주소 입니다.다시 입력하여 주십시오");
closesocket(sockfd);
return;
}
seraddr.sin_addr.S_un.S_addr=inet_addr(Edit1->Text.c_str());
}
BOOL opt = TRUE; // Socket Option
SockOpt_ErorrCheck = setsockopt (sockfd, SOL_SOCKET, SO_BROADCAST,(char FAR *)&opt,sizeof(BOOL));
if(SockOpt_ErorrCheck)
ShowMessage("Setsockopt () Error");
// Sending.........Buf
retval=sendto(sockfd, (const char*)m_SendBuffer, sizeof(m_SendBuffer) ,0,(struct sockaddr *)&seraddr, sizeof(seraddr)); // Broadcasting....SendBufData
if(retval ==SOCKET_ERROR)
{
ShowMessage("SendBuffer Error");
return;
}
closesocket(sockfd);
delete [] MachineData;
delete [] UDPDATA1;
}
이렇게 하면..UDPDATA안에 있는 구조체 데이터가 잘날라갈지 궁금해서염...문제가 잇을꼬 같아서염...
|