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
@@ -499,16 +499,21 @@ void CSo7_TCPIP::m_ProcessSocketReadEvent(SOCKET s)
{
int _BufferSize(0);
BYTE _bData[4]={0,0,0,0};
_bData[0]=static_cast<BYTE>(m_TCPIPBuf[CH_RECV]._buffer[DRW_RSDataIndexBufSize1]);
_bData[1]=static_cast<BYTE>(m_TCPIPBuf[CH_RECV]._buffer[DRW_RSDataIndexBufSize2]);
_BufferSize=static_cast<int>(static_cast<BYTE>(m_TCPIPBuf[CH_RECV]._buffer[DRW_RSDataIndexBufSize2]));
_BufferSize=static_cast<int>((_bData[0]<<8)+_bData[1]);
_BufferSize-=DRW_RDataCCLen;
m_TCPIPData.s_recv_data._DataSize=0;
for (int i=0;i<_BufferSize;i+=4)
for (int i=0;i<_BufferSize;i+=2)
{
_bData[0]=static_cast<BYTE>(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i]);
_bData[1]=static_cast<BYTE>(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i+1]);
_bData[2]=static_cast<BYTE>(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i+2]);
_bData[3]=static_cast<BYTE>(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i+3]);
//_bData[2]=static_cast<BYTE>(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i+2]);
//_bData[3]=static_cast<BYTE>(m_TCPIPBuf[CH_RECV]._buffer[DRW_RDataIndexData+i+3]);
_bData[2]=0;
_bData[3]=0;
m_TCPIPData.s_recv_data._lData[m_TCPIPData.s_recv_data._DataSize]=static_cast<int>(+(_bData[2]<<24)+(_bData[3]<<16)+(_bData[0]<<8)+(_bData[1]));
m_TCPIPData.s_recv_data._DataSize++;
}
@@ -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);
}
@@ -40,6 +40,19 @@ enum OMRON_PLC_SENSOR
OMRON_PLC_LASER5_HEADB,
OMRON_PLC_SENSOR_TOTAL=PLC_MAX_SENSOR_STATE
};
enum TCPIP_RESPONSE_RESULT
{
RESPONSE_UNKNOWN=0,
RESPONSE_HANDSHAKE,
RESPONSE_READ_PLC_STATE,
RESPONSE_WRITE_PLC_STATE,
RESPONSE_READ_SENSOR_STATE,
RESPONSE_READ_CCD_DATA,
RESPONSE_READ_ERRCODE,
RESPONSE_RESULT
};
struct s_tcpip_state
{
TCPIP_RETURN_CODE _SendReturnCode;
@@ -79,7 +92,7 @@ public:
virtual ~CSo7_TCPIP_Server();
static struct_so7_tcpip_buff m_TCPIPBuf[lChannelSize];
s_tcpip_state m_TCPIPServerState;
static s_tcpip_state m_TCPIPServerState;
int m_CCDData[MAX_CCD_ADDR];
BOOL StartServer(HWND _hWnd,short _nPort);
@@ -94,7 +107,7 @@ public:
LRESULT OnSocket(WPARAM wParam, LPARAM lParam);
private:
HWND m_hMsgWnd;
BOOL m_ServerStarted;
SOCKET m_Socket;
SOCKET m_ClientSocket[MAX_SOCKET];
int m_nClients;