Autor |
Beitrag |
Xelos
      
Beiträge: 21
|
Verfasst: Fr 25.10.02 10:51
Hi,
ich möchte ein Proggi schreiben, welches die Server mit dem Port 4661 aus der server.met herrausfiltert und eine neue Server.met erstellt. (Wegen Portfreigaben des Router / LOW-ID).
Nun meine Fragen:
Weiss jemand, was diese Datei für ein Format hat?
ocbmaurice.dyndns.or.../server.met?download
Wie bekomme ich die eingelesen, so das man auch was mit anfangen kann *g*.
Wie kann man die wieder schreiben?
Ich hoffe mir kann jemand helfen, hab schon das halbe Web nach einer Beschreibung dafür durchsucht.
Thxi für die Mühe
Gruss
Xelos
|
|
mars
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: Sa 26.10.02 11:14
www.schrevel.com/edonkey/
da steht glaub ich alles, was du brauchst!!!
greets
|
|
Xelos 
      
Beiträge: 21
|
Verfasst: Sa 26.10.02 15:26
ja, da steht schon mal das Format
Und wie liest man sowas aus und schreibt es wieder?
Gruss
Xelos
|
|
DaFox
      
Beiträge: 189
|
Verfasst: So 27.10.02 02:35
Hi!
Diese Seite nimmt Dir doch schon die ganze Arbeit ab!!
Du packst also die ganzen Daten von der Seite in records und ab geht's...
Hier mal ein kleines Bsp. wie man den Header auslesen könnte:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| type TeDonkeyHeader = packed record Version: Byte; NumOfServers: LongWord; end;
procedure TForm1.Button1Click(Sender: TObject); var ServMetFileName: String; ServMet: TFileStream; eDonkeyHeader: TeDonkeyHeader; begin if OpenDialog.Execute then begin ServMetFileName := OpenDialog.FileName; ServMet := TFileStream.Create(ServMetFileName, fmOpenRead); ServMet.Seek(0, soFromBeginning); ServMet.Read(eDonkeyHeader, SizeOf(eDonkeyHeader)); ShowMessage('Version: ' + IntToStr(eDonkeyHeader.Version) + ' entspricht: $' + IntToHex(eDonkeyHeader.Version, 2)); ShowMessage('Number Of Servers: ' + IntToStr(eDonkeyHeader.NumOfServers)); ServMet.Free; end; end; |
Gruß,
Markus
|
|
Xelos 
      
Beiträge: 21
|
Verfasst: So 27.10.02 16:27
Schon mal Thxi, das hat mich schon ein ganzes Stück weitergebracht.
Nun schaffe ich es auch die erste ServerIP und den Port auszulesen.
Danach kommen aber diese Meta Tags. Da komm ich nicht weiter.
Wie kann man die handhaben?
Der Code sieht so aus im Moment:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46:
| type TeDonkeyHeader = packed record Version: Byte; NumOfServers: LongWord; end; type Teserver=packed record ip1:byte; ip2:byte; ip3:byte; ip4:byte; port:word; meta:longword; end;
procedure TForm1.Button1Click(Sender: TObject); var ServMetFileName: String; ServMet: TFileStream; eDonkeyHeader: TeDonkeyHeader; eserver:teserver; begin if OpenDialog1.Execute then begin ServMetFileName := OpenDialog1.FileName; ServMet := TFileStream.Create(ServMetFileName, fmOpenRead); ServMet.Seek(0, soFromBeginning); //header auslesen ServMet.Read(eDonkeyHeader, SizeOf(eDonkeyHeader)); ShowMessage('Version: ' + IntToStr(eDonkeyHeader.Version) + ' entspricht: $' + IntToHex(eDonkeyHeader.Version, 2)); ShowMessage('Number Of Servers: ' + IntToStr(eDonkeyHeader.NumOfServers)); //ersten Server auslesen servMet.read(eserver,SizeOf(eserver)); ShowMessage('serverip: ' + IntToStr(eserver.ip1)+'.'+IntToStr(eserver.ip2)+'.'+IntToStr(eserver.ip3)+'.'+IntToStr(eserver.ip4)); ShowMessage('serverport: ' + IntToStr(eserver.port)); ShowMessage('numberofmeta: ' + IntToStr(eserver.meta)); //zweiten Server auslesen (zum testen ob der erste komplett ausgelesen wurde) servMet.read(eserver,SizeOf(eserver)); ShowMessage('serverip: ' + IntToStr(eserver.ip1)+'.'+IntToStr(eserver.ip2)+'.'+IntToStr(eserver.ip3)+'.'+IntToStr(eserver.ip4)); ShowMessage('serverport: ' + IntToStr(eserver.port)); ShowMessage('numberofmeta: ' + IntToStr(eserver.meta));
ServMet.Free; end; end; |
Auf Hilfe hoffend *g*
Xelos
|
|
DaFox
      
