Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi ReuseSocket (SO_REUSEADDR) (https://www.delphipraxis.net/107100-reusesocket-so_reuseaddr.html)

MasterEvil 22. Jan 2008 14:16


ReuseSocket (SO_REUSEADDR)
 
Hallo,

ich verschicke mit meiner Applikation Nachrichten per UDP durch das Netzwerk. Da eine Anwendung mehrfach auf einem Rechner gestartet werden kann, habe ich nach einer Lösung gesucht, die UDPServer (ich benutze Indy) der Anwendungen an den selben Port zu binden.
Die Lösung des Problems habe ich in der Socket-Option SO_REUSEADDR gefunden, welche im TCPServer von Indy auch schon implementiert ist (Property ReuseSocket).
Habe die selbe Implementierung auch für den UDPServer gemacht und es funktioniert auch alles, solange ich Broadcasts empfangen. Alle Anwendungen bekommen dabei die selbe Nachricht und alles ist gut.

Probleme bereiten mir Nachrichten, welche direkt an die IP eines Rechner geschickt werden. Hier bekommt nur immer eine Anwendung die Nachricht (welche scheint zufällig zu sein). Die Anwendung scheint die Nachricht vom Socket-Stack zu nehmen und die nächste Anwendung sieht davon nichts mehr ...
Ich möchte aber, dass alle Anwendungen die Nachricht bekommen.

Hat jemand eine Idee? Ich hab von dem Stichwort Multicast gehört. Weiß damit aber nicht so recht etwas anzufangen.

Gruß,
Steffen

Codewalker 22. Jan 2008 14:30

Re: ReuseSocket (SO_REUSEADDR)
 
Ich kenne Multicast nur in Zusammenhang mit dem ICMP-Protokoll. Vielleicht kommst du ja da weiter

MasterEvil 23. Jan 2008 10:07

Re: ReuseSocket (SO_REUSEADDR)
 
Danke für deine Antwort, hat mich aber bislang auch leider noch nicht weiter gebracht :(

Das Problem muss doch schonmal jemand gehabt haben ...

gsh 23. Jan 2008 10:17

Re: ReuseSocket (SO_REUSEADDR)
 
Also nur mal so wegen den Begriffen:
Unicast = Punkt-zu-Punkt-Verbindung D.h. Von einer IP auf eine andere.
Multicast = Gruppenauruf imho ist es vergleichbar mit Broadcast

Zu deinem Problem:
Es kann leicht daran liegen des es ein Bug von den Indys ist ... wäre ja nicht der erste ;)
Vllt. kannst du irgendwie den Entwicklern ne Mail schreiben

MasterEvil 28. Jan 2008 08:19

Re: ReuseSocket (SO_REUSEADDR)
 
Hallo,

ich habe das mit dem Multicast aus der MSDN, dort heißt es hier:
Zitat:

Once the second socket has successfully bound, the behavior for all sockets bound to that port is indeterminate. For example, if all of the sockets on the same port provide TCP service, any incoming TCP connection requests over the port cannot be guaranteed to be handled by the correct socket — the behavior is non-deterministic. A malicious program can use SO_REUSEADDR to forcibly bind sockets already in use for standard network protocol services in order to deny access to those service. No special privileges are required to use this option.

The exception to this non-deterministic behavior is multicast sockets. If two sockets are bound to the same interface and port and are members of the same multicast group, data will be delivered to both sockets, rather than an arbitrarily chosen one.
Und über Multicasts kann man dann hier etwas lesen. Für mich sind das aber böhmische Dörfer ...

Oder gibt es eine andere Lösung dieses Problem zu lösen?

Gruß,
Steffen

sirius 28. Jan 2008 09:05

Re: ReuseSocket (SO_REUSEADDR)
 
Zitat:

Zitat von MasterEvil
Oder gibt es eine andere Lösung dieses Problem zu lösen?

Das mit Multicast wäre mir neu. Aber wenn es da eine Lösung gibt, würde mich das auch interessieren.

Ich habe es hier so gelöst, dass jeder ein UDP-socket auf dem Standard-Port einrichtet. Dieses scheitert natürlich ab dem zweiten Programm/zweite Instanz. Diese sucht sich dann einfach einen freien Port und meldet sich bei der ersten Instanz an. Die erste Instanz führt dann eine Liste und sendet alle eingehenden Nachrichten weiter. Dann gibt es noch gewisse Sicherheiten, dass das System auch funktioniert, wenn die erste Instanz abstürzt. Ist natürlich umständlicher als einfach so eine (wenn es denn das gibt) Multicast-Adresse.

MasterEvil 29. Jan 2008 13:13

Re: ReuseSocket (SO_REUSEADDR)
 
Ja, eine einfache Variante davon hatte ich vorher auch schon.
Ist nur sehr fehleranfällig und daher fand ich diese Möglichkeit viel interessanter.
Schade nur, dass keine da mehr zu weiß :(

MasterEvil 30. Jan 2008 13:54

Re: ReuseSocket (SO_REUSEADDR)
 
Hab einen sehr guten, deutschen Text über Multicast gefunden: hier
Besser verstehe ich es jetzt, glaube allerdings, dass das nicht die richtige Lösung für mich ist. Klingt allerdings auch sehr interessant.

Falls noch jemand ein bessere Idee hat, als eine Port-Reihe aufzubauen und die Nachrichten dort durchzureichen wäre ich dafür naqtürlich sehr dankbar ;)

Gruß,
Steffen


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz