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

📄 messages.cs

📁 P2P (peer to peer) file sharing program in C#. Supports Gnutella, Gnutella2, eDonkey, and OpenNap. w
💻 CS
📖 第 1 页 / 共 3 页
字号:
				}				//make qho				QueryHitObject qho = new QueryHitObject();				if(bitrate > 0)				{					qho.extensions = new string[]{bitrate.ToString() + " kbps  "};					if(length != "")						qho.extensions[0] += length.Replace(" ", "");				}				qho.fileIndex = 0;				qho.fileName = name;				qho.fileSize = size;				qho.ip = Endian.BigEndianIP(pckt.payload, clientIDoffset);				qho.md4sum = bytesHash;				qho.networkType = NetworkType.EDonkey;				qho.port = port;				qho.sockWhereFrom = sockNum;				qho.speed = 20;				qho.unseenHosts = (int)sources;				qho.vendor = "eDonkey";				//find the appropriate ActiveSearch this search response corresponds to				lock(ActiveSearch.searches)					foreach(ActiveSearch search in ActiveSearch.searches)						if((Match(name.ToLower(), search.query.ToLower()) || ActiveSearch.searches.Count == 1) && search.guid != "stopped")						{							//same method as in Gnutella							GUIBridge.AddQueryHit(qho, null, ref search.query);							break;						}			}		}		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 sources for a file hash.		/// </summary>		public static void FoundSources(byte[] msg, int start, int sockNum)		{			byte[] md4sum = new byte[16];			Array.Copy(msg, start, md4sum, 0, 16);			string hexmd4sum = Utils.HexGuid(md4sum);			int numServers = msg[start+16];			for(int x = 0; x < numServers; x++)			{				int offset = start + 17 + (x * 6);				string ip = Endian.BigEndianIP(msg, offset);				ushort port = Endian.ToUInt16(msg, offset+4, false);				ReQuery.EDonkeyFoundSource(ref hexmd4sum, ref ip, port, numServers, sockNum);			}		}		/// <summary>		/// Incoming request for a callback connection.		/// </summary>		public static void CallbackRequest(Packet pckt, int sockNum)		{			//System.Diagnostics.Debug.WriteLine("eDonkey Callback Requested");			//process it			string ip = Endian.BigEndianIP(pckt.payload, 1);			//System.Diagnostics.Debug.WriteLine("ed2k callback ip: " + ip);			ushort port = Endian.ToUInt16(pckt.payload, 5, false);			//first see if it's for a download			foreach(DownloadManager dMEr in DownloadManager.dms)				if(dMEr != null)					if(dMEr.active)						foreach(Downloader dler in dMEr.downloaders)						{							//if(dler.qho.ip == ip)							//	System.Diagnostics.Debug.WriteLine("ed2k callback download found");							if(dler.qho.ip == ip && dler.queueState != 0 && dler.qho.networkType == NetworkType.EDonkey)							{								lock(dMEr.endpoints)								{									//System.Diagnostics.Debug.WriteLine("callbacking to: " + dler.qho.ip);									dler.lastMessage = "Callbacking";									dler.state = DLState.Waiting;									dler.count = 1;								}							}						}		}		/// <summary>		/// Incoming info that our callback failed.		/// </summary>		public static void CallbackRequestFailed(Packet pckt, int sockNum)		{			//System.Diagnostics.Debug.WriteLine("eDonkey CallbackRequestFailed");		}		/// <summary>		/// Incoming client hello message.		/// </summary>		public static void ClientHello(Packet pckt, int sockNum)		{			byte[] clientHash = new byte[16];			Array.Copy(pckt.payload, 2, clientHash, 0, 16);			//uint clientID = Endian.ToUInt32(pckt.payload, 18, false);			//ushort port = Endian.ToUInt16(pckt.payload, 22, false);			uint metaCount = Endian.ToUInt32(pckt.payload, 24, false);			//if(metaCount > 0)			//{			//	System.Diagnostics.Debug.WriteLine("ClientHello metaCount: " + metaCount.ToString());			//}			//send our response			HelloResponse(sockNum, Endian.BigEndianIP(pckt.payload, 18));		}		/// <summary>		/// Incoming client hello response message.		/// </summary>		public static void ClientHelloResponse(Packet pckt, int sockNum)		{			byte[] clientHash = new byte[16];			Array.Copy(pckt.payload, 1, clientHash, 0, 16);			uint clientID = Endian.ToUInt32(pckt.payload, 17, false);			ushort port = Endian.ToUInt16(pckt.payload, 21, false);			uint metaCount = Endian.ToUInt32(pckt.payload, 23, false);			if(metaCount > 0)			{				//System.Diagnostics.Debug.WriteLine("ClientHelloResponse metacount: " + metaCount.ToString());			}			//let the downloader know that we're good			int dmNum = Sck.scks[sockNum].dmNum;			int dlNum = Sck.scks[sockNum].dlNum;			if(dmNum == -1 && dlNum == -1)				return;			if(DownloadManager.dms[dmNum] != null)				if(DownloadManager.dms[dmNum].downloaders[dlNum] != null)				{					if(((Downloader)DownloadManager.dms[dmNum].downloaders[dlNum]).queueState == 0)						((Downloader)DownloadManager.dms[dmNum].downloaders[dlNum]).EDonkeyReady();				}		}		/// <summary>		/// Incoming file request.		/// </summary>		public static void FileRequest(Packet pckt, int sockNum)		{			//System.Diagnostics.Debug.WriteLine("in ed2k FileRequest " + Sck.scks[sockNum].RemoteIP());			string filename = "";			byte[] hash = new byte[16];			Array.Copy(pckt.payload, 1, hash, 0, 16);			foreach(FileObject fo in Stats.fileList)				if(Utils.SameArray(fo.md4, hash))				{					filename = Path.GetFileName(fo.location);					lastRequestedFO = fo;					FileRequestAnswer(sockNum, true, hash, ref filename);					return;				}			FileRequestAnswer(sockNum, false, hash, ref filename);		}		/// <summary>		/// Incoming response to our file request.		/// </summary>		public static void FileRequestAnswer(Packet pckt, int sockNum, bool good)		{			int dmNum = Sck.scks[sockNum].dmNum;			int dlNum = Sck.scks[sockNum].dlNum;			if(DownloadManager.dms[dmNum] != null)				if(DownloadManager.dms[dmNum].downloaders[dlNum] != null)					((Downloader)DownloadManager.dms[dmNum].downloaders[dlNum]).EDonkeyStage1(good);		}		/// <summary>		/// Incoming file part completion status request.		/// </summary>		public static void FileStatusRequest(Packet pckt, int sockNum)		{			//System.Diagnostics.Debug.WriteLine("in ed2k FileStatusRequest");			byte[] hash = new byte[16];			Array.Copy(pckt.payload, 1, hash, 0, 16);			if(lastRequestedFO != null)				if(Utils.SameArray(hash, lastRequestedFO.md4))					goto found;			foreach(FileObject fo in Stats.fileList)				if(Utils.SameArray(fo.md4, hash))				{					lastRequestedFO = fo;					goto found;				}			return;			found:				FileStatusResponse(sockNum);		}		/// <summary>		/// Incoming status for file parts.		/// </summary>		public static void FileStatusResponse(Packet pckt, int sockNum)		{			int offset = 17;			int count = Endian.ToUInt16(pckt.payload, offset, false);			offset += 2;			byte[] vals = new byte[count];			int actCount = 0;			while(actCount != count)			{				for(int y = 0; y < 8; y++)				{					vals[actCount] = (((pckt.payload[offset]>>y) & 0x01) == 0x01) ? (byte)1 : (byte)0;					actCount++;					if(actCount == count)						break;				}				offset += 1;			}			int dmNum = Sck.scks[sockNum].dmNum;			int dlNum = Sck.scks[sockNum].dlNum;			if(DownloadManager.dms[dmNum] != null)				if(DownloadManager.dms[dmNum].downloaders[dlNum] != null)					((Downloader)DownloadManager.dms[dmNum].downloaders[dlNum]).EDonkeyStage2(vals);		}		/// <summary>		/// Incoming hash set request.		/// </summary>		public static void HashSetRequest(Packet pckt, int sockNum)		{			//System.Diagnostics.Debug.WriteLine("in ed2k HashSetRequest");			byte[] hash = new byte[16];			Array.Copy(pckt.payload, 1, hash, 0, 16);			if(lastRequestedFO != null)				if(Utils.SameArray(hash, lastRequestedFO.md4))					goto found;			foreach(FileObject fo in Stats.fileList)				if(Utils.SameArray(fo.md4, hash))				{					lastRequestedFO = fo;					goto found;				}			return;			found:				HashSetResponse(sockNum);		}		/// <summary>		/// Incoming hash set response... contains hash values for the file parts.		/// </summary>		public static void HashSetResponse(Packet pckt, int sockNum)		{			int dmNum = Sck.scks[sockNum].dmNum;			int dlNum = Sck.scks[sockNum].dlNum;			if(DownloadManager.dms[dmNum] != null)				if(DownloadManager.dms[dmNum].downloaders[dlNum] != null)					((Downloader)DownloadManager.dms[dmNum].downloaders[dlNum]).EDonkeyStage3();		}		/// <summary>		/// Incoming message asking for a slot for an upload.		/// </summary>		public static void SlotRequest(Packet pckt, int sockNum)		{			//System.Diagnostics.Debug.WriteLine("SlotRequest in haus");			if(Stats.Updated.uploadsNow < Stats.settings.maxUploads)				SlotGiven(sockNum);			else				Sck.scks[sockNum].Disconnect("no slot");		}		/// <summary>		/// Incoming message indicating an open or closed slot.		/// </summary>		public static void SlotResponse(Packet pckt, int sockNum)		{			//System.Diagnostics.Debug.WriteLine("SLOT GIVEN");			int dmNum = Sck.scks[sockNum].dmNum;			int dlNum = Sck.scks[sockNum].dlNum;			if(dmNum == -1 && dlNum == -1)				System.Diagnostics.Debug.WriteLine("couldn't find DLer for the SlotResponse");			else			{				if(DownloadManager.dms[dmNum] != null)					if(DownloadManager.dms[dmNum].downloaders[dlNum] != null)						((Downloader)DownloadManager.dms[dmNum].downloaders[dlNum]).EDonkeyStage4();			}		}		/// <summary>		/// Incoming message informing us that the host doesn't want a queue slot anymore.		/// </summary>		public static void SlotRelease(Packet pckt, int sockNum)		{			//		}		/// <summary>		/// Incoming request for the file upload.		/// </summary>		public static void RequestParts(Packet pckt, int sockNum)		{			//System.Diagnostics.Debug.WriteLine("edonkey upload started");			if(Sck.scks[sockNum].upNum != -1)				return;			//0 is type			//1-16 is hash			byte[] md4hash = new byte[16];			Array.Copy(pckt.payload, 1, md4hash, 0, 16);			//17-20 is start			uint start = Endian.ToUInt32(pckt.payload, 17, false);			//21-24 is 2nd start			//25-28 is 3rd start			//29-32 is stop			uint stop = Endian.ToUInt32(pckt.payload, 29, false);			//33-36 is 2nd stop			//37-40 is 3rd stop			UploadManager.IncomingEdSck(md4hash, start, stop, sockNum);		}		/// <summary>		/// Incoming request for the file upload to terminate.		/// </summary>		public static void EndOfDownload(Packet pckt, int sockNum)		{			Sck.scks[sockNum].Disconnect("eod");		}		/// <summary>		/// Incoming finish to a transfer chunk.		/// We'll inform the downloader, and if the file is not done, it'll request more parts.		/// </summary>		public static void SendPartFinished(int sockNum)		{			/*			int dmNum = Sck.scks[sockNum].dmNum;			int dlNum = Sck.scks[sockNum].dlNum;			if(DownloadManager.dms[dmNum] != null)				if(DownloadManager.dms[dmNum].downloaders[dlNum] != null)					((Downloader)DownloadManager.dms[dmNum].downloaders[dlNum]).Disconnect("ed2k part finished");			*/		}		/// <summary>		/// Incoming request to see what files we're sharing.		/// </summary>		public static void ViewFiles(int sockNum)		{			SendClientFiles(sockNum);		}		/// <summary>		/// Incoming request about the queue state for an item we're hosting.		/// </summary>		public static void QueueStateCheck(System.Net.EndPoint ep, byte[] msg)		{			//		}		/// <summary>		/// Incoming response informing us about our queued item.		/// </summary>		public static void QueueStateInfo(System.Net.EndPoint ep, byte[] msg)		{			//System.Diagnostics.Debug.WriteLine("alddfjowijef: " + ep.ToString());		}		/// <summary>		/// Outgoing login message.		/// Could be a hello to server, but also to client.		/// </summary>		public static void Login(int sockNum)		{			MemoryStream ms = new MemoryStream();			//type			ms.WriteByte(0x01);			if(!Sck.scks[sockNum].server)				ms.WriteByte(0x10);			//client info			Routines.ClientInfo(ms);			//server address			if(!Sck.scks[sockNum].server)			{				if(Sck.scks[sockNum].dlNum == -1 && Sck.scks[sockNum].dmNum == -1)				{					ms.Write(Endian.GetBytes((uint)0, false), 0, 4);					ms.Write(Endian.GetBytes((ushort)0, false), 0, 2);				}				else				{					int dmNum = Sck.scks[sockNum].dmNum;					int dlNum = Sck.scks[sockNum].dlNum;					//we want the uploader to be able to send us a callback through a server					if(DownloadManager.dms[dmNum] != null)						if(DownloadManager.dms[dmNum].downloaders[dlNum] != null)						{							int servSockNum = ((Downloader)DownloadManager.dms[dmNum].downloaders[dlNum]).qho.sockWhereFrom;							if(servSockNum != -1)								if(Sck.scks[servSockNum] != null)									if(Sck.scks[servSockNum].state == Condition.Connected)									{										byte[] addr = Endian.BigEndianIP(Sck.scks[servSockNum].address);										if(addr.Length != 4)

⌨️ 快捷键说明

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