| Autor |
Beitrag |
Jimbo
      
Beiträge: 53
|
Verfasst: 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
      
Beiträge: 2322
Erhaltene Danke: 1
FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
|
Verfasst: Do 27.01.05 14:07
_________________ Steht der Bauer im Gemüse, hat er später grüne Füße.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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 
      
Beiträge: 53
|
Verfasst: 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
      
Beiträge: 2322
Erhaltene Danke: 1
FireFox 3, Internet Explorer 6 SP1
D1, D3Prof, D6Pers, D7Pers+Indy, VisualStudio Express
|
Verfasst: Do 27.01.05 15:21
*g* Kein Problem, war nicht böse gemeint...
@Narses
 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!!! 
_________________ Steht der Bauer im Gemüse, hat er später grüne Füße.
|
|
Kedariodakon
      
Beiträge: 30
|
Verfasst: 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 
      
Beiträge: 53
|
Verfasst: 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
      
Beiträge: 30
|
Verfasst: 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:
Delphi-Quelltext 1:
| ip := socket.RemotePort; |
Bye
|
|
Jimbo 
      
Beiträge: 53
|
Verfasst: Do 27.01.05 16:30
aah, jetzt hab ich's. dankeschön!
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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:
Delphi-Quelltext 1:
| ip := socket.RemotePort; | |
Hier möchte ich dich allerdings korrigieren, du machst jetzt den gleichen Fehler wie ich.  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...  )
|
|
Kedariodakon
      
Beiträge: 30
|
Verfasst: 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. 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
Bye
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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.
Du hast empfohlen:
Delphi-Quelltext 1:
| ip := socket.RemotePort; |
zu verwenden. Das ist aber wieder der Port des Sockets (noch dazu des Remote-Systems).
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. 
Zuletzt bearbeitet von Narses am Fr 28.01.05 13:26, insgesamt 1-mal bearbeitet
|
|
Kedariodakon
      
Beiträge: 30
|
Verfasst: 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? |
Bye
|
|