📄 netdatarecvthread.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <Winsock2.h>
#include "ScanSys.h"
#include "CommandID.h"
#include "TypeDefine.h"
#pragma hdrstop
#include <Winsock2.h>
#include "NetDataRecvThread.h"
#include "DispControl.h"
#include "BackLightSet.h"
#include "SerialSet.h"
#include "NetSet.h"
#include "SignalControl.h"
#include "TimeSet.h"
#pragma package(smart_init)
#pragma pack(1)
//---------------------------------------------------------------------------
ClientIDInfo CliIDInfo[512];
void RecvDataProcess(char *NetRecvData, struct sockaddr_in Recv_IP_Addr);
bool ClientRegister(struct sockaddr_in Regi_IP_Addr);
bool ClientHaveRegistered(struct sockaddr_in Regi_IP_Addr);
//---------------------------------------------------------------------------
__fastcall TNetDataRecv::TNetDataRecv(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TNetDataRecv::Execute()
{
SOCKET ServerRecvSocket;
WSADATA wsaData;
int iErrorCode;
int serverfd;
struct sockaddr_in Server_IP_Addr;
struct sockaddr_in Client_IP_Addr;
int recv_data_len = 0;
int recv_len = sizeof(Client_IP_Addr);
char recv_data[256];
if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL
{
ShowMessage(AnsiString("网络初始化失败!\n"));
WSACleanup();
return;
}
else
{
}
Server_IP_Addr.sin_family = AF_INET;
/*所有网络信息都通过此端口接收*/
Server_IP_Addr.sin_port=htons(SERVER_DATA_RECV_PORT); //监听总端口
//Server_IP_Addr.sin_addr.s_addr=inet_addr("192.168.0.2"); ///本机
Server_IP_Addr.sin_addr.s_addr = htonl(INADDR_ANY);
ServerRecvSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (bind(ServerRecvSocket, (struct sockaddr*)&Server_IP_Addr, sizeof(Server_IP_Addr)) < 0)
{
ShowMessage(AnsiString("接收网络初始化失败!\n"));
WSACleanup();
closesocket(ServerRecvSocket);
return;
}
else
{
}
while (1)
{
for (int i = 0; i < 256; i++)
{
recv_data[i] = '\0';
}
// Form2->Label1->Caption= Client_IP_Addr.sin_addr.s_addr;
recv_data_len = recvfrom(ServerRecvSocket,recv_data,256,0,(struct sockaddr*)&Client_IP_Addr,&recv_len);
if (recv_data_len < 0)
{
// Form2->Label1->Caption= recv_data_len;
}
else
{
// Form2->Label2->Caption= recv_data_len;
RecvDataProcess(recv_data, Client_IP_Addr);
}
}
}
void RecvDataProcess(char *NetRecvData, struct sockaddr_in Recv_IP_Addr)
{
ComRequestHeader *head;
head = (ComRequestHeader *)NetRecvData;
if (head)
{
switch (head->reqType)
{
case BEAT_CMMD_ID:
for (int i = 0; i < ClientNum; i++)
{
if (CliIDInfo[ClientNum].ClientIP == Recv_IP_Addr.sin_addr.s_addr)
{
CliIDInfo[ClientNum].OnLineTime = 0;
}
}
break;
case REGISTER_REQ_CMMD_ID:
if (!ClientHaveRegistered(Recv_IP_Addr))
{
if (ClientRegister(Recv_IP_Addr))
{
CliIDInfo[ClientNum].ClientIP = Recv_IP_Addr.sin_addr.s_addr;
CliIDInfo[ClientNum].CliID = ClientID;
CliIDInfo[ClientNum].OnLineTime = 0;
ClientNum++;
ClientList->Add(ClientID);
Form2->IDListBox->Items->AddStrings(ClientList);
}
else
{
ShowMessage(AnsiString("客户端注册失败!\n"));
}
}
else
{
}
break;
case SERVER_CLOSE_CMMD_ID:
break;
case GET_COM_ATTR_CMMD_ID:
break;
case GET_NET_ATTR_CMMD_ID:
break;
case GET_IO_CMMD_ID:
break;
default:
break;
}
}
}
//---------------------------------------------------------------------------
bool ClientRegister(struct sockaddr_in Regi_IP_Addr)
{
SOCKET ServerSocket;
WSADATA wsaData;
int iErrorCode;
__u8 type = REGISTER_REQ_CMMD_ID;
struct sockaddr_in Server_IP_Addr;
ComRespHeader RegisterResp;
if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL
{
ShowMessage(AnsiString("注册网络初始化失败!\n"));
WSACleanup();
return false;
}
else
{
}
ClientID++;
Server_IP_Addr.sin_family = AF_INET;
Server_IP_Addr.sin_port=htons(SERVER_BEAT_SEND_PORT); //监听总端口
// Server_IP_Addr.sin_addr.s_addr=inet_addr("192.168.0.2"); ///本机
Server_IP_Addr.sin_addr.s_addr = htonl(INADDR_ANY);
ServerSocket = socket(AF_INET, SOCK_DGRAM, 0);
//bind(ServerSocket, (struct sockaddr*)&Server_IP_Addr, sizeof(Server_IP_Addr));
sendto(ServerSocket, (char *)&type, sizeof(__u8), 0,(struct sockaddr *)&Regi_IP_Addr,sizeof(struct sockaddr));
sendto(ServerSocket, (char *)&ClientID, sizeof(__u32), 0,(struct sockaddr *)&Regi_IP_Addr,sizeof(struct sockaddr));
closesocket(ServerSocket);
return true;
}
bool ClientHaveRegistered(struct sockaddr_in Regi_IP_Addr)
{
for (int i = 0; i < ClientNum; i++)
{
if (Regi_IP_Addr.sin_addr.S_un.S_addr == CliIDInfo[i].ClientIP)
{
SOCKET ServerSocket;
WSADATA wsaData;
int iErrorCode;
__u8 type = REGISTER_REQ_CMMD_ID;
struct sockaddr_in Server_IP_Addr;
if (WSAStartup(MAKEWORD(2,1),&wsaData)) //调用Windows Sockets DLL
{
ShowMessage(AnsiString("注册网络初始化失败!\n"));
WSACleanup();
return false;
}
else
{
}
Server_IP_Addr.sin_family = AF_INET;
Server_IP_Addr.sin_port=htons(SERVER_BEAT_SEND_PORT); //监听总端口
//Server_IP_Addr.sin_addr.s_addr=inet_addr("192.168.0.2"); ///本机
Server_IP_Addr.sin_addr.s_addr = htonl(INADDR_ANY);
ServerSocket = socket(AF_INET, SOCK_DGRAM, 0);
// bind(ServerSocket, (struct sockaddr*)&Server_IP_Addr, sizeof(Server_IP_Addr));
sendto(ServerSocket, (char *)&type, sizeof(__u8), 0,(struct sockaddr *)&Regi_IP_Addr,sizeof(struct sockaddr));
sendto(ServerSocket, (char *)&CliIDInfo[i].CliID, sizeof(__u32), 0,(struct sockaddr *)&Regi_IP_Addr,sizeof(struct sockaddr));
closesocket(ServerSocket);
return true;
}
}
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -