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

📄 messages.cs

📁 P2P (peer to peer) file sharing program in C#. Supports Gnutella, Gnutella2, eDonkey, and OpenNap. w
💻 CS
字号:
// Messages.cs// Copyright (C) 2002 Matt Zyzik (www.FileScope.com)// // 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  USAusing System;namespace FileScope.OpenNap{	/// <summary>	/// This class is used for handling all messages.	/// </summary>	public class Messages	{		/// <summary>		/// Incoming error message.		/// </summary>		public static void Error(Packet packet, int sockNum)		{			System.Diagnostics.Debug.WriteLine("error: "+packet.payload);			GUIBridge.OMessage(sockNum, "error: "+packet.payload);			if(packet.payload.IndexOf("server is full") != -1)				Sck.scks[sockNum].Disconnect();		}		/// <summary>		/// Incoming login confirmation.		/// </summary>		public static void LoginAck(Packet packet, int sockNum)		{			System.Diagnostics.Debug.WriteLine("login ack: "+packet.payload);			ServerStats(sockNum);			NotifySharedFiles(sockNum);		}		/// <summary>		/// Incoming search response.		/// </summary>		public static void SearchResponse(Packet packet, int sockNum)		{			//System.Diagnostics.Debug.WriteLine("search response: "+packet.payload);			//parse results; we only want the first 7 parameters			try			{				int afterFilenameIndex = packet.payload.LastIndexOf("\"") + 2;				string takenOutFilename = packet.payload.Substring(afterFilenameIndex, packet.payload.Length - afterFilenameIndex);				string filename = packet.payload.Substring(1, afterFilenameIndex-3);				string[] msgs = new string[8];//md5, size, bitrate, frequency, length, nick, ip, link-type				char[] delimeters = new char[1]{' '};				msgs = takenOutFilename.Split(delimeters, 8);				string[] appendix = msgs[7].Split(delimeters);				msgs[7] = appendix[0];				//convert from hz to kHz				msgs[3] = Convert.ToString((Math.Round(Convert.ToDouble(msgs[3]) / 1024)));				QueryHitObject qho = new QueryHitObject();				qho.networkType = NetworkType.OpenNap;				qho.extensions = new string[0];				qho.fileIndex = 0;				qho.filePath = filename;				qho.fileName = System.IO.Path.GetFileName(filename);				qho.fileSize = Convert.ToUInt32(msgs[1]);				qho.ip = msgs[5];				qho.port = -1;				qho.sockWhereFrom = sockNum;				qho.nick = Sck.scks[sockNum].nick;				switch(Convert.ToInt32(msgs[7]))				{					case 0:						qho.speed = 10;						break;					case 1:						qho.speed = 2;						break;					case 2:						qho.speed = 3;						break;					case 3:						qho.speed = 3;						break;					case 4:						qho.speed = 4;						break;					case 5:						qho.speed = 10;						break;					case 6:						qho.speed = 22;						break;					case 7:						qho.speed = 100;						break;					case 8:						qho.speed = 100;						break;					case 9:						qho.speed = 1500;						break;					case 10:						qho.speed = 55000;						break;					default:						System.Diagnostics.Debug.WriteLine("yeah this shouldn't have happened (link-type)");						qho.speed = 10;						break;				}				qho.unseenHosts = 0;				qho.vendor = "OpenNap";				qho.xml = "";				QueryHitTable table = new QueryHitTable();				table.address = msgs[5];				table.busy = false;				table.chat = false;				table.unseenHosts = 0;				table.mp3info = msgs[2] + " kbps " + msgs[3] + " kHz " + Utils.TimeFormatFromSeconds(Convert.ToInt32(msgs[4]));				table.push = false;				table.speed = qho.speed;				table.type = QHOStuff.GetType(qho);				table.sha1 = "";				table.queryHitObjects.Add(qho);				//this might not be a search response to the user's query... but a response to a ReQuery made by the ReQuery class				foreach(DownloadManager dmer in DownloadManager.dms)					if(dmer != null)						if(dmer.active)						{							if(((Downloader)dmer.downloaders[0]).qho.fileSize == qho.fileSize)								if(QHOStuff.Match2(((Downloader)dmer.downloaders[0]).qho.fileName, qho.fileName))								{									//System.Diagnostics.Debug.WriteLine("opennap match found");									if(((Downloader)dmer.downloaders[0]).state == DLState.CouldNotConnect || ((Downloader)dmer.downloaders[0]).state == DLState.Waiting)									{										Download(qho);										//add the qho if we don't know about it										foreach(QueryHitObject elQhO in ((Downloader)dmer.downloaders[0]).otroQHOs)											if(elQhO.ip == qho.ip)												return;										qho.fileName = ((Downloader)dmer.downloaders[0]).qho.fileName;										((Downloader)dmer.downloaders[0]).otroQHOs.Add(qho);									}									return;								}						}				//find the appropriate ActiveSearch this search response corresponds to				lock(ActiveSearch.searches)					foreach(ActiveSearch search in ActiveSearch.searches)						if(Match(filename.ToLower(), search.query.ToLower()) && search.guid != "stopped")						{							//same method as in Gnutella							GUIBridge.AddQueryHit(qho, table, ref search.query);							return;						}			}			catch			{				System.Diagnostics.Debug.WriteLine("opennap messages search response error");			}		}		static bool Match(string filename, string query)		{			string[] keywords = Keywords.GetKeywords(query);			foreach(string word in keywords)				if(filename.IndexOf(word) == -1)					return false;			return true;		}		/// <summary>		/// Incoming queue limit message.		/// </summary>		public static void QueueLimit(Packet packet, int sockNum)		{			try			{				//System.Diagnostics.Debug.WriteLine("Queue: "+packet.payload);				string elpay = packet.payload;				string elnick = elpay.Substring(0, elpay.IndexOf("\"")-1);				string elfinm = elpay.Substring(elpay.IndexOf("\"")+1, elpay.LastIndexOf("\"") - elpay.IndexOf("\"")-1);				//find matching download				foreach(DownloadManager dmer in DownloadManager.dms)					if(dmer != null)						if(dmer.active)							if(System.IO.Path.GetFileName(elfinm) == ((Downloader)dmer.downloaders[0]).qho.fileName)								if(elnick == ((Downloader)dmer.downloaders[0]).qho.ip)								{									((Downloader)dmer.downloaders[0]).state = DLState.Waiting;									return;								}			}			catch			{				System.Diagnostics.Debug.WriteLine("opennap messages Queue Limit");			}		}		/// <summary>		/// Incoming message of the day.		/// </summary>		public static void MOD(Packet packet, int sockNum)		{			System.Diagnostics.Debug.WriteLine("MOD: "+packet.payload);			GUIBridge.OMessage(sockNum, "MOD: "+packet.payload);		}		/// <summary>		/// Incoming general 404 error.		/// </summary>		public static void Error404(Packet packet, int sockNum)		{			System.Diagnostics.Debug.WriteLine("error: "+packet.payload);			GUIBridge.OMessage(sockNum, "error: "+packet.payload);		}		/// <summary>		/// Incoming download response.		/// </summary>		public static void DownloadAck(Packet packet, int sockNum)		{			System.Diagnostics.Debug.WriteLine("download ack: "+packet.payload);			try			{				string payload = packet.payload;				string filename = payload.Substring(payload.IndexOf("\"") + 1, payload.LastIndexOf("\"") - payload.IndexOf("\"") - 1);				string rest = payload.Substring(0, payload.IndexOf("\"") - 1);				char[] delimeters = new char[1]{' '};				string[] msgs = rest.Split(delimeters, 3);				string nick = msgs[0];				long ip = Convert.ToInt64(msgs[1]);				int port = (int)Convert.ToUInt16(msgs[2]);				//find corresponding download				for(int x = 0; x < DownloadManager.dms.Length; x++)				{					if(DownloadManager.dms[x] == null)						continue;					if(!DownloadManager.dms[x].active)						continue;					Downloader elDLer = (Downloader)DownloadManager.dms[x].downloaders[0];					//normal					if(elDLer.qho.filePath == filename && elDLer.qho.ip == nick && elDLer.state == DLState.Connecting)					{						elDLer.qho.port = (int)port;						elDLer.qho.longIP = ip;						elDLer.Reset();						return;					}					//through requery algorithm					if(elDLer.state == DLState.CouldNotConnect || elDLer.state == DLState.Waiting)					{						//find matching nick and filename						foreach(QueryHitObject elqHo in elDLer.otroQHOs)							if(elqHo.filePath == filename && elqHo.ip == nick)							{								elDLer.qho = elqHo;								elDLer.qho.port = (int)port;								elDLer.qho.longIP = ip;								elDLer.Reset();								return;							}					}				}			}			catch			{				System.Diagnostics.Debug.WriteLine("opennap messages DownloadAck");			}		}		/// <summary>		/// Incoming server stats response.		/// </summary>		public static void ServerStatsResponse(Packet packet, int sockNum)		{			System.Diagnostics.Debug.WriteLine("server stats response: "+packet.payload);			try			{				//parse the server stats response: [users][#files][size]				string[] msgs = new string[3];				char[] delimeters = new char[1]{' '};				msgs = packet.payload.Split(delimeters, 3);				GUIBridge.OUpdateStats(sockNum, msgs[0], msgs[1], msgs[2]);			}			catch			{				System.Diagnostics.Debug.WriteLine("opennap messages ServerStatsResponse");			}		}		/// <summary>		/// Incoming response to one of our Resume Requests.		/// </summary>		public static void ResumeRequestResponse(Packet packet, int sockNum)		{			//servers stopped implementing this			System.Diagnostics.Debug.WriteLine("resume request response: "+packet.payload);		}		/// <summary>		/// Incoming request for an upload of one of our files.		/// </summary>		public static void UploadRequest(Packet packet, int sockNum)		{			System.Diagnostics.Debug.WriteLine("upload request: "+packet.packet);			if(packet.payload.Length > 2)			{				if(!packet.payload.EndsWith("\""))					packet.payload = packet.payload.Substring(0, packet.payload.Length-2);				AcceptUpload(sockNum, ref packet.payload);			}		}		/// <summary>		/// Outgoing login.		/// </summary>		public static void Login(int sockNum)		{			//generate random username/password			int num1 = GUID.rand.Next(10, 1000000);			int num2 = GUID.rand.Next(10, 1000000);			//generate login text			string login = "scope"+num1.ToString()+" scope"+num2.ToString()+" "+Stats.settings.port.ToString()+" \"Napster 2.0 Beta 8\" 7";			//create and send packet			Packet packet = new Packet(login.Length, 2, login);			Sck.scks[sockNum].SendPacket(packet);			Sck.scks[sockNum].nick = "scope"+num1.ToString();		}		/// <summary>		/// Outgoing broadcast search.		/// </summary>		public static void Search(string query)		{			string payload = "FILENAME CONTAINS \"" + query + "\"";			//create packet			Packet packet = new Packet(payload.Length, 200, payload);			//loop through all connected sockets			foreach(Sck obj in Sck.scks)				if(obj != null)					if(obj.state == Condition.Connected)						obj.SendPacket(packet);		}		/// <summary>		/// Outgoing download request.		/// </summary>		public static void Download(QueryHitObject qho)		{			string payload = qho.ip + " \"" + qho.filePath + "\"";			Packet packet = new Packet(payload.Length, 203, payload);			Sck.scks[qho.sockWhereFrom].SendPacket(packet);		}		/// <summary>		/// Allows for the download to be pushed.		/// </summary>		public static void AlternateDownloadRequest(QueryHitObject qho)		{			string payload = qho.ip + " \"" + qho.filePath + "\"";			Packet packet = new Packet(payload.Length, 500, payload);			Sck.scks[qho.sockWhereFrom].SendPacket(packet);		}		/// <summary>		/// Outgoing server stats request.		/// </summary>		public static void ServerStats(int sockNum)		{			//no payload			Packet packet = new Packet(0, 214, "");			Sck.scks[sockNum].SendPacket(packet);		}		/// <summary>		/// Outgoing client notification of shared files.		/// </summary>		public static void NotifySharedFiles(int sockNum)		{			//we won't send over 100 shared file notifications			for(int x = 0; x < 100; x++)			{				if(Stats.fileList.Count == x)					return;				string payload = "\"" + System.IO.Path.GetFileName(((FileObject)Stats.fileList[x]).location) + "\"" + " 00000000000000000000000000000000 " + ((FileObject)Stats.fileList[x]).b.ToString();				Packet packet = new Packet(payload.Length, 100, payload);				Sck.scks[sockNum].SendPacket(packet);			}		}		/// <summary>		/// Accept the request for an upload from the server.		/// </summary>		public static void AcceptUpload(int sockNum, ref string payload)		{			System.Diagnostics.Debug.WriteLine("Accepting Upload: "+payload);			Packet packet = new Packet(payload.Length, 608, payload);			Sck.scks[sockNum].SendPacket(packet);		}	}}

⌨️ 快捷键说明

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