⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 netinterface.h

📁 用事件方式
💻 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 + -