Autor Beitrag
Jimbo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Do 27.01.05 13:59 
Hallo,

ich schreibe derzeit an einer Internet-Anwendung, bei der sich Clients an einem Server anmelden können. Klappt auch wunderbar, hat jedoch einen Haken: Wenn sich zwei Clients anmelden, die von der Selben IP kommen, also aus dem selben lokalen Netzwerk, dann muß ein Fehler auftreten, da sie nicht mehr anhand der IP identifiziert werden können (sind ja jetzt beide mit der selben IP online..).
Das ganze läuft im Moment einem Port, der in der Firewall extra freigeben werden muß, damit er zu einem PC durchgeschaltet wird.
Wie machen das die großen Anwendungen, z.B. ICQ? Da können auch alle Leute aus dem lokalen Netzwerk gleichzeitig online sein, und bekommen dennoch alle nur die Nachrichten, die sie auch bekommen sollen...
WeBsPaCe
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2322
Erhaltene Danke: 1

FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
BeitragVerfasst: Do 27.01.05 14:07 
Schon mal an die Suche gedacht?? :wink: www.delphi-forum.de/...34912&highlight=

_________________
Steht der Bauer im Gemüse, hat er später grüne Füße.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 27.01.05 14:19 
Moin!

Um den vorgenannten Thread kurz zusammenzufassen:

Du solltest die Clients nicht an der IP unterscheiden, sondern am Port (bzw. der Session). Es ist nicht möglich, zwei verschiedene Clients an einem Port zu haben.

Die Verwirrung entsteht normalerweise dadurch, dass man einen bestimmten Port für den Server festlegt; dieser Port wird allerdings später nicht für die Kommunikation verwendet, sondern auf dem speziellen Serverport wird zwischen Server und Client ein "zufälliger" Port ausgehandelt, auf den die Verbindung dann verlagert wird, damit der Server für weitere Clients "frei" ist.

cu
Narses
Jimbo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Do 27.01.05 15:18 
@WeBsPaCe: hast recht, sorry
@Narses: danke! ich werd gleich mal ausprobieren das einzubauen.

vielen dank für die schnelle antwort.
WeBsPaCe
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2322
Erhaltene Danke: 1

FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
BeitragVerfasst: Do 27.01.05 15:21 
*g* Kein Problem, war nicht böse gemeint...

@Narses
:D Ich hab nachgedacht!!! Den Thread gelesen (!), kombiniert, sofort mit dem anderen in Verbindung gebracht und erst dann gepostet!!! Und es hat geholfen!!! *g* Ich kann DENKEN!!! :lol:

_________________
Steht der Bauer im Gemüse, hat er später grüne Füße.
Kedariodakon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 30



BeitragVerfasst: Do 27.01.05 15:31 
Narses hat folgendes geschrieben:
...Es ist nicht möglich, zwei verschiedene Clients an einem Port zu haben...


Falsch, ist möglich

Bye
Jimbo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Do 27.01.05 15:31 
kein problem :)

eine frage hab ich noch: ich möchte jetzt per ServerOnClientRead feststellen, wer gesendet hat, die ip bekomm ich ja ganz einfach per ip := socket.RemoteAddress; aber wie steht das mit dem port?
Kedariodakon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 30



BeitragVerfasst: Do 27.01.05 15:44 
Jimbo hat folgendes geschrieben:
kein problem :)

eine frage hab ich noch: ich möchte jetzt per ServerOnClientRead feststellen, wer gesendet hat, die ip bekomm ich ja ganz einfach per ip := socket.RemoteAddress; aber wie steht das mit dem port?


Unterscheide die Clients nicht am Port bzw. der Ip, die ist nicht eineindeutig!

Nimm den Socket, Der ist es!
oder besser in deinem Fall das SocketHandle

Antwort:
ausblenden Delphi-Quelltext
1:
ip := socket.RemotePort;					


Bye
Jimbo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Do 27.01.05 16:30 
aah, jetzt hab ich's. dankeschön!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 27.01.05 19:52 
Moin!

(das hier ist die überarbeitete Version des Beitrags von vor einigen Stunden)

Kedariodakon hat folgendes geschrieben:
Narses hat folgendes geschrieben:
...Es ist nicht möglich, zwei verschiedene Clients an einem Port zu haben...

Falsch, ist möglich

Das ist richtig, ich hätte "Socket" und nicht "Port" sagen müssen. Ein Socket(-Handle) ist (praktisch immer) ein eindeutiges Kennzeichen für eine Verbindung zu einem Client (meinte ich auch, hab ich aber nicht geschrieben).

Kedariodakon hat folgendes geschrieben:
Nimm den Socket, Der ist es!
oder besser in deinem Fall das SocketHandle
Antwort:
ausblenden Delphi-Quelltext
1:
ip := socket.RemotePort;					

Hier möchte ich dich allerdings korrigieren, du machst jetzt den gleichen Fehler wie ich. :wink: Korrekt wäre es, den Socket-Parameter (TCustomWinSocket bei den ScktComps) selbst als Unterscheidungsmerkmal für einen Client (Session) zu verwenden, wie ich es in dem o.g. Thread auch empfohlen habe.

cu
Narses

(War irgendwie im falschen Film vorhin; zu lange gearbeitet wahrscheinlich... :eyecrazy: )
Kedariodakon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 30



BeitragVerfasst: Fr 28.01.05 09:53 
Narses hat folgendes geschrieben:

Hier möchte ich dich allerdings korrigieren, du machst jetzt den gleichen Fehler wie ich. :wink: Korrekt wäre es, den Socket-Parameter (TCustomWinSocket bei den ScktComps) selbst als Unterscheidungsmerkmal für einen Client (Session) zu verwenden, wie ich es in dem o.g. Thread auch empfohlen habe.


In welcher hinsicht?
Nen Socket ist eine Integer-Zahl und die gibts nur einmal Aufm System, hatte nicht von ner komponente geredet, sondern von den WinAPI Sockets ^^

Aber Sockert Handle war nur schnelmal dahingeraten mithilfe der Hilfe :wink:

Bye
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Fr 28.01.05 10:45 
Moin!

Kedariodakon hat folgendes geschrieben:
In welcher hinsicht?

Nun, wir waren uns einig, dass Ports kein geeignetes Merkmal darstellen, sondern Sockets. :wink:

Du hast empfohlen:
ausblenden Delphi-Quelltext
1:
ip := socket.RemotePort;					

zu verwenden. Das ist aber wieder der Port des Sockets (noch dazu des Remote-Systems).

ausblenden Delphi-Quelltext
1:
ip := socket.RemotePort;					

Das wäre aber der korrekte Ansatz gewesen (also der Delphi-Wrapper für den WSA-Socket auf dem Server-Rechner selbst; wie ich in meinem letzten Beitrag sagte).

Sinnvollerweise sollte man das "ip :=" natürlich nicht verwenden, sondern eine aussagekräftige, andere Variable.

cu
Narses

//EDIT: OK, hatte ich wohl missverstanden. :wink:


Zuletzt bearbeitet von Narses am Fr 28.01.05 13:26, insgesamt 1-mal bearbeitet
Kedariodakon
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 30



BeitragVerfasst: Fr 28.01.05 13:16 
Das schrieb ich, da er eine Antwort auf das hier wollte:
Jimbo hat folgendes geschrieben:
kein problem :)

eine frage hab ich noch: ich möchte jetzt per ServerOnClientRead feststellen, wer gesendet hat, die ip bekomm ich ja ganz einfach per ip := socket.RemoteAddress; aber wie steht das mit dem port?



:wink:

Bye