Entwickler-Ecke

Internet / Netzwerk - Server-Namen ausgeben


testra - Fr 29.09.06 11:56
Titel: Server-Namen ausgeben
Hallo,

ich habe ein Problem bei Socket-Programmierung.
:shock:
mit Socket.RemoteHost oder Socket.LocalAdress wird vom Client localhost bzw. 127.0.0.1 ausgegeben ( bei ServerSocket - Events).

Bei ClientSocket - Events das gleiche.

Der Name des Rechners, der beim Server angemeldet ist wird auch ausgegeben.

Ich suche eine Funktion (Möglichkeit)dass den Name der Servers selbst ausgibt.


soisseteben - Fr 29.09.06 12:36

Hi,
das kann nur daran liegen, das du Server und Client auf ein und dem selben Rechner laufen lässt.

/EDIT: hab dich glaub ich falsch verstanden. Also, du bekommst doch bei einem ClientSocket-Event die Socket mitgeliefert. Willst du dir jetzt daraus den Namen des Servers ermitteln, kannst du das über:


Delphi-Quelltext
1:
(Socket as TClientSocket).RemoteHost                    


realisieren.

Hoffe jetzt liege ich richtig.


Narses - Fr 29.09.06 13:33

Moin!

Ich fasse mal zusammen, damit ich sicher bin, dass ich dich richtig verstanden habe:

Du hast einen Client, der verbindet sich zum Server und der Client soll den Computernamen (nicht den Hostnamen!) des Servers auslesen. Korrekt?

Das geht nicht mit den Eigenschaften/Methoden der Sockets, da diese Information nicht kommunikationsrelevant ist.

Deshalb mußt du einen Befehl vom Client an den Server senden, der vom Server verarbeitet wird (Computername lokal am Server auslesen) und das Ergebnis wieder an den Client senden.

Dazu wirst du vermutlich bereits ein Protokoll benötigen, nur so als Hinweis. ;)

cu
Narses


testra - Fr 29.09.06 15:49

Hi


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.ClientSocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
        //Edit13.Text:=ServerSocket1.Socket.RemoteAddress;
        Checkbox2.Checked:=true;
        Edit10.Text:=Socket.LocalAddress;
        Edit11.Text:=Socket.LocalHost;
        Memo2.Lines.Clear;
        edit7.Text:='';
        Button1.Enabled:=true;
        Edit13.Text:=Socket.RemoteAddress;

end;


genau hier dachte ich ,dass ich als RemoteAdress eher den Servernamen kriege, ich kriege aber nur localhost

Danke


Narses - Fr 29.09.06 16:11

Moin!

user profile icontestra hat folgendes geschrieben:
genau hier dachte ich ,dass ich als RemoteAdress eher den Servernamen kriege, ich kriege aber nur localhost

a) Wovon reden wir hier: Computername oder Hostname?
b) Wenn Server und Client auf der gleichen Maschine laufen, dann ist "localhost" völlig korrekt.
c) .RemoteHost liefert den Hostnamen, .RemoteAdress liefert die IP-Adresse.

Was genau willst du da nun eigentlich machen, bitte ausführliche Beschreibung unter sorgfältiger Verwendung der korrekten Begriffe, bitte! :D

cu
Narses


testra - Fr 29.09.06 16:15

^Hallo

ich will, den Computer-Namen ausgeben

und ich will, den Server-Namen ausgeben, der nicht auf der gleichen Maschine läuft :oops: .(Domain des Firmenservers z.b)


Narses - Fr 29.09.06 16:28

Moin!

Sorry, aber ich verstehe leider immer noch nicht, was dein Problem ist. Also rate ich mal:

Wenn du hier:

Delphi-Quelltext
1:
Edit13.Text := Socket.RemoteHost;                    

einträgst, dann ist das alles, was du über die Socket-Verbindung herausfinden kannst. Wenn da eine Adresse und kein Hostname steht, dann ist das DNS auf diesem Rechner nicht verfügbar oder der Rechner ist nicht registriert.

Wie weiter oben beschrieben: wenn du den Computernamen des Servers am Client brauchst, dann mußt du den Server anweisen diesen auszulesen und dem Client zu senden. Das geht aber nicht mit den Sockets, sondern mit der Win-API.

cu
Narses


testra - Fr 29.09.06 17:42

Hallo,

das hat mir schon einen schritt weitergeholfen, das mit der win-api. :les:

und ich habe die fkt. LookupAccountName gefunden. Ist eine win-api fkt.

