Autor |
Beitrag |
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Mo 22.10.18 11:23
Ein freundliches Hallo an alle,
mal wieder eine Pointerfrage. Oder ist es der Ansistring?
Ich habe mit Hilfe von Beispielen zum Teil in C eine Funktion geschrieben, die den Computernamen zurückgeben soll. Die stürzt aber hin und wieder ab. Ich habe bisher nicht herausfinden können, ob es ein Pointerproblem oder der Ansistring ist. Debuggen ist schwierig, da der Fehler nur gelegentlich auftritt. Ich hoffe jemand hat einen Tipp.
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:
| function T_TcpServer.GetClientName( I : Integer; var E : String ): String; var name : TSockAddr; Host : PHostEnt ; L : Integer ;
begin E := '' ; Result := '' ; L := SizeOf( name ); E := 'Conn' ; if oSock[ I ].Conn then begin FillChar ( name, L, #0 ) ; name.sin_family := AF_INET ; name.sin_port := oPortNr ; E := 'getpeername' ; iRes := getpeername( oSock[ I ].Sock, name, L ); if iRes = 0 then begin try E := 'gethostbyaddr'; Host := gethostbyaddr( @name.sin_addr, SizeOf( name.sin_addr ), AF_INET ); E := 'host^'; Result := host^.h_name; except end; end; E := ''; end; end; |
Die Variable E dient nur zum lokalisieren des Fehlers und zeigt "Result := host^.h_name;" als Ursache an.
Die Deklaration in der Winsock.pas:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| type PHostEnt = ^THostEnt; {$EXTERNALSYM hostent} hostent = record h_name: PChar; h_aliases: ^PChar; h_addrtype: Smallint; h_length: Smallint; case Byte of 0: (h_addr_list: ^PChar); 1: (h_addr: ^PChar) end; THostEnt = hostent; |
Grüße von der sonnigen Nordsee
Peter
Moderiert von Narses: Titel korrigiert.
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mo 22.10.18 11:40
Ändere deinen Except-Block mal so:
Delphi-Quelltext 1: 2: 3: 4:
| except on E:Exception do E := E.Message; end; |
Dann sollte in E stehen, welchen Fehler du hast.
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Mo 22.10.18 13:12
Hallo jasocul,
dank Dir für die Anregung. Wenn man so etwas bei der Delphi 4 Hilfe sucht ist es ein Zufall, wenn man es findet. Irgendwann hatte ich so etwas schon mal gefunden, aber ich finde es nicht wieder.
Bin mal auf das Ergebnis gespannt, wie gesagt, das kann dauern.
Grüße von der immer noch sonnigen Nordsee
Peter
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 22.10.18 17:16
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Sinspin
Beiträge: 1334
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Di 23.10.18 08:21
Peter18 hat folgendes geschrieben : | ... Wenn man so etwas bei der Delphi 4 Hilfe sucht ist es ein Zufall ... |
Delphi 4!
Embarcadero hat endlich etwas schon viele Jahre überfälliges getan und eine Community Version herausgebracht. Dies ist die neuste Version in vollem Umfang!
Soweit du nicht wegen alter Componenten (ohne source code), die du dringend brauchst, an der alten Version festhängst würde ich umsteigen. Dazwischen liegen Welten!
Die Version kann in beschränktem Umfang kommerziell verwendet werden.
Was du alleine von Delphi Seite an Funktionen dazu bekommst ist es Wert und du bekommst Programme die für die aktuellen Systeme erstellt worden sind und nicht für Windows 3.1!
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Di 23.10.18 11:21
Hallo Stefan,
Dank Dir für Deinen Hinweis. Hast Du einen Link? Bei Embarcadero habe ich nichts gefunden. Manches verstecken die gern.
Ich habe schon Berlin und Tokio ausprobiert, aber die laufen nicht unter XP. Win 10 macht mir noch zu viel Probleme. Plötzlich geht mein Grafiktablett nicht mehr, oder die Netzwerkanmeldung funktioniert nur nach Lust und Laune. (Nach der Neuinstallation [Platte kaput] war noch alles gut, aber dann kam ein Update.)
Grüße von der verregneten und stürmischen Nordsee
Peter
|
|
Sinspin
Beiträge: 1334
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Di 23.10.18 12:57
Die Community Version wird auf Win XP auch nicht laufen.
Du kannst es aber mal mit Lazarus (Free Pascal) probieren. Das sollte Dir vom Gefühl her auch mehr wie D4 vorkommen, dabei ist es modern und sehr flexibel.
Ich nutze es für Programme mit extremen Anforderungen an Speicher und CPU.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Di 23.10.18 14:57
Hallo Stefan,
nochmals Dank. Es hat sehr viel Ähnlichkeit mit Delphi4, aber massenweise Objekte. Leider habe ich bei Delphi4 schon etliche Objekte an meinen Bedarf angepasst und um Eigenschaften und Methoden erweitert. Ich fürchte ich kann es nur als Referenz verwenden, wenn ich mein Projekt nicht komplett neu anfangen will. Vielleicht gibt es ja eine Funktion, die das gleiche tut wie "T_TcpServer.GetClientName".
Grüße von der sehr feuchten Nordsee
Peter
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Di 23.10.18 16:03
Hallo Stefan,
Da steckt ja eine Menge drinn. Ich habe aber noch nichts gefunden um einen einfachen Server und Client für Tcp/IP zu bauen. Hast Du einen Tip, wo sich die Sachen verstecken, oder ein Beispiel?
Grüße von der noch immer verregneten und stürmischen Nordsee
Peter
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 23.10.18 16:55
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Sinspin
Beiträge: 1334
Erhaltene Danke: 118
Win 10
RIO, CE, Lazarus
|
Verfasst: Mi 24.10.18 11:34
Peter18 hat folgendes geschrieben : | Da steckt ja eine Menge drinn. Ich habe aber noch nichts gefunden um einen einfachen Server und Client für Tcp/IP zu bauen. |
Freepascal hat eine gute Community und zahlreiche Samples zu den verschiedenen Komponenten. Ich habe bisher noch nix mit Netzwerkzugriff gemacht. Aber Synapse bietet Komponenten die viel referenziert werden wenn es um Netzwerkzugriff geht.
Frühlingsrolle hat folgendes geschrieben : | Hm, statt auf den "Fehler" einzugehen, ist man nun der Auffassung, dass dieser durch eine modernere Entwicklungsumgebung zu umgehen ist?! |
Ich denke schon. Mit einer neueren Entwicklungsumgebung sind solche fehleranfälligen Konstrukte seltener nötig da dann genau die von Dir angesprochene Windowsfunktion schon fertig deklariert ist.
Ich glaube nicht das es die in D4 schon gibt.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Mi 24.10.18 14:24
Hallo Frühlingsrolle, hallo Stefan,
Dank Euch für Eure Antworten.
Frühlingsrolle hat folgendes geschrieben : | Hm, statt auf den "Fehler" einzugehen, ist man nun der Auffassung, dass dieser durch eine modernere Entwicklungsumgebung zu umgehen ist?!
Sowas muss ich nicht verstehen. |
Typischer Fall von Denkste! Stefan hat insovern recht, dass dort solche Fehler vermiden werden können, aber es kommt mir darauf an, dort den richtigen Weg zu den Schnittstellen zu finden und dann in meine Software zu übernehmen! Wie bereits bemerkt müßte ich alle geänderten Objekte prüfen, wenn ich auf einen anderen Compiler umsteige, aber abgucken ist hier erlaubt (um zu verstehen)!!
Frühlingsrolle hat folgendes geschrieben : | Und auf die Frage, ob es eine ähnliche Funktion dazu gibt - Ja. Sie wurde verlinkt. |
????????????????????????????????????????????????????????????????????
Inzwischen stürzt das Programm anscheinend an anderer Stelle ab, aber ich forsche weiter!
Noch mal die Pointerfrage: "host^.h_name" steht in der Function, aber "host.h_name" liefert das selbe Ergebnis. Doch was ist richtig oder ist das egal??
PChar kann anscheinend ohne Probleme einem String zugewiesen werden.
Stefan Dank Dir für den Link, da habe ich viel zu lesen.
Grüße von der bewölkten Nordsee
Peter
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 24.10.18 17:36
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Fr 26.10.18 14:50
Hallo Frühlingsrolle,
nochmals Dank für Deine Antwort, aber Frühlingsrolle hat folgendes geschrieben : | Neues Delphi, hin oder her ist Quatsch. |
ist leider Falsch!
Da meine Delphi-Version viele Schnittstellen nicht enhält wie z.B. TAPI, MAPI und auch TCP/IP, muß ich die Deklarationen selbst erstellen! Da kann eine neue Version, die diese Deklarationen enthält, schon sehr hilfreich sein. Damit gibt es auch keine vordefinierten Schnittstellen, die ich nutzen könnte!
Frühlingsrolle hat folgendes geschrieben : | denn sie benötigt als ersten Parameter eine Variabel vom Typ SOCKET bzw. TSocket |
ist mit "name : TSockAddr;" deklariert.
Frühlingsrolle hat folgendes geschrieben : | Dafür gibt es schon eine Funktion namens GetComputerName(). |
Die liefert Zitat: | Retrieves the NetBIOS name of the local computer. This name is established at system startup, when the system reads it from the registry. |
also den Namen des Rechners auf dem das Programm läuft und nicht den Namen des Rechners im Netz, der sich mit "T_TcpServer" verbinden will!
Da aber nun der Fehler öfter auftritt kann ich nun meine Frage selbst beantworten:
"host^.h_name" und "host.h_name" liefern beide das gleiche Ergebnis! Demnach ist die Dereferenzierung nicht unbedingt nötig.
"getpeername" liefert bei manchen Sockets den Wert 0 zurück, "gethostbyaddr" aber NIL. Warum konnte ich noch nicht feststellen, da das nicht regelmäßig geschieht. Daher ist
Delphi-Quelltext 1:
| if Assigned( host ) then Result := host^.h_name; |
angebracht.
Grüße von der verregneten Nordsee
Peter
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 26.10.18 18:06
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
Peter18
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Sa 27.10.18 10:30
Hallo Frühlingsrolle,
ich weiß nicht, was Du hier mit mir diskutieren willst!
Frühlingsrolle hat folgendes geschrieben : | Die Frage ist überhaupt, ob du das alles wirklich brauchst? |
Wieso diese Frage????? Wenn ich mich damit beschäftige werde ich sie wohl brauchen und sei es auch nur um zu lernen!!
Du wirst vielleicht erstaunt sein, aber nach "Running the Winsock Client and Server Code Sample" habe ich meine "T_TCPIP" entwickelt und dazu die "winsock.pas" studiert. Aber dennoch brauchte ich eine "winsock2.pas". Ich will aber nicht diesen Teil meiner Software diskutieren, ohne weitere Deteils zu diesem Thema ist das fruchtlos! Ich hatte einen seltenen Absturz und deshalb gefragt, ob die Zuweisung von PChar zu String und der Pointer korrekt ist!
Frühlingsrolle hat folgendes geschrieben : | Wenn getpeername() den Wert 0 liefert, dann war der Aufruf erfolgreich.
Wenn gethostbyaddr() den Wert nil liefert, dann war der Aufruf NICHT erfolgreich. |
Welch Abgrund an Weisheit! Ich war davon ausgegangen, dass ein fehlerfreier Aufruf von "getpeername" auch einen gültigen Pointer bei "gethostbyaddr" zur Folge hat, was ich aber jetzt revidieren konnte!
Sicher sind noch weitere Fehler in meiner Software, aber Fehler sind dazu da, um aus ihnen zu lernen. Im Moment scheint sich ein Fehler in der Tapi abzuzeichnen, aber den muß ich erst noch einkreisen.
Für den Link "Windows Sockets Error Codes" meinen Dank, ich weiß nicht, ob ich den schon in meiner Linksammlung habe. Wenn nicht werde ich ihn hinzufügen.
Grüße von der sonnigen Nordsee
Peter
|
|