⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gnutella.h

📁 linux下支持P2P的客户端程序,采用了Gnutella的方法,其中有实现Gnutella的具体源码,是一个基于p2p环境下的音乐共享软件,有助于对P2P的研究
💻 H
字号:
/*-*-linux-c-*-*//* *  gnewtellium - Newtella for Unix *  Copyright (C) 2001 Elias Athanasopoulos * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#ifndef GNUTELLA_HEADER_H#define GNUTELLA_HEADER_H#include "guid.h"#include "connection.h"/* QHD bits */#define QHD_PUSH_BIT_MASK 1#define QHD_BUSY_BIT_MASK 4#define QHD_OD_SIZE 2typedef union {	gchar chars[4];	guint32 dword;} IP;typedef enum {        GNUTELLA_INIT           = 0x00, 	GNUTELLA_INITRESPONSE   = 0x01, 	GNUTELLA_PUSHREQUEST    = 0x40, 	GNUTELLA_SEARCH         = 0x80, 	GNUTELLA_SEARCHRESPONSE = 0x81} gnutella_function;/* Gnutella standard packets conforming to    protocol specification 0.4.*//* standard header */struct gnutella_header {	gchar   guid[GUID_LEN];	guint8  f;	guint8  ttl;	guint8  hops;	guint32 length; };#define GN_HEADER_SIZE 23#define GNUTELLA_HDR_ATTACH(data, hdr)            \{                                                 \	guidcpy(data, hdr->guid);                 \	data[16] = hdr->f;                        \        data[17] = hdr->ttl;                      \        data[18] = hdr->hops;                     \        memcpy(data+19, &(hdr->length), 4);       \}					#define GNUTELLA_HDR_GRAB(hdr, data)              \{                                                 \	guidcpy(hdr->guid, data);                 \	hdr->f    = data[16];                     \	hdr->ttl  = data[17];                     \	hdr->hops = data[18];                     \	memcpy(&(hdr->length), data+19, 4);       \}/* pong packet */struct gnutella_pong_header {	guint16 host_port;	guint32 host_ip;	guint32 file_count;	guint32 files_total_size;};#define GN_PONG_SIZE 14#define GNUTELLA_PONG_ATTACH(data, pong)                  \{                                                         \	memcpy(data,    &(pong->host_port),        2);    \	memcpy(data+2,  &(pong->host_ip),          4);    \	memcpy(data+6,  &(pong->file_count),       4);    \	memcpy(data+10, &(pong->files_total_size), 4);	  \					   }#define GNUTELLA_PONG_GRAB(pong, data)                    \{                                                         \        memcpy(&(pong->host_port),           data, 2);    \	memcpy(&(pong->host_ip),           data+2, 4);    \	memcpy(&(pong->file_count),        data+6, 4);    \	memcpy(&(pong->files_total_size), data+10, 4);	  \}/* the extend query hit descriptor   introduced by BearShare */struct gnutella_extended_qhd {	gchar   vendor[4];	guint8  open_data_size;	guint16 open_data;};#define GN_EXTENDED_QHD_SIZE 7/* gnutella search packet */struct gnutella_query_header {	guint16 min_speed;	gchar  *name;};#define GN_QUERY_SIZE 2#define GNUTELLA_QUERY_ATTACH(data, query)                \{                                                         \	memcpy(data, &(query->min_spped), 2);             \	strncpy(data+2, query->name,                      \		strlen(query->name));                     \}#define GNUTELLA_QUERY_GRAB(query, data)                  \{                                                         \        memcpy(&(query->min_speed), data, 2);             \        query->name = newtella_malloc(strlen(data+2)+1);  \        strncpy(query->name, data+2, strlen(data+2));     \}struct gnutella_hit {	guint32 index;	guint32 size;	guint8 *name;};#define GN_HIT_SIZE 8#define GNUTELLA_HIT_ATTACH(data, hit)                    \{                                                         \	memcpy(data,   &(hit->index), 4);                 \	memcpy(data+4, &(hit->size),  4);                 \	strncpy(data+8, hit->name, strlen(hit->name));    \} #define GNUTELLA_HIT_GRAB(hit, data)                      \{                                                         \	memcpy(&(hit->index), data,   4);                 \	memcpy(&(hit->size),  data+4, 4);                 \	hit->name = newtella_malloc(strlen(data+8)+1);    \	strncpy(hit->name, data+8, strlen(data+8));       \}struct gnutella_hits {	guint8  n;	guint16 port;	guint32 ip;	guint32 speed;	GList  *rset;	struct gnutella_extended_qhd *qhd;};#define GN_HITS_SIZE 11#define GNUTELLA_HITS_ATTACH(data, hits)                 \{                                                        \	data[0] = hits->n;                               \	memcpy(data+1, &(hits->port),  2);               \	memcpy(data+3, &(hits->ip),    4);               \	memcpy(data+7, &(hits->speed), 4);               \}#define GNUTELLA_HITS_GRAB(hits, data)                   \{                                                        \	hits->n = data[0];                               \	memcpy(&(hits->port),  data+1, 2);               \	memcpy(&(hits->ip),    data+3, 4);               \	memcpy(&(hits->speed), data+7, 4);               \}struct gnutella_push {	gchar   guid[GUID_LEN];	guint32 index;	guint32 ip;	guint16 port;};#define GN_PUSH_SIZE 26#define GNUTELLA_PUSH_ATTACH(data, push)                \{                                                       \	guidcpy(data, push->guid);                      \	memcpy(data+GUID_LEN,   &(push->index), 4);     \	memcpy(data+GUID_LEN+4, &(push->ip),    4);     \	memcpy(data+GUID_LEN+8, &(push->port),  2);     \}#define GNUTELLA_PUSH_GRAB(push, data)                  \{                                                       \	guidcpy(push->guid, data);                      \	memcpy(&(push->index), data+GUID_LEN,   4);     \	memcpy(&(push->ip),    data+GUID_LEN+4, 4);     \	memcpy(&(push->port),  data+GUID_LEN+8, 2);     \}struct squery {	gchar  *keyword;	gchar   guid[GUID_LEN];	gchar   alive;	guint16 rs; };gint gnutella_send_ping(struct newtella_connection *con, gint wake_up);gint gnutella_send_pong(struct newtella_connection *con, gchar *guid, guint8 ttl);gint gnutella_send_cached_host(struct newtella_connection *con, struct host_info *host);gint gnutella_send_query(struct squery *query, struct newtella_connection *con, gint broadcast);gint gnutella_send_push(struct newtella_connection *dcon);gint gnutella_send_query_response(struct newtella_connection *con, GList *found_hits, gchar *guid);gchar *translate_vendor_id(gchar *vid);gint   rate_result_set(gint rs, gchar *open_data_byte, gchar *vendor);#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -