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)); 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 if Socket.RemoteHost = ServerSocket1.Socket.Connections[i].RemoteHost then begin RecievedNums[i]:=Strtoint(Socket.ReceiveText); 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 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+1] then 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!
soisseteben hat folgendes geschrieben: |
| mein code ist sooooo verbugt :autsch: |
Ja, das kann man sicherlich sagen... ;)
soisseteben hat folgendes geschrieben: |
| aber das Problem ist gelöst |
Sieht man davon ab, dass es sicher eine gute Idee wäre, hier mal ein
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 if (Socket = ServerSocket1.Socket.Connections[i]) then begin |
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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!