了解一下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;
}