封装了P2P连接与数据传输过程的DLL(一)

时间:2008-05-21  来源:CSDN  作者:wanghao0727

写在前面的话

  PSerSocket.DLL(在下文中将简称为DLL)将进行P2P连接时的连接过程和传送信息的方法封装在了DLL里面,使开发P2P的过程相对简单化和标准化,因为使用了数据流的方式来传输对象,从而使数据的传送变得轻松和直观,使开发者不用去解读一个个的字符串,可以充分地利用Windows的异步消息机制直接去处理一个个的指令对象。
  DLL采用了自定义的一套数据流方式来传送和合成指令对象,而没有使用VC的序列化对象,避免了VC序列化对象不能在不同语言平台上合成的问题。DLL的数据流对象可以在VC和JAVA之间自由传输,从而使开发者不用去处理多平台传输时的复杂问题。
  DLL封装了建立连接和传送信息的细节,使不同的开发者开发的P2P产品互相连接成为了可能,即使于国际标准化的接轨,也只需要重新下载新的DLL就可以啦,而不需要每个开发者都去改写程序。随着DLL的新的功能的增加与完善,每个开发者都可以直接地将这些功能集成进原有的软件中,将大大地加快开发的速度和可靠性。
DLL具有非常强大的扩展性,它通过回调函数和消息与外部进行交互,可以使开发者随时得到程序当前运行情况的通报。

  P2P网络的建立,不是一个或几个公司能够完成的,只有全体开发者的共同努力,才可以建立起中国自己的P2P网络。


使用DLL来建立连接所需要的步骤
  使用DLL来建立一个聊天连接或传送、接收文件的连接是非常容易的,你只需按以下步骤就可以实现:

  1 初始化DLL。通过调用以下方法和设置属性来实现。
    PDefine::SInitSocketStream();
    PThreadParm::SCreateTCPListenPort(1500); //1500是你自己的监听端口号。
    PDefine::cSMsgInfo.pWnd=this;
    PDefine::cSMsgInfo.bIsAutoDel=false;

    PDefine::pSGetFriendCallBackFun=CPPSerDlg::SGetFriendFromID;
    /*
    一个回调函数,是CPPSerDlg类中的一个静态方法。DLL通过向这个回调函数传递一个好友的ID号,来得到该好友的PFriend对象的指针。
    在测试时,你可以固定返回一个已创建好的PFriend对象的指针。
    */

    PDefine::pSGetFileNCallBackFun=CPPSerDlg::SGetFileNameByFileID;
    /*
    一个回调函数,是CPPSerDlg类中的一个静态方法。DLL通过向这个回调函数传递一个文件的数字标识,来得到具体的文件名称,包含路径和扩展名,是你想传送给被连接方的文件名称。
    在测试时,你可以固定返回一个进行传输测试的文件。这个文件最好有几十兆,因为下载速度会非常快。
    */

  2 在你的窗口中响应2个消息。
    CREATE_NEW_OBJ_MSG //在消息的响应函数中,直接调用PDefine::SCreateNewObj(wParam,lParam)静态方法。
    CREATE_NEW_THREAD_MSG //在消息的响应函数中,直接调用PDefine::SCreateNewThread(wParam,lParam)静态方法。

  3 创建一个PFriend对象,填充PFriend对象的三个属性:
    m_lpszHostAddress; //被连接方的主机地址。
    m_nHostPort; //被连接方的主机的监听端口。
    m_sFriendID; //好友的ID,在测试时你可以随便设定一个12位长的字符串。

  4 创建一个PRecvInfo结构。(如果你想创建一个聊天连接,直接跳到第6步。)
    PRecvInfo* prf=new PRecvInfo();
    prf->szBlockMap=NULL; //固定赋值为NULL。
    prf->nFileLen=110273244; //想下载的文件的总的字节数。
    prf->nSplitNo=30; //将文件分割成多少个块下载,取值从1..999。