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);
}
}
@@ -93,7 +93,7 @@ public:
static struct_so7_tcpip_buff m_TCPIPBuf[lChannelSize];
static s_tcpip_state m_TCPIPServerState;
int m_CCDData[MAX_CCD_ADDR];
int m_CCDData_D10000[MAX_CCD_ADDR];
BOOL StartServer(HWND _hWnd,short _nPort);
BOOL StopServer();
@@ -103,6 +103,7 @@ public:
BOOL Response_Sensor_State(short _datasize);
BOOL Response_CCD_DATA(short _Addr,short _datasize);
BOOL RESPONSE_UNKNOWN_State();
LRESULT OnSocket(WPARAM wParam, LPARAM lParam);
private:
@@ -16,7 +16,7 @@
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources
// Chinese (Simplified, PRC) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
@@ -1072,8 +1072,8 @@ FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
PUSHBUTTON "Exit",IDCANCEL,512,305,39,14
GROUPBOX "TCP/IP Server Control",IDC_STATIC,17,12,87,81
PUSHBUTTON "Start",IDC_BUTTON_PLC_TCPIP_SERVER_START,28,32,63,18
PUSHBUTTON "Stop",IDC_BUTTON_PLC_TCPIP_SERVER_STOP,28,65,63,18
PUSHBUTTON "Start",IDC_BUTTON_PLC_TCPIP_SERVER_START,29,49,63,18
PUSHBUTTON "Stop",IDC_BUTTON_PLC_TCPIP_SERVER_STOP,29,73,63,18
EDITTEXT IDC_EDIT_MSG,342,14,201,273,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL
PUSHBUTTON "Update",IDC_BUTTON_PLC_TCPIP_SERVER_UPDATESTATE,277,70,40,14
GROUPBOX "DM DATA",IDC_STATIC,110,12,214,81
@@ -1091,6 +1091,8 @@ BEGIN
CONTROL "",IDC_LIST_PLC_TCPIP_SERVER_CCDDATA,"SysListView32",LVS_REPORT | WS_BORDER | WS_TABSTOP,24,110,294,166
GROUPBOX "Static",IDC_STATIC,17,97,307,214
PUSHBUTTON "Update",IDC_BUTTON_PLC_TCPIP_SERVER_UPDATEDATA,277,291,40,14
EDITTEXT IDC_EDIT_PLC_TCPIP_SERVER_PORTNUMBER,51,30,40,14,ES_AUTOHSCROLL
LTEXT "Port",IDC_STATIC,29,33,14,8
END
@@ -1728,12 +1730,12 @@ BEGIN
IDS_SO7_ABOUTBOX "&About Utility for SO7..."
END
#endif // 中文(简体,中国) resources
#endif // Chinese (Simplified, PRC) resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// 英语(美国) resources
// English (United States) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
@@ -2692,7 +2694,7 @@ BEGIN
END
END
#endif // 英语(美国) resources
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
@@ -464,6 +464,7 @@ void CSo7_Option::OnBnClickedOk()
CSo7_Util_PLC_TCPIP_SERVER* pSo7_Util_PLC_TCPIP_SERVER=new CSo7_Util_PLC_TCPIP_SERVER();
pSo7_Util_PLC_TCPIP_SERVER->DoModal();
delete pSo7_Util_PLC_TCPIP_SERVER;
pSo7_Util_PLC_TCPIP_SERVER=NULL;
if (g_pSo7_TCPIP_Server)
{
delete g_pSo7_TCPIP_Server;
@@ -89,6 +89,9 @@ BOOL CSo7_Util_PLC_TCPIP_SERVER::OnInitDialog()
GetDlgItem(IDC_EDIT_PLC_TCPIP_SERVER_STATE_LASER2)->SetWindowTextW(str);
str.Format(_T("%d"),g_pSo7_TCPIP_Server->m_TCPIPServerState._PLCRunningState);
GetDlgItem(IDC_EDIT_PLC_TCPIP_SERVER_PLC_STATE)->SetWindowTextW(str);
GetDlgItem(IDC_EDIT_PLC_TCPIP_SERVER_PORTNUMBER)->SetWindowTextW(_T("9600"));
m_UpdateListControl(E_LISTCTRL_TITLE);
UpdateData(FALSE);
@@ -99,9 +102,15 @@ BOOL CSo7_Util_PLC_TCPIP_SERVER::OnInitDialog()
void CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedButtonPlcTcpipServerStart()
{
CString str;
UpdateData(TRUE);
USES_CONVERSION;
GetDlgItem(IDC_EDIT_PLC_TCPIP_SERVER_PORTNUMBER)->GetWindowText(str);
const char* cTempValue=T2A(str);
short sPortNumber=static_cast<short>(atoi(cTempValue));
if (g_pSo7_TCPIP_Server)
{
g_pSo7_TCPIP_Server->StartServer(m_hWnd,9600);
g_pSo7_TCPIP_Server->StartServer(m_hWnd,sPortNumber);
m_csMSG=_T("<StartServer> ok.");
OutputWithScroll(m_csMSG,m_edMSG);
}
@@ -194,7 +203,7 @@ void CSo7_Util_PLC_TCPIP_SERVER::m_UpdateListControl(int _type)
cTmp=T2A(csTmp);
if (g_pSo7_TCPIP_Server)
{
g_pSo7_TCPIP_Server->m_CCDData[iRow]=atoi(cTmp);
g_pSo7_TCPIP_Server->m_CCDData_D10000[iRow]=atoi(cTmp);
}
}
break;
@@ -1073,6 +1073,8 @@
#define IDC_EDIT_PLC_TCPIP_SERVER_PLC_STATE 1899
#define IDC_BUTTON_PLC_TCPIP_SERVER_UPDATESTATE2 1900
#define IDC_BUTTON_PLC_TCPIP_SERVER_UPDATEDATA 1900
#define IDC_EDIT__PLC_TCPIP_PORTNUMBER2 1901
#define IDC_EDIT_PLC_TCPIP_SERVER_PORTNUMBER 1901
#define IDC_LIST_PLC_TCPIP_SERVER_CCDDATA 1902
#define IDC_IPADDRESS_PLC_TCPIP 1903
#define IDC_BUTTON_DIY_EXIT_BUTTON 32740