|
与基于udp协议的tracker服务器进行交互(2)
// DataStream.h: interface for the CDataStream class.////////////////////////////////////////////////////////////////////////#if !defined(AFX_DATASTREAM_H__D90A2534_EA73_4BEA_8B7E_87E59A3D1D26__INCLUDED_)#define AFX_DATASTREAM_H__D90A2534_EA73_4BEA_8B7E_87E59A3D1D26__INCLUDED_#if _MSC_VER > 1000#pragma once#endif // _MSC_VER > 1000#include <stdio.h> //数据流操作函数class CDataStream{public :CDataStream(char * szBuf,int isize){m_isize = isize;buffer = szBuf;current = buffer;}~CDataStream(){} void clear(){current = buffer;current[0]=0;}//此函数不动态增加内存,一次打印的数据长度不应该超过缓冲区的三分之一,否则可能导致失败bool printf(const char * format,...){if(current){if(current - buffer > (m_isize*2)/3)return false;va_list argPtr ;va_start( argPtr, format ) ;int count = vsprintf( current, format, argPtr ) ;va_end( argPtr );current += count ;return true;}return false;}//此函数拷贝字符串bool strcpy(const char * szStr){if(current&&szStr){int ilen = lstrlen(szStr);if((m_isize-(current - buffer)) < (ilen +2))return false;memcpy(current,szStr,ilen+1);current += ilen;return true;}return false;}char * getcurrentpos(){return current;}void move(int ilen)//当前指针向后移动ilen{current += ilen;}void reset(){current = buffer;}BYTE readbyte(){current ++;return *(current-1);}void writebyte(BYTE btValue){*current = btValue;current ++;}WORD readword(){current +=2;return *((WORD*)(current-2));}void writeword(WORD wValue){*((WORD*)current) = wValue;current +=2;}DWORD readdword(){current +=4;return *((DWORD*)(current-4));}void writedword(DWORD dwValue){*((DWORD*)current) = dwValue;current +=4;}__int64 readint64(){current +=8;return *((__int64*)(current-8));}void writeint64(__int64 iValue){*((__int64*)current) = iValue;current +=8;}BYTE * readdata(DWORD dwLen){current +=dwLen;return (BYTE*)(current-dwLen);}void writedata(BYTE * pData,DWORD dwLen){memcpy(current,pData,dwLen);current +=dwLen;}char * readstring(){char * szRes = current;int ilen = lstrlen(current);current +=(ilen+1);return szRes;}int size(){return (int)(current-buffer);}const char * getbuffer(){return buffer;}private :char* buffer; char* current;int m_isize;};class CNetworkByteOrder{public:static unsigned short int convert(unsigned short int iValue){unsigned short int iData;((BYTE*)&iData)[0] = ((BYTE*)&iValue)[1];((BYTE*)&iData)[1] = ((BYTE*)&iValue)[0];return iData;}static int convert(int iValue){int iData;((BYTE*)&iData)[0] = ((BYTE*)&iValue)[3];((BYTE*)&iData)[1] = ((BYTE*)&iValue)[2];((BYTE*)&iData)[2] = ((BYTE*)&iValue)[1];((BYTE*)&iData)[3] = ((BYTE*)&iValue)[0];return iData;}static __int64 convert(__int64 iValue){__int64 iData;((BYTE*)&iData)[0] = ((BYTE*)&iValue)[7];((BYTE*)&iData)[1] = ((BYTE*)&iValue)[6];((BYTE*)&iData)[2] = ((BYTE*)&iValue)[5];((BYTE*)&iData)[3] = ((BYTE*)&iValue)[4];((BYTE*)&iData)[4] = ((BYTE*)&iValue)[3];((BYTE*)&iData)[5] = ((BYTE*)&iValue)[2];((BYTE*)&iData)[6] = ((BYTE*)&iValue)[1];((BYTE*)&iData)[7] = ((BYTE*)&iValue)[0];return iData;}};#endif // !defined(AFX_DATASTREAM_H__D90A2534_EA73_4BEA_8B7E_87E59A3D1D26__INCLUDED_)在逸搜(EaseSo)论坛可以下载到支持udp tracker的测试程序BTTrackerTest.
|