TCPIP SERVER
This commit is contained in:
@@ -10,9 +10,10 @@ const int WSA_MINOR_VERSION = 1;
|
||||
|
||||
const BYTE CommHeader[]={0x46,0x49,0x4E,0x53};
|
||||
const BYTE HandShaking[]={0X46,0X49,0X4E,0X53,0X00,0X00,0X00,0X10,0X00,0X00,0X00,0X01,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X03,0X00,0X00,0X00,0X05};
|
||||
const BYTE DRW_SData[]={0X46,0X49,0X4E,0X53,0X00,0X00,0X00,0X18,0X00,0X00,0X00,0X02,0X00,0X00,0X00,0X00,0XC0,0X00,0X02,0X00,0X03,0X00,0X00,0X05,0X00,0XFF,0X01,0X01,0X00,0X00};
|
||||
const BYTE DRW_SData[]={0X46,0X49,0X4E,0X53,0X00,0X00,0X00,0X16,0X00,0X00,0X00,0X02,0X00,0X00,0X00,0X00,0XC0,0X00,0X02,0X00,0X03,0X00,0X00,0X05,0X00,0XFF,0X01,0X01,0X00,0X00};
|
||||
|
||||
const int DRW_SDataIndexDataSize=7;
|
||||
const int DRW_SDataHeadDataSize=8;
|
||||
const int DRW_SDataIndexData=30;
|
||||
|
||||
const int DRW_RDataIndexDA1=20;
|
||||
@@ -42,7 +43,10 @@ CSo7_TCPIP_Server::CSo7_TCPIP_Server()
|
||||
m_hMsgWnd=NULL;
|
||||
m_ServerStarted=FALSE;
|
||||
m_Socket=INVALID_SOCKET;
|
||||
m_SreverIPAddress;
|
||||
m_SreverIPAddress.S_un.S_un_b.s_b1=127;
|
||||
m_SreverIPAddress.S_un.S_un_b.s_b2=0;
|
||||
m_SreverIPAddress.S_un.S_un_b.s_b3=0;
|
||||
m_SreverIPAddress.S_un.S_un_b.s_b4=1;
|
||||
m_iServerPortNumber=static_cast<u_short>(0);
|
||||
for (int i=0;i<MAX_SOCKET;i++)
|
||||
{
|
||||
@@ -60,7 +64,7 @@ CSo7_TCPIP_Server::CSo7_TCPIP_Server()
|
||||
};
|
||||
for(int i=0;i<MAX_CCD_ADDR;i++)
|
||||
{
|
||||
m_CCDData[i]=0;
|
||||
m_CCDData_D10000[i]=0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -119,13 +123,33 @@ BOOL CSo7_TCPIP_Server::StopServer()
|
||||
{
|
||||
if(m_Socket == INVALID_SOCKET)
|
||||
{
|
||||
return TCPIP_INVAILD_SOCKET;
|
||||
return FALSE;
|
||||
}
|
||||
if (m_ServerStarted)
|
||||
{
|
||||
CloseAllSocket();
|
||||
closesocket(m_Socket);
|
||||
m_Socket = INVALID_SOCKET;
|
||||
m_ServerStarted=FALSE;
|
||||
|
||||
m_hMsgWnd=NULL;
|
||||
m_ServerStarted=FALSE;
|
||||
m_Socket=INVALID_SOCKET;
|
||||
m_SreverIPAddress.S_un.S_un_b.s_b1=127;
|
||||
m_SreverIPAddress.S_un.S_un_b.s_b2=0;
|
||||
m_SreverIPAddress.S_un.S_un_b.s_b3=0;
|
||||
m_SreverIPAddress.S_un.S_un_b.s_b4=1;
|
||||
m_iServerPortNumber=static_cast<u_short>(0);
|
||||
for (int i=0;i<MAX_SOCKET;i++)
|
||||
{
|
||||
m_ClientSocket[i]=INVALID_SOCKET;
|
||||
}
|
||||
m_nClients=0;
|
||||
for(int i=0;i<MAX_CCD_ADDR;i++)
|
||||
{
|
||||
m_CCDData_D10000[i]=0;
|
||||
}
|
||||
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
@@ -137,7 +161,7 @@ BOOL CSo7_TCPIP_Server::GetHostIPAddr(in_addr& _IPAddress)
|
||||
{
|
||||
if(m_Socket == INVALID_SOCKET)
|
||||
{
|
||||
return TCPIP_INVAILD_SOCKET;
|
||||
return FALSE;
|
||||
}
|
||||
char HostName[100];
|
||||
gethostname(HostName,sizeof(HostName));
|
||||
@@ -245,10 +269,25 @@ void CSo7_TCPIP_Server::CloseAllSocket()
|
||||
for(int i=0; i<m_nClients; i++)
|
||||
{
|
||||
::closesocket(m_ClientSocket[i]);
|
||||
m_ClientSocket[i]= INVALID_SOCKET;
|
||||
}
|
||||
m_nClients = 0;
|
||||
}
|
||||
|
||||
//================================================================
|
||||
BOOL CSo7_TCPIP_Server::RESPONSE_UNKNOWN_State()
|
||||
{
|
||||
if(m_ClientSocket[m_nActiveClient] == INVALID_SOCKET)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
m_ClearSendBuf();
|
||||
memcpy(m_TCPIPBuf[CH_SEND]._buffer,DRW_SData,sizeof(DRW_SData));
|
||||
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData;
|
||||
|
||||
SendBuffer();
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//================================================================
|
||||
BOOL CSo7_TCPIP_Server::Response_Handshake()
|
||||
@@ -279,8 +318,8 @@ BOOL CSo7_TCPIP_Server::Response_PLC_State(short _datasize)
|
||||
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i]=(iData>>8) & 0x0ff;
|
||||
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i+1]=iData & 0x0ff;
|
||||
}
|
||||
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast<char>(DRW_SDataIndexData+2*_datasize);
|
||||
m_TCPIPBuf[CH_SEND]._size=sizeof(HandShaking);
|
||||
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast<char>(DRW_SDataIndexData-DRW_SDataHeadDataSize+_datasize);
|
||||
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+_datasize*2;
|
||||
|
||||
SendBuffer();
|
||||
|
||||
@@ -300,8 +339,8 @@ BOOL CSo7_TCPIP_Server::Response_Sensor_State(short _datasize)
|
||||
{
|
||||
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+i]=m_TCPIPServerState._PLCSensorState[i];
|
||||
}
|
||||
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast<char>(DRW_SDataIndexData+2*_datasize);
|
||||
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+2*_datasize;
|
||||
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast<char>(DRW_SDataIndexData-DRW_SDataHeadDataSize+_datasize);
|
||||
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+_datasize*2;
|
||||
|
||||
SendBuffer();
|
||||
return TRUE;
|
||||
@@ -318,15 +357,20 @@ BOOL CSo7_TCPIP_Server::Response_CCD_DATA(short _Addr,short _datasize)
|
||||
memcpy(m_TCPIPBuf[CH_SEND]._buffer,DRW_SData,sizeof(DRW_SData));
|
||||
|
||||
int iData(0);
|
||||
for (int i=_Addr;i<_Addr+_datasize;i++)
|
||||
BYTE DM_Data[4]={0,0,0,0};
|
||||
for (int i=0;i<_datasize;i++)
|
||||
{
|
||||
iData=m_CCDData[i];
|
||||
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i]=(iData>>8) & 0x0ff;
|
||||
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i+1]=iData & 0x0ff;
|
||||
iData=m_CCDData_D10000[_Addr+i/2];
|
||||
DM_Data[2]=(iData>>24) & 0x0ff;
|
||||
DM_Data[3]=(iData>>16) & 0x0ff;
|
||||
DM_Data[0]=(iData>>8) & 0x0ff;
|
||||
DM_Data[1]=iData & 0x0ff;
|
||||
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i]=DM_Data[2*(i%2)+0];
|
||||
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i+1]=DM_Data[2*(i%2)+1];
|
||||
}
|
||||
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast<char>(DRW_SDataIndexData+2*_datasize);
|
||||
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast<char>(DRW_SDataIndexData-DRW_SDataHeadDataSize+_datasize);
|
||||
|
||||
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+2*_datasize;
|
||||
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+_datasize*2;
|
||||
|
||||
SendBuffer();
|
||||
|
||||
@@ -520,8 +564,16 @@ void CSo7_TCPIP_Server::m_ProcessSocketReadEvent(SOCKET s)
|
||||
else if (m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCMD1]==0x01
|
||||
&&m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCMD2]==0x01)
|
||||
{
|
||||
short iAddr=(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexAddr1]<<8)+m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexAddr2];
|
||||
short iDataSize=(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCh1]<<8)+m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCh2];
|
||||
short iAddr(0);
|
||||
short iDataSize(0);
|
||||
BYTE bData[2]={0,0};
|
||||
bData[0]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexAddr1];
|
||||
bData[1]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexAddr2];
|
||||
iAddr=(bData[0]<<8)+bData[1];
|
||||
bData[0]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexAddr1];
|
||||
bData[1]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexAddr2];
|
||||
iDataSize=(bData[0]<<8)+bData[1];
|
||||
|
||||
if (iAddr>=20000)
|
||||
{
|
||||
iPara=RESPONSE_READ_ERRCODE;
|
||||
@@ -531,10 +583,6 @@ void CSo7_TCPIP_Server::m_ProcessSocketReadEvent(SOCKET s)
|
||||
Response_CCD_DATA((iAddr-10060),iDataSize);
|
||||
iPara=RESPONSE_READ_CCD_DATA;
|
||||
}
|
||||
else if (iAddr>=8000)
|
||||
{
|
||||
iPara=RESPONSE_WRITE_PLC_STATE;
|
||||
}
|
||||
else if (iAddr>=5000)
|
||||
{
|
||||
Response_PLC_State(1);
|
||||
@@ -542,12 +590,41 @@ void CSo7_TCPIP_Server::m_ProcessSocketReadEvent(SOCKET s)
|
||||
}
|
||||
else
|
||||
{
|
||||
RESPONSE_UNKNOWN_State();
|
||||
iPara=RESPONSE_UNKNOWN;
|
||||
}
|
||||
}
|
||||
else if (m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCMD1]==0x01
|
||||
&&m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCMD2]==0x02)
|
||||
{
|
||||
short iAddr(0);
|
||||
short iDataSize(0);
|
||||
BYTE bData[2]={0,0};
|
||||
bData[0]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexAddr1];
|
||||
bData[1]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexAddr2];
|
||||
iAddr=(bData[0]<<8)+bData[1];
|
||||
bData[0]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexAddr1];
|
||||
bData[1]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexAddr2];
|
||||
iDataSize=(bData[0]<<8)+bData[1];
|
||||
if (iAddr>=8000)
|
||||
{
|
||||
RESPONSE_UNKNOWN_State();
|
||||
iPara=RESPONSE_WRITE_PLC_STATE;
|
||||
}
|
||||
else
|
||||
{
|
||||
RESPONSE_UNKNOWN_State();
|
||||
iPara=RESPONSE_UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
m_TCPIPBuf[CH_RECV]._CompletedSize = 0;
|
||||
m_TCPIPBuf[CH_RECV]._hProtoPending=FALSE;
|
||||
::PostMessage(m_hMsgWnd,WM_TCPIP_MSG,FD_READ,iPara);
|
||||
|
||||
if (iPara!=RESPONSE_READ_PLC_STATE)
|
||||
{
|
||||
::PostMessage(m_hMsgWnd,WM_TCPIP_MSG,FD_READ,iPara);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user