Add RW data.
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user