Autor Beitrag
Jaegermeister1992
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Fr 25.09.09 21:43 
Hallo,
also ich habe 2 Programme geschrieben einen Clienten und einen Server! Der Server ist Dafür da das dort Sich Leute über den Clienten einloggen sozusagen. und beim einloggen wird die IP des Clienten an den Server geleitet und dann Dort als Client.Host := IP eingetragen blos sobald ich das ausführe kommt eine Fehlermeldung udn zwar:
Zitat:
Windows Socket Fehler: Der Angeforderte Name ist gültig, Es wurden jedoch keine Daten des Angeforderten Types gefunden(11004), auf API 'Async Lookup'

Der Teil WinSock ist nur dafür zuständig um die Ip des PCs herauszufinden! Ich weiß das es einfacher geht aber in Delphi 7 Personal Edition gibts diese Komponenten Leider nicht!

ausblenden volle Höhe 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:
// Server
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Feld: TMemo;
    Text: TEdit;
    Senden: TButton;
    Server: TServerSocket;
    Client: TClientSocket;
    Ip: TEdit;
    Verbinden: TButton;
    Name: TEdit;
    Start: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure VerbindenClick(Sender: TObject);
    procedure SendenClick(Sender: TObject);
    procedure StartClick(Sender: TObject);
    procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
     private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
    sIP        : String;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
resourcestring

  cTxtIP  = '%d.%d.%d.%d';

var

  rSockVer   : WordRec;

  aWSAData   : TWSAData;

  szHostName : array[0..255of Char;

  pHE        : PHostEnt;


begin

  // WinSock Version 1.1 initialisieren

  rSockVer.Hi := 1;

  rSockVer.Lo := 1;

  WSAStartup(Word(rSockVer), aWSAData );

  try

    FillChar(szHostName, SizeOf(szHostName), #0);

    GetHostName(szHostName, SizeOf(szHostName));

    pHE := GetHostByName(szHostName);

    if Assigned(pHE)

      then with pHE^ do

        sIP := Format(cTxtIP,

                [Byte(h_addr^[0]), Byte(h_addr^[1]),

                 Byte(h_addr^[2]), Byte(h_addr^[3])]);

  finally

    WSACleanup;

  end;

  ShowMessage(sIP);

  Server := TServerSocket.Create(Form1);
  Client := TClientSocket.Create(Form1);
  Server.OnClientRead := ServerClientRead;
   try
    Server.Port := 10024;
    Server.Open;

  except
    //Im Fehlerfall wieder freigeben (ältere Versionen)
    Client.Free;
    Server.Free;
  end;
end;

procedure TForm1.VerbindenClick(Sender: TObject);
begin
    Client.Host:= IP.Text;
    Client.Port := 10024;
    Client.Open;
end;

procedure TForm1.SendenClick(Sender: TObject);
begin
  Feld.Lines.Add(Text.Text);
  Client.Socket.SendText(Text.Text);
  Text.Text := '';
end;

procedure TForm1.StartClick(Sender: TObject);
begin
  Feld.Lines.Add(Name.Text + ' ist online!');
  Start.Enabled:= false;
  Client.Socket.SendText('IP - ' + sIP);                                  
end;

procedure TForm1.ServerClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
    MSG: String;
begin
    MSG := Socket.ReceiveText;

    Feld.Lines.Add(MSG);
end;
end.

ausblenden volle Höhe 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:
// Client
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Feld: TMemo;
    Text: TEdit;
    Button1: TButton;
    Server: TServerSocket;
    Client: TClientSocket;
    Client2: TClientSocket;
    procedure Button1Click(Sender: TObject);
    procedure ServerClientRead(Sender: TObject; Socket: TCustomWinSocket);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Spieler : real;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Feld.Lines.Add(Text.Text);
  Client2.Socket.SendText(Text.Text);
end;

procedure TForm1.ServerClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  MSG: String;
  Ip : string;
begin
    MSG := Socket.ReceiveText;
    Ip := copy(MSG, 15);
    if Ip = 'IP - ' then begin
        IP := Copy(MSG, 5,15);
        if Spieler = 1 then begin
            Showmessage(IP);
            Spieler := 2;
            Client2.Host:= IP;
            CLient2.Port := 10024;
            Client2.Open;
            Showmessage(Client2.Host);
        end
    end
    else    Feld.Lines.Add(MSG);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Spieler:=1;
  //Initialisierung des Objekts (ältere Delphi-Versionen)
  Server := TServerSocket.Create(Form1);
  Client := TClientSocket.Create(Form1);
  Client2 := TClientSocket.Create(Form1);
  Server.OnClientRead := ServerClientRead;  //Nur bei älteren Versionen
   try
    Server.Port := 10024;
    Server.Open;
    Client.port := 10024;
    Client.Host := 'localhost';
    client.Open;

  except
    //Im Fehlerfall wieder freigeben (ältere Versionen)
    Client.Free;
    Server.Free;
  end;
end;

end.


Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 26.09.09 13:05 
Moin und :welcome: im Forum!

Dein Code sieht sehr nach älteren Tutorials aus, in denen die Socket-Komponenten leider überhaupt nicht designgerecht eingesetzt werden, manchmal sogar klar fehlerhaft eingebunden sind. :| Es sieht auch sehr merkwürdig aus, dass du im Server und im Client jeweils beide Komponenten einsetzt. Wozu? Man kann eine TCP-Verbindung in beiden Richtungen verwenden. :nixweiss:

user profile iconJaegermeister1992 hat folgendes geschrieben Zum zitierten Posting springen:
und beim einloggen wird die IP des Clienten an den Server geleitet und dann Dort als Client.Host := IP eingetragen blos sobald ich das ausführe kommt eine Fehlermeldung udn zwar:
Zitat:
Windows Socket Fehler: Der Angeforderte Name ist gültig, Es wurden jedoch keine Daten des Angeforderten Types gefunden(11004), auf API 'Async Lookup'
Sieht so aus, als wolltest du den Hostnamen zuweisen, aber das klappt aus irgend einem Grund nicht. Ist auch gar nicht nötig, wie´s aussieht, denn du kannst die bereits bestehende Verbindung benutzen. :idea:

Hier gibt´s ein Tutorial dazu. :les: :think:

user profile iconJaegermeister1992 hat folgendes geschrieben Zum zitierten Posting springen:
Der Teil WinSock ist nur dafür zuständig um die Ip des PCs herauszufinden! Ich weiß das es einfacher geht aber in Delphi 7 Personal Edition gibts diese Komponenten Leider nicht!
Dann schau dir dazu mal diese Unit an. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.