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

📄 datagrams.h

📁 p2p软件
💻 H
字号:
//
// Datagrams.h
//
// Copyright (c) Shareaza Development Team, 2002-2004.
// This file is part of SHAREAZA (www.shareaza.com)
//
// Shareaza is free software; you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// Shareaza is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Shareaza; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//

#if !defined(AFX_DATAGRAMS_H__289BAC8C_A04C_4CB6_A185_ED043CA21CDA__INCLUDED_)
#define AFX_DATAGRAMS_H__289BAC8C_A04C_4CB6_A185_ED043CA21CDA__INCLUDED_

#pragma once

#pragma pack(1)

typedef struct
{
	CHAR	szTag[3];
	BYTE	nFlags;
	WORD	nSequence;
	BYTE	nPart;
	BYTE	nCount;
} SGP_HEADER;

#pragma pack()

// #define SGP_TAG_1	"SGP"
#define SGP_TAG_2		"GND"
#define SGP_DEFLATE		0x01
#define SGP_ACKNOWLEDGE	0x02

typedef struct
{
	DWORD		nTotal;
	DWORD		tLast;
	DWORD		nMeasure;
	DWORD		pHistory[24];
	DWORD		pTimes[24];
	DWORD		nPosition;
	DWORD		tLastAdd;
	DWORD		tLastSlot;
} UDPBandwidthMeter;

class CBuffer;
class CPacket;
class CG2Packet;
class CDatagramIn;
class CDatagramOut;


class CDatagrams
{
// Construction
public:
	CDatagrams();
	virtual ~CDatagrams();
	
// Attributes
protected:
	SOCKET		m_hSocket;
	WORD		m_nSequence;
	BOOL		m_bStable;
	DWORD		m_tLastWrite;
protected:
	CBuffer*	m_pBufferBuffer;
	DWORD		m_nBufferBuffer;
	CBuffer*	m_pBufferFree;
	DWORD		m_nBufferFree;
protected:
	CDatagramIn*	m_pInputBuffer;
	DWORD			m_nInputBuffer;
	CDatagramIn*	m_pInputFree;
	CDatagramIn*	m_pInputFirst;
	CDatagramIn*	m_pInputLast;
	CDatagramIn*	m_pInputHash[32];
protected:
	CDatagramOut*	m_pOutputBuffer;
	DWORD			m_nOutputBuffer;
	CDatagramOut*	m_pOutputFree;
	CDatagramOut*	m_pOutputFirst;
	CDatagramOut*	m_pOutputLast;
	CDatagramOut*	m_pOutputHash[32];
public:
	UDPBandwidthMeter	m_mInput;
	DWORD				m_nInBandwidth;
	DWORD				m_nInFrags;
	DWORD				m_nInPackets;
	UDPBandwidthMeter	m_mOutput;
	DWORD				m_nOutBandwidth;
	DWORD				m_nOutFrags;
	DWORD				m_nOutPackets;
	
// Operations
public:
	BOOL	Listen();
	void	Disconnect();
	BOOL	IsStable();
	BOOL	Send(IN_ADDR* pAddress, WORD nPort, CPacket* pPacket, BOOL bRelease = TRUE, LPVOID pToken = NULL, BOOL bAck = TRUE);
	BOOL	Send(SOCKADDR_IN* pHost, CPacket* pPacket, BOOL bRelease = TRUE, LPVOID pToken = NULL, BOOL bAck = TRUE);
	void	PurgeToken(LPVOID pToken);
	void	OnRun();
protected:
	void	Measure();
	BOOL	TryWrite();
	void	ManageOutput();
	void	Remove(CDatagramOut* pDG);
protected:
	BOOL	TryRead();
	BOOL	OnDatagram(SOCKADDR_IN* pHost, BYTE* pBuffer, DWORD nLength);
	BOOL	OnReceiveSGP(SOCKADDR_IN* pHost, SGP_HEADER* pHeader, DWORD nLength);
	BOOL	OnAcknowledgeSGP(SOCKADDR_IN* pHost, SGP_HEADER* pHeader, DWORD nLength);
	void	ManagePartials();
	void	Rerequest(CDatagramIn* pDG);
	void	Remove(CDatagramIn* pDG, BOOL bReclaimOnly = FALSE);
protected:
	BOOL	OnPacket(SOCKADDR_IN* pHost, CG2Packet* pPacket);
	BOOL	OnPing(SOCKADDR_IN* pHost, CG2Packet* pPacket);
	BOOL	OnPong(SOCKADDR_IN* pHost, CG2Packet* pPacket);
	BOOL	OnQuery(SOCKADDR_IN* pHost, CG2Packet* pPacket);
	BOOL	OnQueryAck(SOCKADDR_IN* pHost, CG2Packet* pPacket);
	BOOL	OnHit(SOCKADDR_IN* pHost, CG2Packet* pPacket);
	BOOL	OnQueryKeyRequest(SOCKADDR_IN* pHost, CG2Packet* pPacket);
	BOOL	OnQueryKeyAnswer(SOCKADDR_IN* pHost, CG2Packet* pPacket);
	BOOL	OnPush(SOCKADDR_IN* pHost, CG2Packet* pPacket);
	BOOL	OnCrawlRequest(SOCKADDR_IN* pHost, CG2Packet* pPacket);
	BOOL	OnCrawlAnswer(SOCKADDR_IN* pHost, CG2Packet* pPacket);
	
};

extern CDatagrams Datagrams;

#endif // !defined(AFX_DATAGRAMS_H__289BAC8C_A04C_4CB6_A185_ED043CA21CDA__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -