📄 netinterface.h
字号:
// NetInterface.h : main header file for the NETINTERFACE DLL
//
#if !defined(AFX_NETINTERFACE_H__FCCFCA0D_EF0F_4764_BE31_01ADD4DCB004__INCLUDED_)
#define AFX_NETINTERFACE_H__FCCFCA0D_EF0F_4764_BE31_01ADD4DCB004__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif
#include "resource.h" // main symbols
#include <winsock2.h>
#include <afxmt.h>
#pragma comment(lib,"ws2_32.lib")
/////////////////////////////////////////////////////////////////////////////
// CNetInterfaceApp
/*
NetInterface接口DLL说明:
1、通过EVENT_BEGIN_READ对应的事件来确定有数据到来。
2、读取数据线程被该事件激活,激活后马上将这个事件复位;读取完数据,再次查看事件,如有数据。。。
3、读取数据线程将读到的数据放到缓冲区中之后,激活数据分析线程,并立即读取下一个数据
4、数据分析线程将不合法的数据扔掉。遇到合法的数据,即通过消息通知应用层。
5、给应用层的接口:
1、读ReadData
如果接收缓冲区中有合法数据,既读取,读取后,将这个节点移到链表尾,同时返回1
如没有数据,返回0
如出错,返回相应的错误码.,可参考这个函数说明
2、发送SendData
DLL会先将要发送的数据放到发送缓冲区的一个节点中。等到可以发送数据了,再发送。
3、SetNetInterfaceInfo(HWND hWnd,CString ip,UINT port,UINT message),设置DLL
hWnd为应用层程序的窗口。
ip为想要使用的IP地址
port为想要使用的port
message为,有数据到来时,通知应用层的消息
*/
// See NetInterface.cpp for the implementation of this class
//使用的两个工具类
class CData;
class CDataAnalysisEngine;
typedef CTypedPtrList<CObList,CData*> DataList;
//应用层窗口
static HWND m_hUserProgramWnd=NULL;
//和主程序通信消息
static UINT WM_NEW_MESSAGE=0;
//定义收、发缓冲区
const int m_nBufferNum=1000;
static DataList m_read_data_list;
static DataList m_send_data_list;
static POSITION m_nextBlank_sendData;
static POSITION m_nextBlank_readData;
static POSITION m_nextUnanalysised_readData;
//服务、连接端地址
static SOCKET m_server;
static SOCKADDR_IN m_server_sockaddr_in;
static SOCKADDR_IN m_send_client_sockaddr_in;
static SOCKADDR_IN m_read_client_sockaddr_in;
//是否打开服务
static BOOL m_bHasSetupDLL=FALSE;
static BOOL m_bServerStart=FALSE;
//分析数据引擎
static CDataAnalysisEngine *m_pDataEngine=NULL;
//SOCKET消息事件
const EVENT_NUM=9;
enum tagEvent
{
EVENT_BEGIN_READ,
EVENT_BEGIN_SEND,
EVENT_CLOSE_READ_THREAD,
EVENT_CLOSE_SEND_THREAD,
EVENT_DATA_PROCESS,
EVENT_CLOSE_DATA_PROCESS_THREAD,
EVENT_READ_THREAD_END,
EVENT_SEND_THREAD_END,
EVENT_DATA_PROCESS_THREAD_END
};
static WSAEVENT EventArray[EVENT_NUM];
static CCriticalSection m_criticalSection;//用来保护读取数据链表
//读取和发送数据线程
//错误信息
static CString m_strErrorMessage=_T("");
class CNetInterfaceApp : public CWinApp
{
public:
CNetInterfaceApp();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CNetInterfaceApp)
//}}AFX_VIRTUAL
//{{AFX_MSG(CNetInterfaceApp)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
public://导出函数
/*
ReadData说明:
1、len为szData的大小!!!!!
2、无须为szData清零
3、返回值说明:0,没读到数据,读缓冲区已经空;1,已经读取数据;-1,len为0,错误,
-2, 未启动或者未设置DLL
*/
int ReadData(int &nOrderGroup,
int &nOrder,
char szData[], int &len, CString &ip, UINT &port);
void SendData(int nOrderGroup,
int nOrder,
char szData[], int len, CString ip, UINT port);
BOOL StartServer();
BOOL StopServer();
void SetNetInterfaceInfo(HWND hWnd,CString ip,UINT port,UINT message);
private://DLL内部函数
BOOL _ReadData(CData*pdata,SOCKADDR_IN&addr);
BOOL _SendData(CData*pdata,SOCKADDR_IN&addr);
static UINT SendDataThread(LPVOID lParam);
static UINT ReadDataThread(LPVOID lParam);
static UINT DataAnalysisThread(LPVOID lParam);
void AddMessageToLogFile(CString strMessage);
CData *GetNextBuffer(DataList&m_list,POSITION nextBlank);
CData *GetNextBlankBuffer(DataList&m_list,POSITION&nextBlank);
CData *GetNextUnanalysisedBuffer();
void UnInitBuffer();
void InitBuffer();
//如果分析接收到的数据时,发现接收到的数据是非法的,就用这个函数扔掉这个数据,
//同时,将这个接收缓冲区节点移到接收缓冲区的尾端。
void AbandonData();
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_NETINTERFACE_H__FCCFCA0D_EF0F_4764_BE31_01ADD4DCB004__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -