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