Autor Beitrag
Peter18
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: Di 09.06.15 13:16 
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:
ausblenden 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;

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
function gethostbyaddr(addr: Pointer; len, Struct: Integer): PHostEnt; stdcall;					


Das heißt statt

ausblenden Delphi-Quelltext
1:
name : TSockAddr;					

muß es

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 489
Erhaltene Danke: 2


Delphi4
BeitragVerfasst: 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!

ausblenden 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