würde es damit gehn? was müsste ich dazu einbinden(dll?)?


Narses - Sa 30.09.06 10:30

Moin!

user profile icontestra hat folgendes geschrieben:
und ich habe die fkt. LookupAccountName gefunden.
[...]
was müsste ich dazu einbinden(dll?)?

Ich dachte da eher an GetComputerName(). :? Kennt Delphi so, IMO.

user profile icontestra hat folgendes geschrieben:
würde es damit gehn?

Keine Ahnung, ich habe ja noch nicht wirklich verstanden, was du da eigentlich machen willst. Und da du dich auch standhaft weigerst, das brauchbar zu erklären, kann ich dir auch nicht anders helfen, als zu raten. :roll: ;)

Mach doch mal ein schönes, ausfürliches Beispiel, auch mit Wertebeispielen, hm? :D Und noch besser: du packst auch gleich deinen Code (komplett) dazu. ;)

cu
Narses


testra - So 01.10.06 12:46

Hi, :oops: :oops:
Zitat:
Keine Ahnung, ich habe ja noch nicht wirklich verstanden, was du da eigentlich machen willst.


ich dachte, das wäre inzwischen klar.

Ich habe in diversen tutorials gefunden, wie man einen chat bastelt, wie man den eigenen localhost ausgibt, auch den an den Firmenserver z.b. angemeldeten computernamen ausgibt, aber den namen des firmenservers z.b., bzw. die ip des firmenservers, wie man das ausgibt, habe ich nicht rausgefunden. Und genau das würde ich gerne wissen. Das war meine frage, ob es mit der win-api funktion geht.


Narses - Mo 02.10.06 00:05

Moin!

user profile icontestra hat folgendes geschrieben:
wie man den eigenen localhost ausgibt,

Hä? :nixweiss:
user profile icontestra hat folgendes geschrieben:
auch den an den Firmenserver z.b. angemeldeten computernamen ausgibt,

Hääää?!? :nixweiss:
user profile icontestra hat folgendes geschrieben:
aber den namen des firmenservers z.b.,

S.o., GetComputerName() auf dem Server ausführen. :?
user profile icontestra hat folgendes geschrieben:
bzw. die ip des firmenservers, wie man das ausgibt, habe ich nicht rausgefunden.

Vom Client aus: ClientSocket1.Socket.RemoteHost bzw. .RemoteAddress, hatte ich schon geschrieben. :?
user profile icontestra hat folgendes geschrieben:
Und genau das würde ich gerne wissen. Das war meine frage, ob es mit der win-api funktion geht.

Sorry, ich gebe jetzt auf, ich verstehe dich nicht, ich kapier´s einfach nicht... :shock: :hair:

