Entwickler-Ecke

Internet / Netzwerk - gleiche "RemoteAddress" von Rechnern im Netzwerk


soisseteben - Sa 02.09.06 14:51
Titel: gleiche "RemoteAddress" von Rechnern im Netzwerk
Ich wollte ein Mini-Netzwerkspiel realisieren und steh jetzt vor dem Problem, dass die Eigenschaft "RemoteAddress" sowohl von meinem Rechner als auch von dem anderen im Netzwerk mit 127.0.0.1 angegeben wird. Da wir über einen Router arbeiten müsste der andere Rechner doch aber auch eine IP-Adresse für das Netzwerk haben, die dann in RemoteAddress zu finden sein müsste, oder?

Wenn ich richtig liege, dann ist 127.0.0.1 doch nur die Rechner-interne IP-Adresse?

thx for help


-->Masterkill<-- - Sa 02.09.06 16:36

Also ja die 127.0.0.1 entspricht der lokalen IP (localhost).
Sonst gib ma etwas code damit ich den zusammenhang verstehen kann.
Mfg masterkill


Minime - Sa 02.09.06 16:46

du könntest versuchen die clients durch Socket.Handles zu unterscheiden wenn du das willst/meinst


soisseteben - Sa 02.09.06 16:59

mmh, hört sich erstmal nach genau dem an, was ich suche. Nur hab ich keinen Schimmer wie ich das mache und in der Delphi-Hilfe wird anscheinend vorrausgesetzt das man weiss, was ein "handle" überhaupt ist... :?

Kann mir jeman das bitte anhand von Quelltext zeigen (Thx)?

Ach und hier noch das halbfertige Program. Sinn ist es, das alle connecteten Clients eine Zufallszahl zum Server schicken, der die vergleicht und ermittelt wer der Sieger ist. Bei der Ermittlung des Siegers scheint es das Problemm zu geben, das ServerSocket1.Socket.Connection[i].RemoteAdresss hier im Netzwerk immer 127.0.0.1 ist.

Ich poste erstmal alles. Zuerst den Client:


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:
procedure TForm1.Create(Sender: TObject);
begin
  ClientSocket1.Port:=MY_PORT;
  Log.Lines[0]:= 'Welcome';
end;

procedure TForm1.OnlineClick(Sender: TObject);
begin
  if Online.Checked then
    ClientSocket1.Host:=ServerAddress.Text;
  ClientSocket1.Active:=Online.Checked;
end;

procedure TForm1.ClientSocket1_WhenConnected(Sender: TObject; Socket: TCustomWinSocket);
begin
  Log.lines.Add('Verbindung zu '+ ClientSocket1.Host+' hergestellt')
end;

procedure TForm1.BsubmitClick(Sender: TObject);
var num : integer;
begin
randomize;
  num:=random(100)+1;
  Clientsocket1.Socket.SendText(inttostr(num));
  //Log.lines.Add(inttostr(num) +' gesendet');
end;

procedure TForm1.ClientSocket1_Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  if ClientSocket1.Active then
    Online.Checked := FALSE;
  Log.Lines.Add('Fehler '+ inttostr(ErrorCode))
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  if ClientSocket1.Active then
    Clientsocket1.close;
end;

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


Und hier den Server:


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:
procedure TForm1.Form1_Create(Sender: TObject);
begin
  ServerSocket1.Port := MY_PORT;
  Log.Lines[0]:= 'Welcome';
  gamer:=0;
end;


procedure TForm1.OnlineClick(Sender: TObject);
begin
  if online.Checked then
    Log.Lines.Add('Allet Online');
  ServerSocket1.Active := Online.Checked;
end;



procedure TForm1.ServerSocket1_Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
  Log.Lines.Add('Fehler'+ inttostr(Errorcode));

  if ServerSocket1.Active then
    Online.Checked := FALSE;
end;




procedure TForm1.ServerSocket1_ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  Socket.SendText('Welcome at '+ Serversocket1.Socket.LocalHost);
  Socket.SendText('You are player '+ inttostr(Serversocket1.Socket.ActiveConnections-1));
end;


