Add RW data.

This commit is contained in:
TAO Cheng
2014-10-30 15:40:07 +08:00
parent 211ca66956
commit 0e4bb3e352
6 changed files with 198 additions and 48 deletions
@@ -7,9 +7,26 @@ const int WSA_MAJOR_VERSION = 1;
const int WSA_MINOR_VERSION = 1;
#define WSA_VERSION MAKEWORD(WSA_MAJOR_VERSION, WSA_MINOR_VERSION)
#define SOCKADDR_LEN sizeof(SOCKADDR_IN)
const char BufferHeader[4]={0x46,0x49,0x4E,0x53};
const char HandShaking[]={0x46,0x49,0x4E,0x53,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
const BYTE CommHeader[]={0x46,0x49,0x4E,0x53};
const BYTE HandShaking[]={0x46,0x49,0x4E,0x53,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
const BYTE DRW_SData[]={0x46,0x49,0x4E,0x53,0x00,0x00,0x00,0x1A,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x80,0x00,0x02,0x00,0x05,0x00,0x00,0x03,0x00,0xFF,0x01,0x01,0x82,0x00,0x0A,0x00,0x00,0x01};
const int DRW_SDataIndexDA1=20;
const int DRW_SDataIndexSA1=23;
const int DRW_SDataIndexCMD1=26;
const int DRW_SDataIndexCMD2=27;
const int DRW_SDataIndexAddr1=29;
const int DRW_SDataIndexAddr2=30;
const int DRW_SDataIndexCh1=32;
const int DRW_SDataIndexCh2=33;
const int DRW_SDataIndexData=34;
const int DRW_SDataCCLen=0x1A;
const int DRW_RSDataIndexBufSize1=6;
const int DRW_RSDataIndexBufSize2=7;
const int DRW_RDataIndexData=30;
const int DRW_RDataCCLen=0x16;
HANDLE CSo7_TCPIP::m_Thread_Id=NULL;
HANDLE CSo7_TCPIP::m_Thread_Mutex=NULL;
@@ -40,12 +57,14 @@ CSo7_TCPIP::CSo7_TCPIP()
m_TCPIPBuf[i]._hProtoPending = false;
m_TCPIPBuf[i]._event = NULL;
};
m_TCPIPData.s_status._handshaking=false;
m_TCPIPData.s_status._HandshakingSucceed=false;
m_TCPIPData.s_status._WriteDataCompleted=false;
m_TCPIPData.s_status._ReadDataCompleted=false;
m_TCPIPData.s_status._SendReturnCode=TCPIP_CONNECT_OK;
m_TCPIPData.s_status._RecvReturnCode=TCPIP_CONNECT_OK;
m_TCPIPData.s_recv_data._type=0;
m_TCPIPData.s_recv_data._DataSize=0;
m_TCPIPData.s_recv_data._dbBuff=(double *)malloc(TCPIP_MAX_DAT_SIZE);
m_TCPIPData.s_recv_data._iData=(int *)malloc(TCPIP_MAX_DAT_SIZE);
}
@@ -58,8 +77,8 @@ CSo7_TCPIP::~CSo7_TCPIP()
free(m_TCPIPBuf[i]._buffer);
m_TCPIPBuf[i]._buffer=NULL;
}
free(m_TCPIPData.s_recv_data._dbBuff);
m_TCPIPData.s_recv_data._dbBuff=NULL;
free(m_TCPIPData.s_recv_data._iData);
m_TCPIPData.s_recv_data._iData=NULL;
}
//================================================================
void CSo7_TCPIP::Create_Thread()
@@ -103,14 +122,8 @@ void CSo7_TCPIP::_do_single_threaded_tcpip_comm(bool _bWaitForRsponse)
Sleep(3);
}
m_TCPIPBuf[CH_SEND]._hProtoPending = TRUE;
if (_bWaitForRsponse)
{
m_TCPIPBuf[CH_RECV]._hProtoPending = TRUE;
}
else
{
m_TCPIPBuf[CH_RECV]._hProtoPending = FALSE;
}
UNREFERENCED_PARAMETER(_bWaitForRsponse);
m_TCPIPBuf[CH_RECV]._hProtoPending = FALSE;
SetEvent(m_TCPIPBuf[CH_SEND]._event);
while ((m_TCPIPBuf[CH_SEND]._hProtoPending == TRUE) || (m_TCPIPBuf[CH_RECV]._hProtoPending == TRUE))
{
@@ -258,27 +271,72 @@ TCPIP_RETURN_CODE CSo7_TCPIP::Handshaking()
}
//================================================================
TCPIP_RETURN_CODE CSo7_TCPIP::Send(int _Addr,int _Data)
TCPIP_RETURN_CODE CSo7_TCPIP::_Send_Cmd_Write_D_Data(const short& _Addr,short* _Data,int _DataSize)
{
_Addr=0;
_Data=0;
if(m_Socket == INVALID_SOCKET)
{
return TCPIP_INVAILD_SOCKET;
}
return TCPIP_CONNECT_OK;
WaitForSingleObject(m_Thread_Mutex, INFINITE);
m_ClearSendBuf();
memcpy(m_TCPIPBuf[CH_SEND]._buffer,DRW_SData,sizeof(DRW_SData));
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDA1]=m_SreverIPAddress.S_un.S_un_b.s_b4;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexSA1]=m_ClientIPAddress.S_un.S_un_b.s_b4;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCMD1]=0x01;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCMD2]=0x02;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexAddr1]=(_Addr>>8) & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexAddr2]=_Addr & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCh1]=(_DataSize>>8) & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCh2]=_DataSize & 0x0ff;
for (int i=0;i<_DataSize;i++)
{
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i]=(_Data[i]>>8) & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i+1]=_Data[i] & 0x0ff;
}
short sTmpData(0);
sTmpData=static_cast<short>(DRW_SDataCCLen+2*_DataSize);
m_TCPIPBuf[CH_SEND]._buffer[DRW_RSDataIndexBufSize1]=(sTmpData>>8) & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_RSDataIndexBufSize2]=sTmpData & 0x0ff;
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+2*_DataSize;
m_TCPIPBuf[CH_SEND]._save_send_cmd=TCPIP_CMD_WRITE_D_DATA;
m_TCPIPData.s_status._WriteDataCompleted=false;
m_Thread_State=TCPIP_THREAD_RUNNING;
_do_single_threaded_tcpip_comm();
ReleaseMutex(m_Thread_Mutex);
return m_TCPIPData.s_status._SendReturnCode;
}
//================================================================
TCPIP_RETURN_CODE CSo7_TCPIP::Recv(int _Addr,int& _Data,bool _bWait)
TCPIP_RETURN_CODE CSo7_TCPIP::_Send_Cmd_Read_D_Data(const short& _Addr,const short& _DataSize)
{
_Addr=0;
_Data=0;
_bWait=false;
if(m_Socket == INVALID_SOCKET)
{
return TCPIP_INVAILD_SOCKET;
}
return TCPIP_CONNECT_OK;
WaitForSingleObject(m_Thread_Mutex, INFINITE);
m_ClearSendBuf();
memcpy(m_TCPIPBuf[CH_SEND]._buffer,DRW_SData,sizeof(DRW_SData));
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDA1]=m_SreverIPAddress.S_un.S_un_b.s_b4;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexSA1]=m_ClientIPAddress.S_un.S_un_b.s_b4;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCMD1]=0x01;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCMD2]=0x01;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexAddr1]=(_Addr>>8) & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexAddr2]=_Addr & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCh1]=(_DataSize>>8) & 0x0ff;
m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexCh2]=_DataSize & 0x0ff;
m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData;
m_TCPIPBuf[CH_SEND]._save_send_cmd=TCPIP_CMD_READ_D_DATA;
m_TCPIPData.s_status._ReadDataCompleted=false;
m_Thread_State=TCPIP_THREAD_RUNNING;
_do_single_threaded_tcpip_comm();
ReleaseMutex(m_Thread_Mutex);
return m_TCPIPData.s_status._SendReturnCode;
}
//================================================================
LRESULT CSo7_TCPIP::OnSocket(WPARAM wParam, LPARAM lParam)
@@ -295,7 +353,7 @@ LRESULT CSo7_TCPIP::OnSocket(WPARAM wParam, LPARAM lParam)
{
case FD_CONNECT:
{
}
break;
case FD_READ:
@@ -426,15 +484,40 @@ void CSo7_TCPIP::m_ProcessSocketReadEvent(SOCKET s)
switch (m_TCPIPBuf[CH_SEND]._save_send_cmd)
{
case TCPIP_CMD_HANDSHAKING:
if (m_TCPIPBuf[CH_RECV]._CompletedSize==24)
{
m_TCPIPData.s_status._handshaking=true;
}
else
{
m_TCPIPData.s_status._handshaking=false;
if (m_TCPIPBuf[CH_RECV]._CompletedSize==24)
{
m_TCPIPData.s_status._HandshakingSucceed=true;
}
else
{
m_TCPIPData.s_status._HandshakingSucceed=false;
}
break;
}
case TCPIP_CMD_READ_D_DATA:
{
int _BufferSize(0);
BYTE _bData[2]={0,0};
_BufferSize=static_cast<int>(static_cast<BYTE>(m_TCPIPBuf[CH_RECV]._buffer[DRW_RSDataIndexBufSize2]));
_BufferSize-=DRW_RDataCCLen;
m_TCPIPData.s_recv_data._DataSize=0;
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]);
m_TCPIPData.s_recv_data._iData[m_TCPIPData.s_recv_data._DataSize]=static_cast<int>(_bData[0]*256+_bData[1]);
m_TCPIPData.s_recv_data._DataSize++;
}
m_TCPIPData.s_status._ReadDataCompleted=true;
break;
}
case TCPIP_CMD_WRITE_D_DATA:
{
m_TCPIPData.s_status._WriteDataCompleted=true;
break;
}
break;
default:break;
}
m_TCPIPBuf[CH_RECV]._CompletedSize = 0;
@@ -31,8 +31,8 @@ enum TCPIP_CMD
{
TCPIP_CMD_NONE=0,
TCPIP_CMD_HANDSHAKING,
TCPIP_CMD_READ_DATA,
TCPIP_CMD_WRITE_DATA,
TCPIP_CMD_READ_D_DATA,
TCPIP_CMD_WRITE_D_DATA,
TCPIP_CMD_TATAL
};
@@ -67,13 +67,15 @@ struct struct_so7_tcpip_data
{
int _type;
int _DataSize;
double *_dbBuff;
int* _iData;
} s_recv_data;
struct s_status
{
TCPIP_RETURN_CODE _SendReturnCode;
TCPIP_RETURN_CODE _RecvReturnCode;
bool _handshaking;
bool _HandshakingSucceed;
bool _WriteDataCompleted;
bool _ReadDataCompleted;
} s_status;
};
#pragma pack(pop)
@@ -93,11 +95,12 @@ public:
static int m_Thread_State;
TCPIP_RETURN_CODE Connect(const HWND& _hWnd,const in_addr& _IPAddress,const u_short& _nPortNumber);
TCPIP_RETURN_CODE Send(int _Addr,int _Data);
TCPIP_RETURN_CODE Recv(int _Addr,int& _Data,bool _bWait);
TCPIP_RETURN_CODE DisConnect();
TCPIP_RETURN_CODE GetHostIPAddr(in_addr& _IPAddress);
TCPIP_RETURN_CODE Handshaking();
TCPIP_RETURN_CODE _Send_Cmd_Write_D_Data(const short& _Addr,short* _Data,int _DataSize);
TCPIP_RETURN_CODE _Send_Cmd_Read_D_Data(const short& _StartAddr,const short& _DataSize);
LRESULT OnSocket(WPARAM wParam, LPARAM lParam);
private: