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


Delphi-Quelltext
1:
name : TSockAddr;                    

muß es


Delphi-Quelltext
1:
name : PSockAddr;                    

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