Structs.h
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:4k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. // 系统通用的数据结构以及部分常量的定义
  20. #pragma once
  21. enum {
  22. TS4NP_PORT = 53, // TS接受NP访问的默认端口
  23. CP4NP_PORT = 80, // CP接受NP访问的默认端口
  24.     MD5_LEN = 32, // MD5值的长度
  25. BLOCK_SIZE = 16384, // 默认分块大小
  26. };
  27. // 普通网络的IP地址信息,精简版,大小8字节
  28. // 不能直接当做sockaddr使用,只能赋值给一个sockaddr
  29. class NormalAddress {
  30. public:
  31.     NormalAddress() {
  32.         memset(this, 0, sizeof(NormalAddress));
  33.         sin_family = AF_INET;
  34.     };
  35.     bool operator == (const NormalAddress& addr) const {
  36.         return ((addr.sin_addr.s_addr == sin_addr.s_addr) && 
  37.             (addr.sin_port == sin_port));
  38.     };
  39.     short sin_family;
  40.     u_short sin_port;
  41.     struct in_addr sin_addr;
  42. };
  43. // P2P网络的Peer地址信息, 精简版,大小16字节
  44. class P2PAddress {
  45. public:
  46.     BOOL IsNAT() const { return !(0xffffffff == subnetIP.sin_addr.s_addr);};
  47.     // 外网用户的本机IP和发送段口,内网用户的出口网关IP和发送段口
  48.     NormalAddress    outerIP;
  49.     // 外网用户为"255.255.255.255"和监听段口,内网用户的内网IP和监听端口
  50.     NormalAddress    subnetIP;
  51. // P2PAddress不需要比较外网的端口
  52.     bool operator == (const P2PAddress& addr) const {
  53. return ((addr.outerIP.sin_addr.s_addr == outerIP.sin_addr.s_addr) && (addr.subnetIP == subnetIP));
  54.     };
  55. };
  56. // 这是P2P网络中最需要交流的信息,将来还可能进行扩充,目前大小4字节
  57. class CorePeerInfo {
  58. public:
  59.     CorePeerInfo() {memset(this, 0, sizeof(CorePeerInfo));};
  60.     unsigned layer:8;       // 在P2P网络中位于第几层(最大256)
  61.     unsigned isMaxIn:1;     // 是否达到最大连入的连接数
  62.     unsigned isMaxOut:1;    // 是否达到最大连出的连接数
  63.     unsigned isMaxFreeIn:1; // 是否达到最大连入的连接数(作贡献)
  64.     unsigned isMaxFreeOut:1;// 是否达到最大连出的连接数(作贡献)
  65.     unsigned isCachePeer:1; // 是CachePeer还是NormalPeer
  66.     unsigned :19;           // 空位域,留作以后使用
  67. };
  68. // 加上Peer地址的PeerInfo, 目前大小20字节
  69. class PeerInfoWithAddr : public CorePeerInfo, public P2PAddress {};
  70. // 数据传输的相关信息,目前大小32字节
  71. class TransferInfo {
  72. public:
  73.     TransferInfo() { memset(this, 0, sizeof(TransferInfo)); };
  74.     LONGLONG totalDownBytes;  // 总共下载字节
  75.     LONGLONG totalUpBytes;    // 总共上传字节
  76.     float    currDownSpeed;   // 当前下载速度
  77.     float    currUpSpeed;     // 当前上传速度
  78.     float    avgDownSpeed;    // 平均下载速度
  79.     float    avgUpSpeed;      // 平均上传速度
  80. };
  81. // DirectShow初始化需要的媒体类型数据,大小56字节
  82. struct MediaType {
  83. GUID     majortype;
  84. GUID     subtype;
  85. GUID     formattype;
  86. ULONG    lSampleSize;
  87. unsigned bFixedSizeSamples:1;
  88. unsigned bTemporalCompression:1;
  89. unsigned bThisPinOnly:1;
  90. unsigned cbFormat:16;
  91. unsigned :13;
  92. };
  93. // Sample头的大小,共16字节
  94. // 如果length和start都等于-1,则此Sample是节目开始的标志,不包含任何数据
  95. // 如果length和start都等于0, 则此Sample是媒体类型数据,bAudioSample表示音频或者视频
  96. struct SampleHeader {
  97. unsigned size:28; // 此Sample大小
  98. unsigned bDiscontinuity:1; // Sample属性
  99. unsigned bPreroll:1; // Sample属性
  100. unsigned bSyncPoint:1; // 是否关键帧
  101. unsigned bAudioSample:1; // 是否音频Sample
  102. UINT length; // 时间跨度
  103. LONGLONG start; // 起始时间
  104. };
  105. // SP发送的更新,要在NP之间传播, 大小24字节
  106. class SPUpdate {
  107. public:
  108. SPUpdate() : minKeySample(0x7fffffffffffffff), maxKeySample(0), 
  109. minBlockID(0xffffffff), maxBlockID(0){};
  110. LONGLONG minKeySample; // SP上最小的KeySample时间
  111. LONGLONG maxKeySample; // SP上最大的KeySample时间
  112. UINT     minBlockID;   // SP上最小的块编号
  113. UINT     maxBlockID;   // SP上最大的块编号
  114. };