Beiträge: 189
|
Verfasst: Mo 28.10.02 00:30
Hi.
Das Problem an der Sache (ich war wohl mit meinem 1. Post etwas zu voreilig  ) ist, dass der special tag nicht bekannt ist. Zumindest ist er auf der oben genannten Seite nicht vollständig!
Bei meinen Tests kamen aber so gut wie nur diese genannten special tags vor
Mit meinem Code wirst Du deshalb wohl nicht viel anfangen können. Ich poste in trotzdem mal:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97:
| type TeDonkeyHeader = packed record Version: Byte; NumOfServers: LongWord; end;
TeDonkeyServer = packed record IP: Array[0..3] of Byte; Port: Word; NumOfMetaTags: LongWord; end;
TeDonkeyMetaTagHeader = packed record TagType: Byte; NameLength: Word; NameValue: PChar; end;
TeDonkeyMetaTag2 = packed record ValueLength: Word; Value: PChar; end;
TeDonkeyMetaTag3 = packed record Value: LongWord; end;
TeDonkeyMetaTagSpecial = packed record NameValue1: String; NameValue11: String; NameValue13: Word; (*???*) end;
procedure TForm1.Button1Click(Sender: TObject); var ServMet: TFileStream; eDonkeyHeader: TeDonkeyHeader; eDonkeyServer: TeDonkeyServer; eDonkeyMetaTagHeader: TeDonkeyMetaTagHeader; eDonkeyMetaTag2: TeDonkeyMetaTag2; eDonkeyMetaTag3: TeDonkeyMetaTag3; // iNumOfServers: Integer; iNumOfMetaTags: Integer; begin if OpenDialog.Execute then begin ServMet := TFileStream.Create(OpenDialog.FileName, fmOpenRead); try ServMet.Seek(0, soFromBeginning); ServMet.Read(eDonkeyHeader, SizeOf(eDonkeyHeader)); ShowMessage('Version: ' + IntToStr(eDonkeyHeader.Version) + ' entspricht: $' + IntToHex(eDonkeyHeader.Version, 2)); ShowMessage('Number Of Servers: ' + IntToStr(eDonkeyHeader.NumOfServers)); // for iNumOfServers := 1 to eDonkeyHeader.NumOfServers do begin ServMet.Read(eDonkeyServer, SizeOf(eDonkeyServer)); ShowMessage('IP: ' + IntToStr(eDonkeyServer.IP[0]) + '.' + IntToStr(eDonkeyServer.IP[1]) + '.' + IntToStr(eDonkeyServer.IP[2]) + '.' + IntToStr(eDonkeyServer.IP[3])); ShowMessage('Port: ' + IntToStr(eDonkeyServer.Port)); ShowMessage('Number Of MetaTags: ' + IntToStr(eDonkeyServer.NumOfMetaTags)); for iNumOfMetaTags := 1 to eDonkeyServer.NumOfMetaTags do begin ServMet.Read(eDonkeyMetaTagHeader, SizeOf(Byte) + SizeOf(Word)); ShowMessage('Tag Type: ' + IntToStr(eDonkeyMetaTagHeader.TagType)); ShowMessage('Name Length: ' + IntToStr(eDonkeyMetaTagHeader.NameLength)); GetMem(eDonkeyMetaTagHeader.NameValue, eDonkeyMetaTagHeader.NameLength); ServMet.Read(eDonkeyMetaTagHeader.NameValue^, eDonkeyMetaTagHeader.NameLength); ShowMessage('Name Value: ' + eDonkeyMetaTagHeader.NameValue); // special tag if (eDonkeyMetaTagHeader.NameLength = 1) then begin ShowMessage('not yet implemented'); break; end else begin // tag type 2 if (eDonkeyMetaTagHeader.TagType = 2) then begin ServMet.Read(eDonkeyMetaTag2, SizeOf(Word)); ShowMessage('Value Length: ' + IntToStr(eDonkeyMetaTag2.ValueLength)); FreeMem(eDonkeyMetaTagHeader.NameValue); GetMem(eDonkeyMetaTag2.Value, eDonkeyMetaTag2.ValueLength); ServMet.Read(eDonkeyMetaTag2.Value^, eDonkeyMetaTag2.ValueLength); ShowMessage('Name Value: ' + eDonkeyMetaTag2.Value); FreeMem(eDonkeyMetaTag2.Value); end else // tag type 3 begin ServMet.Read(eDonkeyMetaTag3, SizeOf(eDonkeyMetaTag3)); ShowMessage('Value: ' + IntToStr(eDonkeyMetaTag3.Value)); end; end; end; end; finally ServMet.Free; end; end; end; |
Gruß,
Markus
PS: Vielleicht treibst Du ja die nötigen Informationen noch auf. Wenn Du sie hast kannst Dich ja mal bei mir melden. Vielen Dank im Voraus!
|
|
Xelos 
      
