Entwickler-Ecke
Internet / Netzwerk - TCPIP Hostname Zufall??
Peter18 - Di 09.06.15 13:16
Titel: TCPIP Hostname Zufall??
Ein freundliches Hallo an alle,
wieder mal ein neues Problem: Nachdem alles scheinbar so gut funktioniert, taucht ein neues Problem auf. (Soll ja nicht langeilig werden.) Ich werte den Rechnernamen des Clients aus um die Zugangsberechtigung zu ermitteln. (Das ist offensichtlich notwendig, da "b0fd1200.bb.sky.com" versucht hat eine Verbindung aufzubauen.) Dabei zeigte es sich, dass öfter mal "localhost" als Clientname zurückgegeben wurde. Die IP-Adresse war aber immer korrekt. Ein Test auf verschiedenen Rechnern ergab, dass ich den Effeckt nicht einem der verschiedenen Virenscanner in dei Schuhe schieben kann, sondern das dieser Effekt scheinbar zufällig bei allen auftritt. Mit einer Ausnahme: Wenn Client und Server auf dem selben Rechner laufen ist der Rechnernamen immer richtig.
Liegt das nun an der Programmierung oder habe ich da einen Schritt zu wenig gemachr? Hier die beiden Routinen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| function T_TcpServer.GetClientIP( I : Integer ): String; var name : TSockAddr; L : Integer ;
begin L := SizeOf( name ); if oSock[ I ].Conn then begin iRes := getpeername( oSock[ I ].Sock, name, L ); Result := inet_ntoa(name.sin_addr); end; end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| function T_TcpServer.GetClientName( I : Integer ): String; var name : TSockAddr; Host : PHostEnt ; L : Integer ;
begin Result := ''; L := SizeOf( name ); if oSock[ I ].Conn then begin iRes := getpeername( oSock[ I ].Sock, name, L ); if iRes = 0 then begin Host := gethostbyaddr( @name.sin_addr, SizeOf( name.sin_addr ), AF_INET ); Result := host^.h_name; end; end; end; |
Die empfohlene Funktione "getnameinfo" ist nicht in der "Winsock.pas", daher habe ich "gethostbyaddr" verwendet. Doch wie kommt es, dass per "Zufall" immer mal "localhost" zurückgegeben wird?
Grüße von der sonnigen Nordsee
Peter
Peter18 - Fr 04.03.16 11:29
Ein freundliches Hallo an alle,
es scheint, als könne ich meine Frage inzwischen selbst beantworten.
Bei MS steht:
Zitat: |
struct hostent* FAR gethostbyaddr(
_In_ const char *addr,
_In_ int len,
_In_ int type
);
|
In der Winsock.pas steht:
Delphi-Quelltext
1:
| function gethostbyaddr(addr: Pointer; len, Struct: Integer): PHostEnt; stdcall; |
Das heißt statt
muß es
heißen! (PSockAddr : ^TSockAddr;)
Pointer unter Pascal, kein tiviales Thema.
Werde es Testen und in ein paar Tagen berichten.
Grüße von der Mordsee (Matula dreht in Cuxhaven)
Peter
Peter18 - Mi 13.12.17 12:49
Ein freundliches Hallo an alle,
ich glaube heute habe ich die Lösung selbst gefunden (durch ein anderes Beispiel).
"TSockAddr" muß vorbesetzt werden, damit die richtigen Wertr zurückgeliefert werden!
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| function T_TcpServer.GetClientName( I : Integer ): String; var name : TSockAddr; Host : PHostEnt ; L : Integer ;
begin Result := ''; L := SizeOf( name ); if oSock[ I ].Conn then begin FillChar ( name, L, #0 ) ; name.sin_family := AF_INET ; name.sin_port := StrToInt( oPort ) ; iRes := getpeername( oSock[ I ].Sock, name, L ); if iRes = 0 then begin Host := gethostbyaddr( @name.sin_addr, SizeOf( name.sin_addr ), AF_INET ); Result := host^.h_name; end; end; end; |
Grüße von der Nordsee
Peter
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!