Vielleicht versteht dich ja jemand anders oder du bringst es doch noch über´s Herz, eine brauchbare Problembeschreibung zu liefern (wenn du nicht weißt, wie du das Problem beschreiben sollst, dann mach doch mal ein Beispiel mit Werten, die aussagekräftig für die von dir gesuchten Werte stehen; und wenn du ganz große Langeweile hast, dann machst du auch noch ein Anwendungsbeispiel, das dein Konzept erläutert). :(

cu
Narses


testra - Mo 02.10.06 12:28

Hallo

es gibt ja unter der eingabeaufforderung die möglichkeit, mit ipconfig //all die mac-adresse rauszufinden, auch dhcp-server oder dns-server werden hier angezeigt. genau das, die dns-adresse brauche ich.

und darauf bezieht sich meine frage, ob das mit den socket-komp. geht und mit welcher funktion.

ich hoffe das war jetzt klar.... :oops:


Narses - Mo 02.10.06 12:34

Moin!

user profile icontestra hat folgendes geschrieben:
es gibt ja unter der eingabeaufforderung die möglichkeit, mit ipconfig //all die mac-adresse rauszufinden, auch dhcp-server oder dns-server werden hier angezeigt. genau das, die dns-adresse brauche ich.

und darauf bezieht sich meine frage, ob das mit den socket-komp. geht und mit welcher funktion.

Du willst die Adresse des DNS-Servers ermitteln?! :shock: Wozu soll das gut sein... :gruebel:

Aber egal, mit den Socket-Komponenten geht das jedenfalls nicht. Wenn du das über eine WinAPI lösen willst, dann schau mal nach IP-Helper-API im MSDN, ist aber schon nicht mehr so ganz einfach.

Deshalb: führ einfach den Kommandozeilenbefehl aus [http://www.delphi-library.de/viewtopic.php?p=385387#385387] und werte das Ergebnis aus. ;)

cu
Narses


testra - Mo 02.10.06 14:30

Hi,

ich weiss nicht ob das einfacher ist als das ganze mit der api-funktion zu machen,

denn über den ipconfig /all kann ich jetzt zumindest alles im memo-feld ausgeben, jedoch

müsste ich schon das, was ich brauche, also die dns nummer vom gesamten stream ausschneiden.

wie das wohl geht... :les:


Narses - Mo 02.10.06 14:37

Moin!

user profile icontestra hat folgendes geschrieben:
müsste ich schon das, was ich brauche, also die dns nummer vom gesamten stream ausschneiden.

wie das wohl geht... :les:

Du kennst das doch schon: ;)
Neue Frage -> neuer Thread. :mahn: :D


Aber, wenn ich ehrlich bin, entweder hast du überhaupt keine Ahnung von dem, was du da tust und du kannst einfach nicht beschreiben, was du wirklich willst (und deine Geheimniskrämerei ist dem nicht wirklich zuträglich; man muss dir ja die Infos aus der Nase popeln), oder du rennst aus den gleichen Gründen in eine total falsche Richtung... :nixweiss:

Und du bist sicher, dass ClientSocket1.Socket.RemoteHost im verbundenen Zustand nicht doch das liefert, was du haben willst (nämlich den voll qualifizierten Hostnamen, sofern dein DNS das korrekt zurücklifert)? Du kannst auch mal in einer Kommandozeile "nslookup x.x.x.x" eingeben, wobei du x.x.x.x durch die Server-IP ersetzt. Ist es das, was du rausfinden willst? :gruebel:

cu
Narses


testra - Mo 02.10.06 14:41

Hi,

genau das ist es! mit nslookup Server IP, bekomme ich in der kommandozeile den namen, den ich brauche ( es funzt!)

Mit ClientSocket1.Socket.RemoteHost im verbundenen Zustand leider nur localhost, also nicht die IP. :roll:


Narses - Mo 02.10.06 14:46

Moin!

user profile icontestra hat folgendes geschrieben:
Mit ClientSocket1.Socket.RemoteHost im verbundenen Zustand leider nur localhost, also nicht die IP. :roll:

Dann laufen Server und Client auf der gleichen Maschine, da ist das Verhalten auch völlig OK. Das klappt nur dann, wenn es ein anderer PC ist, mit dem du da verbunden bist. :roll: ;)

user profile icontestra hat folgendes geschrieben:
genau das ist es! mit nslookup Server IP, bekomme ich in der kommandozeile den namen, den ich brauche ( es funzt!)

Dachte ich´s mir doch. :D Wie oben gesagt, das klappt nur auf unterschiedlichen Maschinen. Ansonsten mach halt ein ReverseLookup mit GetNameByAddr, details in der WSA-Doku. ;)

cu
Narses


testra - Mo 02.10.06 14:51

ok werde gleich versuchen, :les:

bin dann

Danke


testra - Mi 04.10.06 12:48

MOin

ich habe es nun geschafft, den Servernamen mittels einer funktion (WSA Doku) zu kriegen (gethostbyname(hostname)). ich weiss aber nicht ( nur aus experimentierfreude ) ob das die sinnvollere methode ist, oder ob man mit Auslesen der Konsole ( mit nslookup kriegt man auch die Server-ip und namen ) oder vielleicht gar registry-eintrag auslesen, den Server-Namen erhalten sollte.

Danke


Narses - Mi 04.10.06 12:54

Moin!

Mein lieber user profile icontestra, wie immer bei deinen Ausführungen verstehe ich kein Wort :rofl: (du machst wiedersprüchliche Aussagen und vermischst offensichtlich reichlich Begriffe)... :nixweiss:

Deshalb zeig mir bitte mal den Quelltext (aber kommentiert!) dessen, was du da tust. ;) Und dazu bitte noch eine Beschreibung (ausführlich und verständlich) dessen, was eigentlich passieren sollte.