Beiträge: 21
|
Verfasst: Mo 28.10.02 04:46
Wow, erstmal danke, das du dich damit überhaupt beschäftigst. Ist ja doch schon ein richtiges Projekt geworden und nicht nur eine kleine Hilfe.
Ich habe folgenden QBasic Code gefunden, der es tatsächlich schafft, eine Server.met auszulesen. Wenn man nun QBasic kann (was ich nicht so hinbekomme) dann könnte man das portieren.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109:
| DECLARE FUNCTION int2str$ (var!) DECLARE FUNCTION getByte! () DECLARE SUB readServers ()
DIM SHARED longer AS LONG DIM SHARED cases$(20) DIM SHARED pref$(20) DIM SHARED serverCount, servers, readCount AS DOUBLE
FOR i = 1 TO 20: cases$(i) = "n/a": NEXT
cases$(1) = "name":cases$(11) = "desc":cases$(12) = "ping":cases$(13) = "hist":cases$(14) = "pref":cases$(15) = "port":cases$(16) = "IP" pref$(0) = "normal":pref$(1) = "high":pref$(2) = "low"
CLS
PRINT :PRINT :PRINT "goto the directory where the server.met is located":PRINT "then enter 'exit' to begin":SHELL OPEN "SERVER.MET" FOR BINARY LOCK READ AS #1
IF (getByte <> 14) THEN PRINT "invalid header !!!": END END IF
servers = getByte + getByte * 256 + getByte * 256 ^ 2 PRINT : PRINT "found " + int2str(servers) + " edonkey2000 servers": PRINT : PRINT "press any key to begin server listening"
DO: LOOP WHILE INKEY$ = ""
CLS : readCount = 5
FOR serverCount = 1 TO servers readServers NEXT
CLOSE
FUNCTION getByte
DIM tmp AS STRING * 1
readCount = readCount + 1 GET 1, readCount, tmp
getByte = ASC(tmp)
END FUNCTION
FUNCTION int2str$ (var) int2str = LTRIM$(RTRIM$(STR$(var)))
END FUNCTION
SUB readServers
serverIP$ = int2str(getByte) + "." + int2str(getByte) + "." + int2str(getByte) + "." + int2str(getByte) serverPORT$ = int2str(getByte + getByte * 256)
PRINT : PRINT : PRINT "server (" + int2str(serverCount) + "/" + int2str(servers) + ") : " + serverIP$ + ":" + serverPORT$: PRINT : PRINT
servertags = getByte + getByte * 256 + getByte * 256 ^ 2 + getByte * 256 ^ 3
FOR tagcount = 1 TO servertags PRINT int2str(tagcount) + " -> ";
varmode = getByte length = getByte + getByte * 256
IF length > 1 THEN tag$ = "'" FOR i = 1 TO length tag$ = tag$ + CHR$(getByte) NEXT tag$ = tag$ + "'" ELSE dummy = getByte tag$ = STRING$(ABS(LEN(LTRIM$(RTRIM$(STR$(dummy)))) - 2), "0") + LTRIM$(RTRIM$(STR$(dummy))) + ">" + cases$(dummy) END IF
SELECT CASE varmode CASE 2 length = getByte + getByte * 256 value$ = "'" FOR i = 1 TO length value$ = value$ + CHR$(getByte) NEXT value$ = value$ + "'"
CASE 3 SELECT CASE dummy CASE 14 value$ = CHR$(34) + pref$(getByte + getByte * 256 + getByte * 256 ^ 2 + getByte ^ 3) + CHR$(34) CASE 16 value$ = CHR$(34) + int2str(getByte) + "." + int2str(getByte) + "." + int2str(getByte) + "." + int2str(getByte) + CHR$(34) CASE ELSE longer = getByte + getByte * 256 + getByte * 256 ^ 2 + getByte ^ 3 value$ = LTRIM$(RTRIM$(STR$(longer))) END SELECT END SELECT
PRINT " value for tag " + tag$ + STRING$(8 - LEN(tag$), " ") + "is " + value$ NEXT
PRINT : PRINT : PRINT "press any key to show next server" DO: LOOP WHILE INKEY$ = "" CLS
END SUB |
Gruss
Xelos
|
|
DaFox
      
