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

📄 route.c

📁 linux下支持P2P的客户端程序,采用了Gnutella的方法,其中有实现Gnutella的具体源码,是一个基于p2p环境下的音乐共享软件,有助于对P2P的研究
💻 C
字号:
/*-*-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 */#include <string.h>#include "route.h"#include "memory.h"#include "connection.h"#include "gnutella.h"int route_msg_add(struct message *rmsg, gchar *dataload){	struct message *msg;	gchar *data;	if (g_slist_length(rmessages) == ROUTE_CACHE_SIZE) {		msg = (struct message *) rmessages->data;		rmessages = g_slist_remove(rmessages, msg);		newtella_free(msg->head);		newtella_free(msg);	}		rmsg->head->ttl--;	rmsg->head->hops++;	/* attach header to msg */	data = newtella_malloc(rmsg->length);		GNUTELLA_HDR_ATTACH(data, rmsg->head);	if (dataload) 		memcpy(data+GN_HEADER_SIZE, dataload, rmsg->head->length);		switch (rmsg->policy) {	case RP_ALL:		con_send_to_all(data, rmsg->length, 1);		break;	case RP_ONLY_TO:		con_send_packet(rmsg->con, 				data, rmsg->length, 1);		break;	case RP_ALL_EXC:		con_send_ex_one(rmsg->con, 				data, rmsg->length, 1);		break;	default:		break;	}		rmessages = g_slist_append(rmessages, rmsg);	newtella_free(data);	return 1;}struct message *route_msg_find(gchar *mguid, gnutella_function f, gint len){	GSList *l;	struct message *msg;	for (l = rmessages; l; l = l->next) {		msg = (struct message *) l->data;				if (guidcmp(msg->head->guid, mguid) && (msg->head->f == f)) {			if (!len || (msg->head->length == len))				return msg;					}	}		return NULL;}struct message *route_msg_rs_find(gchar *pguid){	/* finds a result set type of message	   based on the guid used for push.	*/	GSList *l;	struct message *msg;	for (l = rmessages; l; l = l->next) {		msg = (struct message *) l->data;				if (msg->head->f != GNUTELLA_INITRESPONSE) 			continue;		else {			if (guidcmp(pguid, msg->guid))				return msg;		}	}	return NULL;}/* debug */int route_msg_dump(struct message *msg){	g_print("Route: f: %d ttl: %d hops: %d length: %d\n",		msg->head->f,		msg->head->ttl,		msg->head->hops,		msg->head->length);	return 1;}int route_table_dump(void){	GSList *l;	struct message *msg;		for (l = rmessages; l; l = l->next) {		msg = (struct message *) l->data;		g_print("----\n");		guiddump(msg->head->guid);		g_print("----\n");	}		return 1;}

⌨️ 快捷键说明

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