Anders kann ich dir nicht helfen, hab keinen Bock mehr auf Raten... :roll: :| :(

cu
Narses


testra - Mi 04.10.06 13:25

Hallo


Delphi-Quelltext
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:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp, winsock, NB30;

type
  TForm1 = class(TForm)
GroupBox1: TGroupBox;
    Label1: TLabel;
    Edit1: TEdit;
    ServerSocket1: TServerSocket;
    ServerBlock: TLabel;
    ClientBlock: TLabel;
    ClientSocket: TClientSocket;
    {***...formularbestandteile
    
    ...***}

    
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure ServerSocket1ClientWrite(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1Accept(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    procedure Button2Click(Sender: TObject);

    //Client
    procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);

    procedure ClientSocketConnect(Sender: TObject;
      Socket: TCustomWinSocket);

    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);

    procedure Button7Click(Sender: TObject);
    function ExecConsole(const Command: Stringvar Output, Errors: String): Boolean;
    function GetLocalIPs: String;

  private
      { Private declarations }



  public
    { Public declarations }
  end;

var
  {***lokale variablen***}

implementation

{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var port:integer;
begin

        port:=StrToInt(Edit1.Text);
        ServerSocket1.Port:=port;
        ServerSocket1.Active:=True;
        edit4.text:='Listening ...';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
        if ServerSocket1.Active then
        begin
        ServerSocket1.Socket.Connections[0].SendText(edit6.text);
        edit6.text:='';
        end;
end;

procedure TForm1.ServerSocket1ClientWrite(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add(Socket.ReceiveText);
end;

procedure TForm1.ServerSocket1Accept(Sender: TObject;
  Socket: TCustomWinSocket);
begin
        Checkbox1.Checked:=true;
        edit2.text:=Socket.RemoteAddress;
        edit3.Text:=Socket.RemoteHost;
        edit5.text:=Socket.LocalAddress;
        edit4.text:='Connected';
 end;

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Memo1.Lines.Add(Socket.ReceiveText);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
        close;
end;

//den Hostnamen auslesen, winsock muss eingebunden werden
function TForm1.GetLocalIPs: String;
type PPInAddr= ^PInAddr;
var
wsaData: TWSAData;
HostInfo: PHostEnt;
HostName: Array[0..255of Char;
Addr: PPInAddr;
begin
Result:='';
if WSAStartup($0102, wsaData)<>0 then exit;
try
if gethostname(HostName, SizeOf(HostName)) <> 0 then exit;
HostInfo:= gethostbyname(HostName);
if HostInfo=nil then Exit;
Addr:=Pointer(HostInfo^.h_addr_list);
if (Addr=nilor (Addr^=nilthen exit;
Result:=StrPas(inet_ntoa(Addr^^));
inc(Addr);
while Addr^<>nil do begin
Result:=Result+^M^J+StrPas(inet_ntoa(Addr^^));
inc(Addr);
end;
finally
WSACleanup;
end;
end;


procedure TForm1.Button4Click(Sender: TObject);
var port,i,j:integer;
  Output, Errors: String;
  tmp,S2: TStringList;

begin
        if ServerSocket1.Active then
        begin
        port:=StrToInt(edit9.text);
        ClientSocket.Port:=port;
        ClientSocket.Host:=edit8.text;
        ClientSocket.ClientType:=ctNonBlocking;
        ClientSocket.Active:=true;
        Button3.Enabled:=true;
        Button5.Enabled:=true;
        Button6.Enabled:=false;
        end;
end;
end;

procedure TForm1.ClientSocketConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
        Checkbox2.Checked:=true;
        Edit10.Text:=Socket.LocalAddress;
        Edit11.Text:=Socket.LocalHost;
        Memo2.Lines.Clear;
        edit7.Text:='';
        Button1.Enabled:=true;
        edit13.text:=GetLocalIPs;
        //edit13.text:=ExecConsole;
end;

procedure TForm1.ClientSocketRead(Sender: TObject;
  Socket: TCustomWinSocket);
var p:String;
begin
        p:=Socket.ReceiveText;
        TextvomServer:=p;
        Memo2.Lines.Add(p);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
        ClientSocket.Socket.SendText(edit7.text);
        edit7.text:='';
end;


procedure TForm1.Button5Click(Sender: TObject);
begin
        ServerSocket1.Close;
        ClientSocket.Close;
        Checkbox2.Checked:=false;
        Edit10.Text:='';
        Edit11.Text:='';
        Memo1.Lines.Clear;
        Memo2.Lines.Clear;
        Memo3.Lines.Clear;
        Memo4.Lines.Clear;
        edit7.Text:='';
        Button1.Enabled:=false;
        Button3.Enabled:=false;
        Button4.Enabled:=false;
        Button6.Enabled:=true;

        Checkbox1.Checked:=false;
        edit2.text:='';
        edit3.Text:='';
        edit5.text:='';
        edit12.text:='';
        edit4.text:='Disconnected.....';

end;

procedure TForm1.Button6Click(Sender: TObject);
var port:integer;
begin
        port:=StrToInt(Edit1.Text);
        ServerSocket1.Port:=port;
        ServerSocket1.Active:=True;
        edit4.text:='Listening ...';
        Button4.Enabled:=true;

end;


//---Konsole aufrufen
 function TForm1.ExecConsole(const Command: Stringvar Output, Errors: String): Boolean;
  var
    StartupInfo: TStartupInfo;  
    ProcessInfo: TProcessInformation;  
    SecurityAttr: TSecurityAttributes;  
    PipeOutputRead, PipeOutputWrite,  
    PipeErrorsRead, PipeErrorsWrite: THandle;

 
  // Pipe in einen String auslesen (speicherschonend)  
  function ReadPipeToString(const hPipe: THandle): String;  
    const  
      MEM_CHUNK_SIZE = 8192// Blockgröße, mit der Speicher angefordert wird  
    var  
      NumberOfBytesRead,  
      NumberOfBytesTotal: Cardinal;  
  begin  
    Result := ''// Standard-Ergebnis  
    NumberOfBytesTotal := 0// noch nichts gelesen  
    repeat  
      SetLength(Result,Length(Result) +MEM_CHUNK_SIZE); // mehr Platz machen  
      // versuchen, aus der Pipe zu lesen  
      if ReadFile(hPipe,(@Result[1+NumberOfBytesTotal])^,MEM_CHUNK_SIZE,  
                  NumberOfBytesRead,NILthen // hat geklappt  
        Inc(NumberOfBytesTotal,NumberOfBytesRead); // Gesamtanzahl aktualisieren  
      SetLength(Result,NumberOfBytesTotal); // überzählige Bytes abschneiden  
    until (NumberOfBytesRead = 0); // bis die Pipe leer ist  
  end;  

 
begin  
  // Win-API-Strukturen initialisieren/füllen  
  FillChar(ProcessInfo,SizeOf(TProcessInformation),0);  
  FillChar(SecurityAttr,SizeOf(TSecurityAttributes),0);  
  SecurityAttr.nLength := SizeOf(SecurityAttr);
  SecurityAttr.bInheritHandle := TRUE;
  SecurityAttr.lpSecurityDescriptor := NIL;  
  CreatePipe(PipeOutputRead,PipeOutputWrite,@SecurityAttr,0);  
  CreatePipe(PipeErrorsRead,PipeErrorsWrite,@SecurityAttr,0);  
  FillChar(StartupInfo,SizeOf(TStartupInfo),0);  
  StartupInfo.cb := SizeOf(StartupInfo);  
  StartupInfo.hStdInput := 0;  
  StartupInfo.hStdOutput := PipeOutputWrite;  
  StartupInfo.hStdError := PipeErrorsWrite;  
  StartupInfo.wShowWindow := SW_HIDE;  
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;  
  // Befehl ausführen (Prozess starten)  
  Result := CreateProcess(NIL,PChar(Command),NIL,NIL,TRUE,
                          CREATE_DEFAULT_ERROR_MODE
                          or CREATE_NEW_CONSOLE  
                          or NORMAL_PRIORITY_CLASS,  
                          NIL,NIL,StartupInfo,ProcessInfo);  
  // Write-Pipes schließen  
  CloseHandle(PipeOutputWrite);  
  CloseHandle(PipeErrorsWrite);  
  if (Result) then begin // konnte der Befehl ausgeführt werden?  
    Output := ReadPipeToString(PipeOutputRead); // Ausgabe-Read-Pipe auslesen  
    Errors := ReadPipeToString(PipeErrorsRead); // Fehler-Read-Pipe auslesen  
    WaitForSingleObject(ProcessInfo.hProcess,INFINITE); // auf Prozessende warten  
    CloseHandle(ProcessInfo.hProcess); // und Handle freigeben  
  end;  
  // Read-Pipes schließen  
  CloseHandle(PipeOutputRead);  
  CloseHandle(PipeErrorsRead);  
end

end.


Narses - Mi 04.10.06 13:32

Moin!

user profile iconNarses hat folgendes geschrieben:
Quelltext (aber kommentiert!)

Keine Kommentare, nichtmal brauchbare Komponentennamen... (was soll bitte EditX sein!?) :shock:

user profile iconNarses hat folgendes geschrieben:
eine Beschreibung (ausführlich und verständlich) dessen, was eigentlich passieren sollte.

Kein weiteres Wort... :gruebel:

user profile iconNarses hat folgendes geschrieben:
Anders kann ich dir nicht helfen, hab keinen Bock mehr auf Raten... :roll: :| :(

cu
Narses


testra - Mi 04.10.06 13:40

Hallo,

die frage wäre, in das Edit-Feld edit13 den Servernamen zu schreiben, den ich mit den funktionen execconsole erhalte ( hier erhalte ich name + id des servers ) bei der procedure TForm1.ClientSocketConnect(..). Oder die nur die ip durch die funktion GetLocalIPs.
Welches wäre der bessere weg, oder gibt es einen weg, die server-ip bzw.-namen aus einem registry-eintrag auszulesen und ins feld edit13 einzutragen.


Narses - Mi 04.10.06 14:22

Moin!

OK, also um diese Prozedur geht es (was auch immer sie wohl tut... :gruebel:):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket);  
begin  
  Checkbox2.Checked:=true;  
  Edit10.Text:=Socket.LocalAddress; // was soll das bringen? ist doch immer das gleiche... ?!
  Edit11.Text:=Socket.LocalHost; // meinst du nicht eher .RemoteAddress und .RemoteHost?
  Memo2.Lines.Clear;  
  edit7.Text:='';  
  Button1.Enabled:=true;  
  edit13.text:=GetLocalIPs;  
  //edit13.text:=ExecConsole;  
end;

user profile icontestra hat folgendes geschrieben:
die frage wäre, in das Edit-Feld edit13 den Servernamen zu schreiben, den ich mit den funktionen execconsole erhalte ( hier erhalte ich name + id des servers ) bei der procedure TForm1.ClientSocketConnect(..). Oder die nur die ip durch die funktion GetLocalIPs.

Aha, du verwendest also auf dem Server einen ClientSocket... :gruebel: (und ich wundere mich schon die ganze Zeit, wovon du da immer redest)
Warum auch immer, halte ich zunächst mal für einen Konzeptfehler; nicht grundsätzlich immer, aber fast. ;)

Und du willst eigentlich die lokale(n) IP-Adresse(n) des PCs auslesen (ob das ein Server ist oder nicht, spielt dabei ja eigentlich erstmal keine Rolle), sowie den voll qualifizierten Hostnamen zu den IP(s)! :idea: (nebenbei: bei Servern ist es nicht ungewöhnlich, dass diese auch mehr als eine IP-Adresse haben!) Aber ehrlich gesagt frage ich mich schon die ganze Zeit, wozu in Gottes Namen der voll qualifizierte Hostname auf der Maschine selbst wohl gut sein soll (allenfalls die IP, wenn schon)... :gruebel:

user profile icontestra hat folgendes geschrieben:
Welches wäre der bessere weg, oder gibt es einen weg, die server-ip bzw.-namen aus einem registry-eintrag auszulesen und ins feld edit13 einzutragen.

Wenn es um diese Daten geht, rate ich grundsätzlich dazu, die WSA zu befragen. Zum einen steht die IP-Adresse nirgends in der Registry, wenn du mit DHCP arbeitest, zum anderen ist das was Windows-privates und in jeder Version sowieso irgendwie anders. Also: WSA ist schon der korrekte Ansatz.

Nochwas am Rande: du scheinst dich auf die Socket-Ereignisse als Signalisierung für Datenpakete zu verlassen (beim Überfliegen des Codes gesehen). Das ist im Allgemeinen ein Fehler, der dich noch Nerven kosten wird. ;) Hier [http://www.delphi-library.de/topic_Datenpakete+bei+den+SocketKomponenten+auseinanderhalten_56194.html] kannst du lesen, warum.

cu
Narses


testra - Mi 04.10.06 14:41

Hallo,

ich mache das ganze mit den sockets, um durch diese möglichkeit vom server die ip-adr. bzw. namen des servers (dns-name oder dhcp) zu erhalten, um den namen von meinem eigenen rechner zu erhalten, um den namen des mail-servers zu erhalten (ist die nächste aufgabe), um eine text-datei zu verschlüsseln und diese von einem server-pfad zu erhalten und dann zu entschlüsseln. Ich will alle daten miteinander vergleichen(ip's und verschl. text) und so für sicherheit sorgen.

So habe ich meine versuche angefangen, ich hoffe es war nicht der allzu falsche weg.... :?