TCPIP SERVER

This commit is contained in:
TAO Cheng
2014-11-12 08:58:34 +08:00
parent b94f3d2cf3
commit cba2694c0c
7 changed files with 123 additions and 31 deletions
@@ -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);
}
}