procedure TForm1.ServerSocket1_ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var i, winner : integer;
    bstring : string;
begin

  For i:=0 to ServerSocket1.Socket.ActiveConnections-1 do begin           //suchen wer das Datenpacketr geschickt hat
    if Socket.RemoteHost =  ServerSocket1.Socket.Connections[i].RemoteHost then begin        //wenn gefunden
      RecievedNums[i]:=Strtoint(Socket.ReceiveText);                                               //zuordnen
      Broadcast('Server', ServerSocket1.Socket.Connections[winner].RemoteHost +' schickt eine '+ inttostr(RecievedNums[i]) +' ins Rennen....');
      inc(gamer); break
    end;
  end;

  if gamer = ServerSocket1.Socket.ActiveConnections then begin   //wenn alle gesetzt haben
    winner:=Sortieren;
      ServerSocket1.Socket.Connections[winner].SendText('Du Jewinna von Deutschkurs mit '+ inttostr(Recievednums[winner]));
      broadcast('Server','Der Gewinner ist: '+ ServerSocket1.Socket.Connections[winner].RemoteHost +' mit '+ inttostr(RecievedNums[Winner]) +' Pkt!');
    gamer:=0;
  end;

end;

function TForm1.Sortieren : integer;
var hoechste, i, h : integer;
begin
  hoechste:=0;
  for i:=1 to gamer-1 do
    if RecievedNums[i] < RecievedNums[i+1then
      hoechste:=i+1;

  result:=hoechste;
end;

procedure TForm1.Broadcast (const Name, Text: String);
var i: integer;
begin
   for i:=0 to ServerSocket1.Socket.ActiveConnections-1 do
     ServerSocket1.Socket.Connections[i].SendText(Name +': '+ Text);
end;


Nochmal Danke :D


soisseteben - Sa 02.09.06 19:36

soweit ich das verstanden hab, stellen "Handels" u.a. ID's für Windowsfenster dar. Ich hab allerdings nichts gefunden, das darauf hindeutet, das sich damit die verschiedenen Sockets für die verschiedenen Spieler unterscheiden lassen. :(


soisseteben - Sa 02.09.06 22:02

mein code ist sooooo verbugt :autsch: aber das Problem ist gelöst


-->Masterkill<-- - So 03.09.06 13:28

Wie denn?


Narses - So 03.09.06 23:31

Moin!

user profile iconsoisseteben hat folgendes geschrieben:
mein code ist sooooo verbugt :autsch:

Ja, das kann man sicherlich sagen... ;)

user profile iconsoisseteben hat folgendes geschrieben:
aber das Problem ist gelöst

user profile icon-->Masterkill<-- hat folgendes geschrieben:
Wie denn?

Sieht man davon ab, dass es sicher eine gute Idee wäre, hier mal ein Suche in: Delphi-Forum, Delphi-Library PROTOKOLL einzusetzen, dann würde ich sagen, dass hier der "Fehler" liegt:

Delphi-Quelltext
1:
2:
for i := 0 to ServerSocket1.Socket.ActiveConnections-1 do begin //suchen wer das Datenpacketr geschickt hat
  if (Socket = ServerSocket1.Socket.Connections[i]) then begin //wenn gefunden

Der TCustomWinSocket ist bereits eine eindeutige Kennung für eine Verbindung, und wenn du es nur innerhalb der Servers verwendest, reicht es aus, einfach die Objektzeiger zu vergleichen. Siehe FAQ-Beitrag [http://www.delphi-library.de/topic_die+Clients+von+TServerSocket+auseinanderhalten_47183.html]. ;)

cu
Narses


soisseteben - Mo 04.09.06 08:27

genau das wars - 'n einfacher Schreibfehler. Mittlerweile läufts auch fehlerfrei. Wegen dem Protokoll - da hab ich versucht in dem Tutorial von dir Narses durchzublicken, was mir jedoch nur sehr eingeschränkt gelang. Aber ich bleib dran.

Auf jeden Fall danke für die Arbeit an dem Tutorial, da konnte man sich auch viel anderes abgucken, worauf man als Noob sicher nicht gekommen wär

bye