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

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. #ifndef __ECHO_H_INCLUDED
  21. #define __ECHO_H_INCLUDED
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <ctype.h>
  25. #include <sys/types.h>
  26. #include <sys/time.h>
  27. #include <sys/resource.h>
  28. #include <sys/stat.h>
  29. #include <sys/wait.h>
  30. #include <sys/socket.h>
  31. #include <netinet/in.h>
  32. #include <arpa/inet.h>
  33. #include <netdb.h>
  34. #include <unistd.h>
  35. #include <fcntl.h>
  36. #include <errno.h>
  37. #include <assert.h>
  38. #include <syslog.h>
  39. #include <string.h>
  40. #include <time.h>
  41. #include <dirent.h>
  42. #include "md5.h"
  43. #include "ProtocolDefine.h"
  44. #include "StructDefine.h"
  45. #include "ErrorDefine.h"
  46. #include "util.h"
  47. #define AUTH_HEADER 12
  48. #define NORMAL_HEADER 5
  49. #define MAX_REPSP 10 // Max number of reported sp for cp
  50. #define MAX_NEARPEER 10
  51. #define MAX_CHANNEL 1024 /* max number of Channel */
  52. #define MAX_CONN 75 /* connect timeout, after MAX_CONN reconnect */
  53. #define MAX_CLIENT 3072 // max number of client
  54. #define MAX_QUEUE 4194304 /* max BlockData malloced for a channel */
  55. #define MAX_FILEINPUT 1024
  56. #define MIN_IPADDR_LEN 8
  57. #define IPADDR_LEN 16 /*****IP地址最大长度*****/
  58. #define CHNLURL_LEN 128 /*****频道的标志URL*****/
  59. #define DEFAULT_BLOCK 16384 // default size of Media Block
  60. #define TYPE_LIVE 0
  61. #define TYPE_ORDER 1
  62. #define MAX_LINE 1024
  63. #define MAX_MSG_SIZE 17000
  64. #define MAX_PENDING_JOB 3
  65. #define MAX_TRANSFER_IDLE 60
  66. #define FLAG_SERVER 0
  67. #define FLAG_CLIENT 1
  68. #define MAX_DATA 65536 /* max size of message */
  69. #define MAX_BLOCK_SIZE 65000
  70. #define MIN_BLOCK_SIZE 0
  71. #define LIVE_PREFIX "/channel/"
  72. #define ORDER_PREFIX "/data/"
  73. #define PLIST_PREFIX "/playlist/"
  74. #define PROG_PREFIX "/program/"
  75. #define BLOCK_PER_FILE 163840
  76. #define MAX_TYPE 2
  77. #define TYPE_P2PC 0
  78. #define TYPE_P2PS 1
  79. #define TYPE_CS 0
  80. #define TYPE_CP 1
  81. #define MAX_JOB 10
  82. #ifdef __CP_SOURCE
  83. #define IDENTITY "CP"
  84. #endif
  85. #ifdef __SP_SOURCE
  86. #define IDENTITY "SP"
  87. #endif
  88. #ifndef IDENTITY
  89. #define IDENTITY "PP"
  90. #endif
  91. enum TS_INDEX
  92. {
  93. EDUTS = 0,
  94. CNCTS = 1,
  95. UNITS = 2,
  96. TELTS = 3,
  97. // add new TS here!!
  98. };
  99. enum CHTYPE
  100. {
  101. T_ORDER = 0,
  102. T_LIVE = 1,
  103. T_PLIST = 2
  104. };
  105. #define MAX_TS 4
  106. struct Message
  107. {
  108. int len;
  109. char type;
  110. char buffer[MAX_DATA];
  111. };
  112. struct MList
  113. {
  114. struct Channel *m_lists[MAX_FILEINPUT];
  115. int m_startID[MAX_FILEINPUT]; // start block id for each chan
  116. int m_totalchannel; // total number of channels
  117. int m_cursampleid; // cur sample file id
  118. int m_lastmaxid;
  119. };
  120. struct MediaData
  121. {
  122. int start;
  123. unsigned int len;
  124. int dlen;
  125. char *data;
  126. char progname[CHNLURL_LEN];
  127. #ifdef __CP_SOURCE
  128. char channel_name[CHNLURL_LEN];
  129. #endif
  130. };
  131. typedef int (*TimerFunc) (void *, void *);
  132. struct Timertask
  133. {
  134. unsigned int time;
  135. TimerFunc process;
  136. void *entity;
  137. void *data;
  138. struct Timertask *next;
  139. };
  140. struct TSMessage
  141. {
  142. unsigned int len;
  143. unsigned char type;
  144. unsigned int authcode1:24;
  145. unsigned int authcode2;
  146. char buffer[MAX_DATA];
  147. };
  148. struct LiveChannelInfo
  149. {
  150. unsigned int maxID;
  151. struct Session *dataSource; // source of data, a connection to SP or uplevel CP
  152. unsigned int total;
  153. struct SPUpdate s;
  154. unsigned int max_queue;
  155. float bitrate;
  156. // struct BlockData *blocks;
  157. int max_channel;
  158. int cur_channel;
  159. struct MediaData *media;
  160. int isSave;
  161. #ifdef __CP_SOURCE
  162. char *bitflag; // for CP, it is pending status, for SP, it is keysample status
  163. unsigned char *indisk;
  164. unsigned int numofsp;
  165. struct NormalAddress SPLIST[256];
  166. #endif
  167. #ifdef __SP_SOURCE
  168. unsigned int startid;
  169. struct MList *mlist;
  170. FILE *input[MAX_FILEINPUT];
  171. FILE *keyfile;
  172. unsigned int numinput;
  173. unsigned int numblocks;
  174. unsigned int userid;
  175. float limitedBitRate;
  176. unsigned int status;
  177. time_t updated;
  178. #endif
  179. };
  180. struct Channel
  181. {
  182. int type;
  183. int ref;
  184. char fname[CHNLURL_LEN];
  185. char channel_name[CHNLURL_LEN];
  186. char channel_md5[MD5_LEN+1];
  187. int maxblocksize;
  188. int numclient;
  189. int numjob; // number of jobs
  190. unsigned int ctime;
  191. #ifdef __SP_SOURCE
  192. int numofnp[MAX_TS];
  193. #endif
  194. #ifdef __CP_SOURCE
  195. time_t last_nearpeer;
  196. #endif
  197. long long downsize; // recv from SP for CP, file size for SP;
  198. long long upsize; // send to NP
  199. FILE *db;
  200. struct LiveChannelInfo *pcinfo;
  201. struct Edge *PeerHead;
  202. struct Channel *next;
  203. struct Channel *lnext;
  204. };
  205. struct Session
  206. {
  207. int type;
  208. int socket;
  209. #ifdef __CP_SOURCE
  210. unsigned char npcp; //TYPE_CP
  211. unsigned char flag;
  212. unsigned short first;
  213. unsigned int sock_flag; /* saved for restore after connection succed */
  214. float version;
  215. long long totalup;
  216. struct PeerInfoWithAddr addr;
  217. // struct CorePeerInfo *c;
  218. // struct TransferInfo *t;
  219. #endif
  220. unsigned int host;
  221. unsigned int port;
  222. unsigned int time_sec; //time of creation
  223. unsigned int last_transferblock; //time of last send or recv a block
  224. char *buf;
  225. unsigned int start;
  226. unsigned int off;
  227. unsigned int numjob;
  228. struct JobDes *head;
  229. struct Channel *pc;
  230. struct Edge *header;
  231. struct Session *next;
  232. };
  233. struct ServerDesc
  234. {
  235. int flag;
  236. int sock;
  237. int type;
  238. int cur;
  239. int max;
  240. int maxid;
  241. unsigned int port;
  242. // char buf[MAX_DATA];
  243. unsigned int start;
  244. unsigned int off;
  245. struct Session *head;
  246. int (*init) (int listnum);
  247. int (*process) (int listnum);
  248. int (*closure) (int listnum);
  249. };
  250. struct Edge
  251. {
  252. struct Channel *head;
  253. struct Session *me;
  254. struct Edge *cnext;
  255. struct Edge *enext;
  256. };
  257. struct JobDes
  258. {
  259. struct Session *p;
  260. struct Channel *pc;
  261. struct JobDes *prev;
  262. struct JobDes *next;
  263. int blockid;
  264. int start;
  265. int len;
  266. char buffer[MAX_MSG_SIZE];
  267. };
  268. struct cachetype
  269. {
  270. struct cachetype *next;
  271. };
  272. struct DBRec
  273. {
  274. char md5pass[MD5_LEN];
  275. char *cname;
  276. float bitrate;
  277. int isSave;
  278. };
  279. struct logrec
  280. {
  281. unsigned int id;
  282. unsigned int keysample;
  283. };
  284. #ifdef DEBUG
  285. #ifdef HAVE_SYSLOG
  286. #define OPENLOG openlog (IDENTITY, LOG_PID, LOG_USER)
  287. #define PDEBUG(fmt, args...) syslog(LOG_INFO, "(%s,%d)" fmt, __FILE__, __LINE__, ## args)
  288. #define CLOSELOG closelog ()
  289. #else /* HAVE_SYSLOG */
  290. #define PDEBUG(fmt, args...) fprintf(stderr, IDENTITY ": (%s,%d)" fmt, __FILE__, __LINE__, ## args)
  291. #endif /* HAVE_SYSLOG */
  292. #endif
  293. #ifndef OPENLOG
  294. #define OPENLOG do {} while (0)
  295. #endif
  296. #ifndef CLOSELOG
  297. #define CLOSELOG do {} while (0)
  298. #endif
  299. #ifndef PDEBUG
  300. #define PDEBUG(a,...) do {} while (0)
  301. #endif
  302. #define PINFO(fmt, args...) fprintf(stderr, IDENTITY ": (%s,%d)" fmt, __FILE__, __LINE__, ## args)
  303. #define IPADDR(a) (a >> 24), ((a)>>16) & 0xff, ((a)>>8) & 0xff, (a) & 0xff
  304. #ifdef HAVE_MYSQL
  305. #include <mysql/mysql.h>
  306. #define MAX_QUERY 1024
  307. #endif
  308. #define isSet(buf,i) ((buf[i>>3] & (0x80>>(i&7))) != 0)
  309. #define setBit(buf,i) do {buf[i>>3] |= (0x80>>(i&7));}while (0)
  310. #define clrBit(buf,i) do {buf[i>>3] &= ~(0x80>>(i&7));}while (0)
  311. #define FIX_MAGIC 1134224000
  312. inline struct JobDes *newJob ();
  313. void addJob (struct Session *q, struct Channel *pc, struct JobDes *n);
  314. inline struct JobDes *findEnoughBuffer (struct Session *q, struct Channel *pc, int size);
  315. void deleteJob (struct Session *q, struct Channel *pc, int *job, int num);
  316. int processJobs (struct Session *q);
  317. void deleteAll (struct Session *q);
  318. void deleteChannel (struct Session *q, struct Channel *pc);
  319. int newChannel (struct Channel *pc, struct NormalAddress *client, int n, int type);
  320. struct Channel *newLiveChannel (char *name, struct Session *source, char *cmd5, float bitrate, int maxblocksize);
  321. void freeAllChannel ();
  322. inline int hash_str (unsigned char *str, int len);
  323. int saveBlock (struct Channel *c, char *buf, struct Session *p);
  324. int locate_by_id (struct Channel *c, unsigned int id, char *buf, int max);
  325. struct Channel *findChannel (char *name, int len);
  326. int freeChannel (struct Channel **phash, struct Channel **plist, int *count, struct Channel *p);
  327. void freeLiveChannel (struct Channel *pc, void *p);
  328. int free_livechannel (struct Channel *pc);
  329. struct Channel *getChannel (struct Channel **phash, char *name, int len);
  330. struct Edge *newEdge (struct Channel *head, struct Session *me);
  331. int delEdge (struct Edge *e);
  332. int process_P2P_REQUEST_real (struct Session *p, struct Channel *pc, int id);
  333. void freeMedia (struct Channel *pc);
  334. #ifdef __CP_SOURCE
  335. void addMedia (struct Channel *pc, int start, int len, int dlen, char *data, char *progname, char *channel_name);
  336. #endif
  337. #ifdef __SP_SOURCE
  338. void addMedia (struct Channel *pc, int start, int len, int dlen, char *data, char *progname);
  339. #endif
  340. int isHit (struct Channel *pc, int blockid);
  341. void sendHitMedia (struct Session *p, struct Channel *pc, int i, int id, int copymd5);
  342. void sendMedia (struct Session *p, struct Channel *pc);
  343. struct Channel *getProgrambymd5 (char *name, int len);
  344. int locateprog_by_id (struct Channel *pc, unsigned int id, char *buf, int max);
  345. void freeAllProgram ();
  346. struct Channel *newOrder (char *md5);
  347. int locate_order_by_id (struct Channel *c, uint32_t id, char *buf, int max);
  348. struct Channel *findOrder (char *name, int len);
  349. void freeAllOrder ();
  350. void apply_hash (struct Channel **phash, void apply (struct Channel *,void *), void *p);
  351. void apply_list (struct Channel *plist, void apply (struct Channel *, void *), void *p);
  352. int timer_remove (void *entity, void *data);
  353. void sendIdMedia (struct Session *p, struct Channel *pc, int id, int copymd5);
  354. int writeMessage (struct Session *p, struct Channel *pc, char *ptr);
  355. #endif //__ECHO_H_INCLUDED