📄 messages.cs
字号:
} //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 + -