Frage zu UDP
Übersicht

LionBetreff: Frage zu UDP |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey,
ich hab diese Frage mehr oder weniger direkt zu Vertex' Bnetex-Modul gestellt, dort aber leider keine Antwort bekommen, ich hoffe, dass dies nun jemand liest, der mir eine Antwort geben kann. Folgende Situation: Ich habe ein Serverprogramm, das sowohl TCP- als auch UDP-Streams hat. Wenn ich nun von einem Client eine Nachricht empfange, werden diese Anfragen natürlich beantwortet. Bei einem Server ist es nun auch nicht unüblich, das viele Clients gleichzeitig auf den Server zugreifen. Bei dem TCP-Teil der Programms sieht das ganze ja ok aus soweit, Code: [AUSKLAPPEN] Hauptschleifenanfang
Überprüfung von neuen Clients Abarbeitung bestehender Clientstreams Hauptschleifenende und da ja jeder Client einen einzelnen Unterstream bei mir hat, wo ich wunderbar rausfiltern kann, welcher Client zu welchem Stream gehört, gibt es keinerlei Probleme. Bei UDP sieht das ja leider anders aus. Denn UDP ist ja verbindungslos. Sprich, ich habe Code: [AUSKLAPPEN] Hauptschleifenanfang
Empfangen von Nachrichten Hauptschleifenende Nun kommt das Problem. Ich weiß gerad leider nicht wie das ganze abläuft, wenn mehrere Clients gleichzeitig Anfragen stellen, sprich es sieht entweder wie im Fall A) oder Fall B) aus. Bei beiden erläutere ich weitere Fragen. A) Für jeden Client wird ein Schleifendurchlauf benötigt, um eine Nachricht abzuarbeiten, im Gegensatz zu Fall B) wird daher wohl ein echt guter CPU benötigt, wenn man davon ausgehen würde, das ein Client 10 Nachrichten pro Sekunde schickt. Dann würde es ja 10 Hz pro Client benötigen. Allein bei 50 Clients zur selben Zeit müsste man das Programm mit 500 Hertz laufen lassen. Erscheint mir irgendwie enorm. Wie sieht das bei großen MMORPGs aus, wo mehrere Tausend Spieler gleichzeitig eingeloggt sind? Das kann ja nicht so ablaufen?! B) Die Nachrichten werden einfach hintereinander gehängt. Würde für mich somit ok klingen, jedoch hab ich nun das Problem, das, sofern ich den Befehl richtig verstanden hab, darin liegt, es mit dem Befehl GetMsgPort() bzw. GetMsgIP() nur möglich ist, die Daten der letzten Nachricht auszulesen. Das wäre ja fatal, wenn eben zwei Leute gleichzeitig anfragen... Code: [AUSKLAPPEN] Client A und Client B werden empfangen...
Server verarbeitet... Client B erhält als einziger die Antwort, da seine Nachricht zwar später eingetroffen ist, aber immernoch mit Client A's ausgelesen wurde... -> Client A wartet vergeblich auf Antworten Eventuell habe ich den Befehl falsch verstanden. Was, falls es so abläuft, also die Nachrichten zusammengereiht werden, optimal zur Behebung wäre, ist ja einfach ein Befehl, der nicht IP/Port der letzten Nachricht, sondern des zuletzt ausgelesenen Nachrichtenabschnitts ausgibt. Hoffe ich habe mein Problem verständlich dargestellt und es ist jemand in der Lage, mir zu antworten. Gruß |
||
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x |
furbolg |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo Lion,
zu a) Es gibt nur 1 Schleife, weil wie du schon sagst keine Verbindungen aufgebaut werden. By the way: Du kannst Herz nicht mit Takten gleichsetzen, da die CPUs mehrere Befehle pro Takt umsetzen. Und 500 Hertz/Takte bei einem Pentium 1 mit 33 Mega Hertz hätten mehr als genug Leistung ( 1 Mega Hertz = 1.000.000 Hertz ![]() zu b) Das wäre die richtige Methode. Beschäftige dich genauer mit UDP sonst wirst du einiges an Ärger und Frust erleben. UDP ist ein Shot'n'Forget Protokoll, Verbindungslos und schickt Datagramme durch das LAN / INet. Die Befehle GetMsgPort + GetMsgIP sind schon richtig und funktionieren auch, denn jeder User schickt 1 Paket ab. Das heisst es werden auch 2 Pakete (nicht immer - da keine Paketsicherheit) empfangen. Generell musst du bei UDP sehr vieles selber Implementieren (Paketsicherheit, CRC/Paketprüfung, Empfangen von Teilstücke etc.). mfg Furb |
||
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Also ich hatte mal vor über 3 Jahren (Eh nicht, so lange her? >.<) so ein Problem:
https://www.blitzforum.de/foru...225#270225 Ich weiß allerdings auch nicht, ob es *die* richtige Methode ist oder nicht. Habe mich aber auch nie so genau damit beschäftige, wie es sich dann bei Ausnahmefällen oder ähnlichem verhalten würde. |
||
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7 |
![]() |
BtbN |
![]() Antworten mit Zitat ![]() |
---|---|---|
Zum einen nutzen quasi alle großen MMORPGs TCP, und zum andern sehe ich dein Problem nicht.
Kannst dir doch einfach einen virtuellen stream für deine UDP "Clients" basteln, die dann einfach nur ziel IP und Port halten, und entsprechend senden. Und ob du die schleife 50 oder 50000 mal durchläufst ist jeder CPU der letzten 20 jahre volkommen egal, das arbeitet die schneller ab als du messen kannst. |
||
Lion |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey,
Soweit danke schon einmal für die Antworten. @Furbolg, das man das nicht gleichsetzen kann ist mir bewusst. Meinte Hertz als Timer für die Hauptschleife. Ich werde mich mal näher mit den genannten Themen auseinander setzen, dankeschön ![]() @Reaper, hm ich weiß nicht. Also bei mir sieht das ziemlich genau so aus und hilft mir damit leider nicht so recht weiter, dankeschön. Wie gesagt, ich hab halt keine Ahnung ob es in der Praxis tatsächlich zu Problemen kommen würde, beschäftige mich derzeit nur mit dem was-wäre-wenn fall...^^ @BtbN, ich benutze TCP und UDP gleichzeitig, da aber die Hauptelemente eher Shooterlastig werden sollen, finde ich UDP für den Part geeigneter, weils einfach schneller ist. Einen virtuellen Stream... hm, daran hab ich auch schon gedacht. Aber da UDP eben verbindungslos ist, frage ich mich, ob der Client-Port nicht eventuell einfach sich ändert? IP kann ich über den gleichzeitig bestehenden TCP-Port ja einfach kriegen, wenn ich brauch. Aber um den Port mach ich mir eben Sorgen. Das ist mein Problem hier ![]() Gruß |
||
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x |
![]() |
tft |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
jede udp nachricht stellt die IP und den Port zur verfügung der nachricht die gesendet wurde ...... mehr Hilfe lesen bringt dich weiter ![]() Gruss TFT |
||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
Lion |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@tft, toll danke. das weiß ich auch. genauer das problem lesen bitte, danke. | ||
Intel Core 2 Quad 4x2.66 ghz - 4gb ddr2 - nvidia GeForce GTX660 2gb
Intel Atom 1x1.83 ghz - 2gb ddr2 - intel GMA 3150 256mb AMD A10-5750M 4x2.5 ghz - 8 gb ddr4 - AMD R9 M290x |
![]() |
tft |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
ooooooo ..... lesen ... dann anders .... die zuordnung und das verteilen der nachrichten ist mit den standart udp befehlen einfach. Du merkst dir IP und Port ... packst in das Packet noch einen Namen rein und schon kannste jede Nachricht identivizieren. Du must natürlich mit ReadAvail pro Programm durchlauf alle nachrichten abholen. Da sie sonst verloren sind. Du must auch unterscheiden ob du die Nachricht dringend brauchst ... dann must du für dich ein eigenes Protokoll erstellen das sicherstellt das der Daten Transver nicht nur erfolgt ... sondern auch abgeschlessen ist. Da du TCP und UDP verwendest kannst du für dringende und wichtige Nachrichten auf TCP zurückgreifen ... und nachrichten die auch mal verloren gehen können über udp. Sollte ich deine Problem irgendwie garnicht realisieren ...... dann versuch doch mal mit anderen Worten zu fragen. Gruss TFT PS: Schau dir mal Simple UDP an ... das kann dir einige hinweis zur problemstellung liefern. PS2: Das Betriebsystem stellt auch eingehende nachrichten in einen Massage Stack. Du bekommst immer alle nachrichten. Sofern die übertragung funktionierte. Diese werden beim lesen erst gelöscht. ..... wie weit der Stack reicht weis ich nicht. Daher ist UDP ja auch e twas Komplizierter. PS3: Benutze EOF(stream) um zu testen ob noch nachrichten anliegen. und lese alle nachrichten in einer While Schleife aus bis der Stream gelehrt ist. Wenn ich nochmer sage muss ich Code einstellen ...... |
||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
#ReaperNewsposter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hmm.. ok.
Also der Client-Port ändert sich auch bei UDP nicht, außer natürlich du lässt das dein Client-Programm machen. Ansonsten eben auch noch eine ggf. zufällige und sich nicht ändernde ID bei jedem Paket mitsenden. |
||
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7 |
![]() |
tft |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
wenn der Client hinter einem Router sitzt ... was heutzutage immer öffter der fall ist. Kann sich der sende Port schon alleine deswegen unterscheiden und sogar wechseln. ...... Gruss TFT |
||
TFT
https://www.sourcemagic.ch Monkey,HTML5,CSS3,W 10 64 Bit, 32 GB Ram, GTX Titan, W8 ist Müll !!!!!! |
![]() |
Silver_Knee |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also soweit ich weis regestriert der Router eine UDP "Verbindung" indem er sich die Ports merkt. Er kann aber durch aus bei der ersten Nachricht sich einen Client-Sende-und-Empfang-Port aussuchen den du verwenden musst.
Das mit der ID ist ein sehr guter Hinweis: Mach ein Array für jeden eingeloggten User und schick ihm den array-index. damit kannst du bei jeder Msg den user rausholen und die IP und den PORT vergleichen und deine nachricht abarbeiten. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group