亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? nut-route.c

?? Serveez是一個服務器框架
?? C
字號:
/* * nut-route.c - gnutella routing table implementation * * Copyright (C) 2000 Stefan Jahn <stefan@lkcc.org> * * This 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, or (at your option) * any later version. *  * This software 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 package; see the file COPYING.  If not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA.   * * $Id: nut-route.c,v 1.19 2001/08/01 10:16:23 ela Exp $ * */#if HAVE_CONFIG_H# include <config.h>#endif#if ENABLE_GNUTELLA#define _GNU_SOURCE#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#ifdef __MINGW32__# include <winsock2.h>#endif#include "libserveez.h"#include "gnutella.h"#include "nut-route.h"#include "nut-core.h"/* * This function canonizes gnutella queries. Thus we prevent the network * from unpatient users and often repeated queries. */static intnut_canonize_query (nut_config_t *cfg, char *query){  char *key, *p, *extract;  time_t t;  int ret = 0;  /* not a valid query ? */  if (!*query)    return -1;  /* extract alphanumerics only and pack them together as lowercase */  key = extract = p = svz_strdup (query);  while (*p)    {      if (isalnum ((svz_uint8_t) *p)) 	*extract++ = (char) (isupper ((svz_uint8_t) *p) ? 			     tolower ((svz_uint8_t) *p) : *p);      p++;    }  *extract = '\0';  /* check if it is in the recent query hash */  if ((t = (time_t) (long) svz_hash_get (cfg->query, key)) != 0)    {      if (time (NULL) - t < NUT_QUERY_TOO_RECENT)	{#if ENABLE_DEBUG	  svz_log (LOG_DEBUG, "nut: dropping too recent query\n");#endif	  ret = -1;	}    }  /* put the query extraction to the recent query hash */  else    {      t = time (NULL);      svz_hash_put (cfg->query, key, (void *) ((long) t));    }  svz_free (key);  return ret;}/* * Gnutella packet validation. This is absolutely necessary. It protects  * the local client as well as offer an additional line of defense against  * broadcasting spam to other connections. Return values: *  1 = packet ok *  0 = packet is dropped, but can be processed * -1 = invalid packet, do not process at all */intnut_validate_packet (svz_socket_t *sock, nut_header_t *hdr, 		     svz_uint8_t *packet){  nut_config_t *cfg = sock->cfg;  nut_client_t *client = sock->data;#if 0  fprintf (stdout, "validating packet 0x%02X (%s)\n", 	   hdr->function, nut_print_guid (hdr->id));#endif /* 1 */  /* Packet size validation */  switch (hdr->function)    {      /* Ping */    case NUT_PING_REQ:      if (hdr->length != 0)	{#if ENABLE_DEBUG	  svz_log (LOG_DEBUG, "nut: invalid ping payload\n");#endif	  return -1;	}      break;      /* Pong */    case NUT_PING_ACK:      if (hdr->length != SIZEOF_NUT_PONG)	{#if ENABLE_DEBUG	  svz_log (LOG_DEBUG, "nut: invalid pong payload\n");#endif	  return -1;	}      break;      /* Push Request */    case NUT_PUSH_REQ:      if (hdr->length != SIZEOF_NUT_PUSH)	{#if ENABLE_DEBUG	  svz_log (LOG_DEBUG, "nut: invalid push request payload\n");#endif	  return -1;	}      break;      /* Query */    case NUT_SEARCH_REQ:      if (hdr->length > 257)	{#if ENABLE_DEBUG	  svz_log (LOG_DEBUG, "nut: payload of query too big\n");#endif	  return -1;	}      if (nut_canonize_query (cfg, (char *) packet + SIZEOF_NUT_QUERY) == -1)	return -1;      break;      /* Query hits */    case NUT_SEARCH_ACK:      if (hdr->length > (SIZEOF_NUT_RECORD + 256) * 256)	{#if ENABLE_DEBUG	  svz_log (LOG_DEBUG, "nut: payload of query hits too big\n");#endif	  return -1;	}      break;      /* Invalid */    default:#if ENABLE_DEBUG      svz_log (LOG_DEBUG, "nut: invalid request 0x%02X\n", hdr->function);#endif      if (client->invalid++ > NUT_INVALID_PACKETS)	svz_sock_schedule_for_shutdown (sock);      return -1;    }  /* Hops and TTLs */  if (hdr->ttl <= 1)    {#if ENABLE_DEBUG      svz_log (LOG_DEBUG, "nut: packet died (zero TTL)\n", hdr->function);#endif      return 0;    }  hdr->hop++;  hdr->ttl--;  if (hdr->hop > cfg->max_ttl)    {#if ENABLE_DEBUG      svz_log (LOG_DEBUG, "nut: packet died (HOP > MaxTTL)\n",	       hdr->function); #endif      return 0;    }  if (hdr->ttl > 50)    {#if ENABLE_DEBUG      svz_log (LOG_DEBUG, "nut: packet dropped (TTL > 50)\n");#endif      return 0;    }  if (hdr->ttl > cfg->max_ttl)    {#if ENABLE_DEBUG      svz_log (LOG_DEBUG, "nut: decreasing packet TTL (%d -> %d)\n",	       hdr->ttl, cfg->max_ttl);#endif      hdr->ttl = (svz_uint8_t) cfg->max_ttl;    }  if (hdr->ttl + hdr->hop > cfg->max_ttl)    {#if ENABLE_DEBUG      svz_log (LOG_DEBUG, "nut: decreasing packet TTL (%d -> %d)\n",	       hdr->ttl, cfg->max_ttl - hdr->hop);#endif      hdr->ttl = (svz_uint8_t) (cfg->max_ttl - hdr->hop);    }  return 1;}/* * This is the routing routine for any incoming gnutella packet. * It return non-zero on routing errors and packet death. Otherwise * zero. */intnut_route (svz_socket_t *sock, nut_header_t *hdr, svz_uint8_t *packet){  nut_config_t *cfg = sock->cfg;  nut_packet_t *pkt;  svz_socket_t *xsock;  svz_socket_t **conn;  svz_uint8_t *header;  int n;  /* packet validation */  if ((n = nut_validate_packet (sock, hdr, packet)) == -1)    return -1;  else if (n == 0)    return 0;  /* route replies here */  if (hdr->function & 0x01)    {      /* is the GUID in the routing hash ? */      xsock = (svz_socket_t *) svz_hash_get (cfg->route, (char *) hdr->id);      if (xsock == NULL)	{	  pkt = (nut_packet_t *) svz_hash_get (cfg->packet, (char *) hdr->id);	  if (pkt == NULL)	    {	      svz_log (LOG_ERROR, "nut: error routing packet 0x%02X\n",		       hdr->function);	      cfg->errors++;	      return -1;	    }#if ENABLE_DEBUG	  svz_log (LOG_DEBUG, "nut: packet 0x%02X reply received\n",		   hdr->function);#endif	}      /* yes, send it to the connection the original query came from */      else	{	  /* try sending the header */	  header = nut_put_header (hdr);	  if (svz_sock_write (xsock, (char *) header, SIZEOF_NUT_HEADER) == -1)	    {	      svz_sock_schedule_for_shutdown (xsock);	      return 0;	    }	  /* send the packet body if necessary */	  if (hdr->length)	    {	      if (svz_sock_write (xsock, (char *) packet, hdr->length) == -1)		{		  svz_sock_schedule_for_shutdown (xsock);		  return 0;		}	    }	}    }  /*    * route queries here (hdr->function & 0x01 == 0x00), push request    * will be handle later.   */  else if (hdr->function != NUT_PUSH_REQ)    {      /* check if this query has been seen already */      xsock = (svz_socket_t *) svz_hash_get (cfg->route, (char *) hdr->id);      if (xsock != NULL)	{#if ENABLE_DEBUG	  svz_log (LOG_DEBUG, "nut: dropping duplicate packet 0x%02X\n",		   hdr->function);#endif	  return -1;	}      /* check if this query has been sent by ourselves */      pkt = (nut_packet_t *) svz_hash_get (cfg->packet, (char *) hdr->id);      if (pkt != NULL)	{#if ENABLE_DEBUG	  svz_log (LOG_DEBUG, "nut: dropping native packet 0x%02X\n",		   hdr->function);#endif	  return -1;	}      /* add the query to routing table */      svz_hash_put (cfg->route, (char *) hdr->id, sock);      /*        * Forward this query to all connections except the connection       * the server got it from.       */      if ((conn = (svz_socket_t **) svz_hash_values (cfg->conn)) != NULL)	{	  header = nut_put_header (hdr);	  for (n = 0; n < svz_hash_size (cfg->conn); n++)	    {	      xsock = conn[n];	      if (xsock == sock)		continue;	      if (svz_sock_write (xsock, (char *) header, 				  SIZEOF_NUT_HEADER) == -1)		{		  svz_sock_schedule_for_shutdown (xsock);		  svz_hash_xfree (conn);		  return 0;		}	      if (hdr->length)		{		  if (svz_sock_write (xsock, (char *) packet, 				      hdr->length) == -1)		    {		      svz_sock_schedule_for_shutdown (xsock);		      svz_hash_xfree (conn);		      return 0;		    }		}	    }	  svz_hash_xfree (conn);	}    }  return 0;}#else /* ENABLE_GNUTELLA */int nut_route_dummy; /* Shut compiler warnings up. */#endif /* not ENABLE_GNUTELLA */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日本一区二区在线观看| 自拍av一区二区三区| 欧美精品123区| 欧美色视频在线| 欧美色成人综合| 欧美高清一级片在线| 欧美视频在线一区二区三区| 欧美少妇一区二区| 欧美国产精品劲爆| 国产视频一区二区在线| 国产欧美日韩不卡免费| 国产精品女同一区二区三区| 国产精品网站一区| 国产精品久久久久9999吃药| 国产精品午夜在线| **网站欧美大片在线观看| 国产精品久久久99| 一区二区三区在线观看动漫| 亚洲一区二区三区四区在线观看| 亚洲高清不卡在线观看| 日韩成人dvd| 韩国v欧美v日本v亚洲v| 国产suv精品一区二区6| www.亚洲国产| 精品污污网站免费看| 91精品国产色综合久久不卡电影 | 精品99一区二区| 久久久精品2019中文字幕之3| 国产亚洲人成网站| 亚洲免费伊人电影| 日韩精品电影在线| 国内精品视频一区二区三区八戒| 国产精品综合av一区二区国产馆| 成人综合婷婷国产精品久久蜜臀 | 69久久夜色精品国产69蝌蚪网| 欧美一区永久视频免费观看| 久久久久久久久一| 亚洲男人电影天堂| 看国产成人h片视频| 成人综合在线观看| 欧美人与z0zoxxxx视频| 久久综合给合久久狠狠狠97色69| 国产精品九色蝌蚪自拍| 亚洲123区在线观看| 国产精品99久久不卡二区| 色噜噜狠狠色综合欧洲selulu| 欧美一区二区三区啪啪| 中文字幕一区二区在线播放| 91亚洲男人天堂| 欧美高清视频一二三区| 国产精品久久午夜| 日韩一区精品视频| 9i在线看片成人免费| 日韩一区二区三免费高清| 国产精品蜜臀在线观看| 日韩中文字幕av电影| 成人永久aaa| 欧美一区二区三区在线视频| 中文字幕在线观看一区二区| 秋霞电影网一区二区| 99久久久精品| 精品福利av导航| 亚洲成人免费视频| 99久久精品免费观看| 日韩精品中文字幕一区二区三区| 综合久久给合久久狠狠狠97色| 麻豆成人91精品二区三区| 91久久精品国产91性色tv| 久久精品夜夜夜夜久久| 日韩av中文字幕一区二区 | 欧美日韩一区中文字幕| 中文字幕欧美三区| 精品影院一区二区久久久| 欧美日韩一区视频| 亚洲天堂久久久久久久| 国产一区美女在线| 欧美一级日韩一级| 亚洲午夜视频在线| 91色在线porny| 久久99久久99| 欧美性色黄大片| 日韩理论片一区二区| 国产精品亚洲一区二区三区妖精 | 韩国一区二区三区| 777a∨成人精品桃花网| 亚洲欧美一区二区久久| 国产成人免费视频一区| 日韩精品一区二区三区中文不卡| 洋洋av久久久久久久一区| 99久久99久久精品国产片果冻| 精品国产乱码久久久久久夜甘婷婷| 亚洲高清久久久| 欧美亚男人的天堂| 亚洲一线二线三线久久久| 91影院在线免费观看| 国产精品久久久久久福利一牛影视| 国产一区二区视频在线| 精品国产91乱码一区二区三区| 日韩黄色免费网站| 欧美精品aⅴ在线视频| 性感美女极品91精品| 欧美日韩在线播放三区四区| 亚洲午夜视频在线| 精品1区2区3区| 丝袜美腿亚洲一区| 91麻豆精品国产91久久久资源速度| 亚洲一卡二卡三卡四卡无卡久久| 一本一本大道香蕉久在线精品| 亚洲欧洲色图综合| 91丨九色丨国产丨porny| 中文字幕五月欧美| 色天天综合色天天久久| 亚洲资源在线观看| 欧美高清激情brazzers| 日韩在线一区二区三区| 日韩一级成人av| 国产一区二区中文字幕| 国产亚洲一区二区三区四区 | 日本韩国视频一区二区| 亚洲综合激情小说| 欧美高清精品3d| 久草精品在线观看| 国产精品私人自拍| 色噜噜狠狠色综合欧洲selulu| 亚洲国产一区二区在线播放| 洋洋av久久久久久久一区| 色婷婷综合视频在线观看| 亚洲一级二级在线| 欧美岛国在线观看| 高清久久久久久| 亚洲免费观看高清完整版在线| 欧美性高清videossexo| 日本亚洲一区二区| 国产午夜精品福利| 91麻豆精东视频| 秋霞电影网一区二区| 久久精品人人做| 在线精品国精品国产尤物884a| 午夜av一区二区| 久久久国产一区二区三区四区小说| 成人免费va视频| 亚洲成a人在线观看| 久久尤物电影视频在线观看| 成人av资源在线| 天天av天天翘天天综合网| 精品国产欧美一区二区| 91在线精品秘密一区二区| 天天做天天摸天天爽国产一区 | 国产视频在线观看一区二区三区| 99re6这里只有精品视频在线观看| 午夜精品久久久久影视| 国产亚洲欧美一区在线观看| 色播五月激情综合网| 精品夜夜嗨av一区二区三区| 亚洲三级在线看| 精品国免费一区二区三区| 91女神在线视频| 久久99精品久久久久| 亚洲中国最大av网站| 久久精品人人做| 777xxx欧美| 一本久久a久久精品亚洲| 久久精品99国产国产精| 亚洲免费av高清| 久久女同精品一区二区| 欧美日韩亚洲高清一区二区| 国产成人福利片| 日韩高清电影一区| 亚洲码国产岛国毛片在线| 免费成人在线观看| 亚洲丝袜另类动漫二区| www日韩大片| 欧美精品乱码久久久久久按摩 | 91在线高清观看| 国产自产高清不卡| 视频一区中文字幕| 亚洲天堂2014| 日本一区二区久久| 欧美tickling挠脚心丨vk| 欧美在线不卡视频| 97精品国产97久久久久久久久久久久| 精品系列免费在线观看| 日韩精品免费专区| 亚洲午夜激情av| 亚洲男人电影天堂| 中文字幕在线不卡视频| 久久精品男人天堂av| 精品欧美一区二区在线观看| 欧美疯狂做受xxxx富婆| 91成人网在线| 色综合激情五月| 972aa.com艺术欧美| 丁香激情综合国产| 国产传媒日韩欧美成人| 久久99国产精品久久99果冻传媒| 视频精品一区二区| 午夜久久久久久久久久一区二区| 一区二区三区欧美| 亚洲精品成人在线| 一区二区国产视频|