TCPIP SERVER

This commit is contained in:
TAO Cheng
2014-11-11 20:02:14 +08:00
parent 9953f94372
commit b94f3d2cf3
14 changed files with 345 additions and 67 deletions
@@ -33,12 +33,14 @@ const int DRW_RSDataIndexBufSize2=7;
struct_so7_tcpip_buff CSo7_TCPIP_Server::m_TCPIPBuf[lChannelSize];
s_tcpip_state CSo7_TCPIP_Server::m_TCPIPServerState;
//================================================================
CSo7_TCPIP_Server::CSo7_TCPIP_Server()
{
m_hMsgWnd=NULL;
m_ServerStarted=FALSE;
m_Socket=INVALID_SOCKET;
m_SreverIPAddress;
m_iServerPortNumber=static_cast<u_short>(0);
@@ -93,6 +95,10 @@ int CSo7_TCPIP_Server::Init_Winsock()
//================================================================
BOOL CSo7_TCPIP_Server::StartServer(HWND _hWnd,short _nPort)
{
if (m_ServerStarted)
{
return FALSE;
}
int retVal=Init_Winsock();
retVal=Init_Winsock();
if(!retVal)
@@ -102,7 +108,10 @@ BOOL CSo7_TCPIP_Server::StartServer(HWND _hWnd,short _nPort)
m_iServerPortNumber=_nPort;
GetHostIPAddr(m_SreverIPAddress);
m_hMsgWnd=_hWnd;
CreateAndListen();
if (CreateAndListen())
{
m_ServerStarted=TRUE;
}
return TRUE;
}
//================================================================
@@ -112,9 +121,13 @@ BOOL CSo7_TCPIP_Server::StopServer()
{
return TCPIP_INVAILD_SOCKET;
}
closesocket(m_Socket);
m_Socket = INVALID_SOCKET;
return TCPIP_CONNECT_OK;
if (m_ServerStarted)
{
CloseAllSocket();
closesocket(m_Socket);
m_Socket = INVALID_SOCKET;
}
return TRUE;
}
//================================================================
BOOL CSo7_TCPIP_Server::GetHostIPAddr(in_addr& _IPAddress)
@@ -135,7 +148,7 @@ BOOL CSo7_TCPIP_Server::GetHostIPAddr(in_addr& _IPAddress)
first = FALSE;
}
_IPAddress=m_SreverIPAddress;
return TCPIP_CONNECT_OK;
return TRUE;
}
//================================================================
BOOL CSo7_TCPIP_Server::CreateAndListen()
@@ -246,6 +259,7 @@ BOOL CSo7_TCPIP_Server::Response_Handshake()
}
m_ClearSendBuf();
memcpy(m_TCPIPBuf[CH_SEND]._buffer,HandShaking,sizeof(HandShaking));
m_TCPIPBuf[CH_SEND]._size=sizeof(HandShaking);
SendBuffer();
return TRUE;
}
@@ -266,6 +280,7 @@ BOOL CSo7_TCPIP_Server::Response_PLC_State(short _datasize)
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);
SendBuffer();
@@ -286,6 +301,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;
SendBuffer();
return TRUE;
@@ -309,6 +326,8 @@ BOOL CSo7_TCPIP_Server::Response_CCD_DATA(short _Addr,short _datasize)
}
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize]=static_cast<char>(DRW_SDataIndexData+2*_datasize);
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+2*_datasize;
SendBuffer();
return TRUE;
@@ -321,6 +340,7 @@ BOOL CSo7_TCPIP_Server::_Send_Cmd_Write_State()
return FALSE;
}
m_ClearSendBuf();
m_TCPIPBuf[CH_SEND]._size=0;
SendBuffer();
@@ -488,11 +508,14 @@ void CSo7_TCPIP_Server::m_ProcessSocketReadEvent(SOCKET s)
}
m_TCPIPBuf[CH_RECV]._CompletedSize += bytesReceived;
m_TCPIPBuf[CH_RECV]._size = m_TCPIPBuf[CH_RECV]._CompletedSize;
int iPara(0);
if (strstr(m_TCPIPBuf[CH_RECV]._buffer, "FINS"))
{
if (m_TCPIPBuf[CH_RECV]._buffer[7]==0x0C)//handshake
{
Response_Handshake();
iPara=RESPONSE_HANDSHAKE;
}
else if (m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCMD1]==0x01
&&m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCMD2]==0x01)
@@ -501,29 +524,30 @@ void CSo7_TCPIP_Server::m_ProcessSocketReadEvent(SOCKET s)
short iDataSize=(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCh1]<<8)+m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexCh2];
if (iAddr>=20000)
{
;//errcode
iPara=RESPONSE_READ_ERRCODE;
}
else if (iAddr>=10000)
{
Response_CCD_DATA((iAddr-10060),iDataSize);//ccd data
Response_CCD_DATA((iAddr-10060),iDataSize);
iPara=RESPONSE_READ_CCD_DATA;
}
else if (iAddr>=8000)
{
Response_PLC_State(1);//WRITE PLC STATE
{
iPara=RESPONSE_WRITE_PLC_STATE;
}
else if (iAddr>=5000)
{
;//READ PLC STATE
Response_PLC_State(1);
iPara=RESPONSE_READ_PLC_STATE;
}
else
{
;
iPara=RESPONSE_UNKNOWN;
}
}
}
m_TCPIPBuf[CH_RECV]._CompletedSize = 0;
m_TCPIPBuf[CH_RECV]._hProtoPending=FALSE;
::PostMessage(m_hMsgWnd,WM_TCPIP_MSG,FD_READ,0);
::PostMessage(m_hMsgWnd,WM_TCPIP_MSG,FD_READ,iPara);
}