Beiträge: 189
|
Verfasst: Di 29.10.02 00:50
Okay, bin dran...
Gelernt aus dem Basiccode haben wir, dass es im Prinzip nur ein meta tag 2 und ein meta tag 3 gibt.
Damit scheint es auch zu funktionieren.
Gegen Wochenende werde ich dann hier den aktuellen Stand posten.
Mal schauen wie weit ich komme, habe momentan leider viel um die Ohren
Gruß,
Markus
|
|
Xelos 
      
Beiträge: 21
|
Verfasst: Di 29.10.02 07:54
|
|
DaFox
      
Beiträge: 189
|
Verfasst: Mi 30.10.02 18:59
Hi Xelos.
Aktueller Stand:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120:
| type TeDonkeyHeader = packed record Version: Byte; NumOfServers: LongWord; end;
TeDonkeyServer = packed record IP: Array[0..3] of Byte; Port: Word; NumOfMetaTags: LongWord; end;
TeDonkeyMetaTagHeader = packed record TagType: Byte; NameLength: Word; NameValue: String; end;
TeDonkeyMetaTag2 = packed record ValueLength: Word; Value: String; end;
TeDonkeyMetaTag3 = packed record Value: LongWord; end;
const TeDonkeyMetaTagSpecial: Array[0..21] of String = ('unknown', // 0x00 'Name', // 0x01 String 'Size', // 0x02 'MediaType', // 0x03 String (Audio, Video, Image, Pro, Doc, Col) 'Format', // 0x04 String (file extension) 'unknown', // 0x05 'unknown', // 0x06 'unknown', // 0x07 'Copied', // 0x08 'GapStart', // 0x09 Data keeps number of gap as string 'GapEnd', // 0x0A Data keeps number of gap as string 'Description', // 0x0B String 'Ping', // 0x0C 'Fail', // 0x0D 'Preference', // 0x0E 'Port', // 0x0F 'IP', // 0x10 'Version', // 0x11 'TempFile', // 0x12 String 'Priority', // 0x13 'Status', // 0x14 'Availability' // 0x15 ); TeDonkeyPreference: Array[0..2] of String = ('Normal', 'High', 'Low');
procedure TForm1.Button1Click(Sender: TObject); var ServMet: TFileStream; eDonkeyHeader: TeDonkeyHeader; eDonkeyServer: TeDonkeyServer; eDonkeyMetaTagHeader: TeDonkeyMetaTagHeader; eDonkeyMetaTag2: TeDonkeyMetaTag2; eDonkeyMetaTag3: TeDonkeyMetaTag3; iNumOfServers: Integer; iNumOfMetaTags: Integer; iSpecialTag: Byte; begin if OpenDialog.Execute then begin ServMet := TFileStream.Create(OpenDialog.FileName, fmOpenRead); try ServMet.Seek(0, soFromBeginning); ServMet.Read(eDonkeyHeader, SizeOf(eDonkeyHeader)); ShowMessage('Version: ' + IntToStr(eDonkeyHeader.Version) + ' entspricht: $' + IntToHex(eDonkeyHeader.Version, 2)); ShowMessage('Number Of Servers: ' + IntToStr(eDonkeyHeader.NumOfServers)); for iNumOfServers := 1 to eDonkeyHeader.NumOfServers do begin ServMet.Read(eDonkeyServer, SizeOf(eDonkeyServer)); ShowMessage('IP: ' + IntToStr(eDonkeyServer.IP[0]) + '.' + IntToStr(eDonkeyServer.IP[1]) + '.' + IntToStr(eDonkeyServer.IP[2]) + '.' + IntToStr(eDonkeyServer.IP[3])); ShowMessage('Port: ' + IntToStr(eDonkeyServer.Port)); for iNumOfMetaTags := 1 to eDonkeyServer.NumOfMetaTags do begin ServMet.Read(eDonkeyMetaTagHeader, SizeOf(Byte) + SizeOf(Word)); if eDonkeyMetaTagHeader.NameLength = 1 then // special tag begin ServMet.Read(iSpecialTag, SizeOf(iSpecialTag)); eDonkeyMetaTagHeader.NameValue := TeDonkeyMetaTagSpecial[iSpecialTag]; end else // string begin SetLength(eDonkeyMetaTagHeader.NameValue, eDonkeyMetaTagHeader.NameLength); ServMet.Read(eDonkeyMetaTagHeader.NameValue[1], eDonkeyMetaTagHeader.NameLength); end; // tag type 2 if (eDonkeyMetaTagHeader.TagType = 2) then begin ServMet.Read(eDonkeyMetaTag2, SizeOf(Word)); SetLength(eDonkeyMetaTag2.Value, eDonkeyMetaTag2.ValueLength); ServMet.Read(eDonkeyMetaTag2.Value[1], eDonkeyMetaTag2.ValueLength); ShowMessage(eDonkeyMetaTagHeader.NameValue + ': ' + eDonkeyMetaTag2.Value); end else // tag type 3 begin ServMet.Read(eDonkeyMetaTag3, SizeOf(eDonkeyMetaTag3)); if eDonkeyMetaTagHeader.NameValue = 'Preference' then begin ShowMessage(eDonkeyMetaTagHeader.NameValue + ': ' + TeDonkeyPreference[eDonkeyMetaTag3.Value]); end else begin ShowMessage(eDonkeyMetaTagHeader.NameValue + ': ' + IntToStr(eDonkeyMetaTag3.Value)); end; end; end; end; // EOF, if there's not a tail (28 unhandled bytes) finally ServMet.Free; end; end; end; |
Für die AboutBox (á la Internet Explorer): "Teile dieser Software basieren teilweise auf der Arbeit von yeahware software development"
Viel Spaß damit,
Markus
|
|
Xelos 
      
Beiträge: 21
|
Verfasst: Do 31.10.02 15:00
Vielen vielen Dank DaFox
Ich sehe es als keinesfalls selbstverständlich an, so eine Hilfe bekommen zu haben.
Das was du da ausgearbeitet hast ist echt enorm und hat dich sicherlich viel Zeit gekostet.
Schlichtweg bin ich einfach baff, das es noch solche Leute wie dich gibt, die einem richtig weiterhelfen.
Ich kann nur nochmal sagen: Vielen DANK  )
Gruss
Xelos
|
|
DaFox
      
Beiträge: 189
|
Verfasst: Do 31.10.02 22:14
Gerne geschehen. 
|
|
|