090822项目进展:学习emule源码1,

来源:互联网 发布:genmu根沐淘宝 编辑:程序博客网 时间:2024/05/22 21:48

 

了解一下eMule的源码,搜索一下关于微软p2p SDK的内容,加深对p2p文件共享的理解。

 

eMule的源码明明白白的放在互联网上,实实在在的宝贵资料,但是想看懂是不容易的,需要时间精力的投入,需要好的方法。现在也就打算了解个皮毛,有些初级的了解,下周再向高手请教一下内网p2p软件搜索的可行性。如果不可行的话就不考虑p2p资料的搜索了,转向数据库先把SearchTool项目的功能实现。虽然搞这个项目的初衷是学习网络,但目前看来也只是接触到了网络的应用层,再往下可能需要考虑其他的小项目了。

 

感谢在csdn上共享学习心得的前辈,提供了许多有用的资源。

 

1,eMule源码支持MS多个版本编译器的编译,可惜我现在还在用vc6,太土了,没试过vc9,目前暂时没准备深入去看源码,暂不升级编译了。

 

2,StringConversion.cpp .h提供了比较通用的转换字符串操作函数。有些函数的实现写在.h文件里面,似乎不是太好。字符的编码格式,ASCII,Unicode,utf8。

 

3,文件读写的类CFileDataIO:

class CFileDataIO
{
public:
 virtual UINT Read(void* lpBuf, UINT nCount) = 0;
 virtual void Write(const void* lpBuf, UINT nCount) = 0;
 virtual ULONGLONG Seek(LONGLONG lOff, UINT nFrom) = 0;
 virtual ULONGLONG GetPosition() const = 0;
 virtual ULONGLONG GetLength() const = 0;

 virtual uint8 ReadUInt8();
 virtual uint16 ReadUInt16();
 virtual uint32 ReadUInt32();
 virtual uint64 ReadUInt64();
 virtual void ReadUInt128(Kademlia::CUInt128 *pVal);
 virtual void ReadHash16(uchar* pVal);
 virtual CString ReadString(bool bOptUTF8);
 virtual CString ReadString(bool bOptUTF8, UINT uRawSize);
 virtual CStringW ReadStringUTF8();

 virtual void WriteUInt8(uint8 nVal);
 virtual void WriteUInt16(uint16 nVal);
 ....
};

 

之后的多继承,做出聚合可能更好。

class CSafeMemFile : public CMemFile, public CFileDataIO
{

}

 

4,有一个重载可变参数的函数

int CSafeBufferedFile::printf(LPCTSTR pszFmt, ...)
{
 va_list args;
 va_start(args, pszFmt);
 int iResult = _vftprintf(m_pStream, pszFmt, args);
 va_end(args);
 if (iResult < 0) {
#if _MFC_VER>=0x0800
  AfxThrowFileException(CFileException::genericException, _doserrno, m_strFileName);
#else
  AfxThrowFileException(CFileException::generic, _doserrno, m_strFileName);
#endif
 }
 return iResult;
}

 

原创粉丝点击