sollte ich die while(true) zum empfangen von Daten von Socket?
Bitte meine Vorherige Frage zum code-Beispiel Steckdosen: manchmal (selten) werden die Pakete verloren während der Empfang
Brauche ich zum empfangen von Daten immer von UDP-multicast-socket. Dieses ist one-way-comminication, ich brauche nur zu hören, für neue Daten und verarbeiten Sie es so schnell wie möglich.
Sollte ich while(true)
? Ich weiß nicht, wie while(true)
weil meiner Meinung nach diese produzieren eine Menge extra-Arbeit für den Prozessor. Wahrscheinlich c# bietet die call-back-Techniken, oder was?
Welche konkreten Aufruf sind Sie zu hören, für neue Pakete? es gibt viele Möglichkeiten, die getan werden kann, und es ist wichtig. Auch: was ist die Natur der Anwendung? Wie viele Sendungen ist es auch die Musik? wenn nur dieses eine (oder wenige), dann ein eigener thread und blockieren Lesen Sie fordert, ist wohl kein problem. Für einen dedizierten server mit Dutzenden oder Hunderte oder Tausende von verbindungen, werden Sie auf jeden Fall nutzen wollen callback-IO oder-Buchse.Wählen Sie.
Sollte ich darauf hören für mehrere Steckdosen (2 bis 6), ich bin mit der dedizierten thread für jeden Socket. Ich erhalte ~2000 Pakete pro Sekunde an jeder Steckdose
Sollte ich darauf hören für mehrere Steckdosen (2 bis 6), ich bin mit der dedizierten thread für jeden Socket. Ich erhalte ~2000 Pakete pro Sekunde an jeder Steckdose
InformationsquelleAutor javapowered | 2012-03-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
2 bis 6 Steckdosen (Kommentare) ist wahrscheinlich in der interessanten Stelle, wo entweder blockieren oder async-IO funktionieren, da Sie nicht überschwemmen die Maschine mit threads. Mit 2000 Paketen pro Sekunde, es klingt wie es gibt viel zu halten Sie die Fäden beschäftigt. Sie brauchen nicht zu befürchten
while(true)
aus einer Leistung Perspektive, da dieReceive
- Methode blockiert, bis Daten verfügbar sind, so ist es nie tun, einen hot-loop nichts zu tun. Allerdings! Persönlich, aus kosmetischer Sicht, ich bin damit einverstandenwhile(true)
ist ein unnötiger Schandfleck, also, wenn Sie die Blockierung Ansatz, vielleicht betrachten:die Ausfahrt sauber, wenn der socket geschlossen.
Du können auch tun dies entweder
BeginReceive
undSocket.ReceiveAsync
Methoden, die nicht mit einem blockierenden Aufruf, sondern verwendet entweder ein Ereignis oder einen Rückruf. Diese sind besonders nützlich beim Umgang mit vielen verbindungen.Persönlich, was ich eher zu tun ist, verwenden Sie
Socket.Available
; wenn dieser positiv ist, dann gibt es Daten gepuffert und bereit zu konsumieren, so dass eine einfacheReceive
verwendet werden können, zu Holen, dass die Daten unverzüglich und ohne Kontext-switch. Wenn er null ist, dann werden keine Daten derzeit zur Verfügung, so dass ein asynchroner Aufruf kann besser geeignet sein. Diese Salden context-switches mit direkte Anrufe. Beachten Sie, dass dieReceiveAsync
Ansatz hat das Baujahr auch über die return-Wert vonReceiveAsync
(das isttrue
wenn der Vorgang unvollständig ist, und eine callback-wird aufgerufen, später - undfalse
wenn die operation bereits abgeschlossen, und keine callback wird aufgerufen).Wahrscheinlich auch Sie wissen, warum ich verlieren pacekts 🙁 siehe meine verlinkten Frage
äh, ja... da man mit UDP. Das ist normal.
Marc, Nein, Nein, Nein. Eine andere Anwendung auf dem gleichen computer EMPFANGEN Pakete. Dies ist nicht etwa UDP. Wenn Paket geliefert WIRD, die UDP verwenden, dann übernehme ich ALLE Anwendungen auf dem host, MUSS es erhalten. Es ist nicht normal, dass ich sehen kann Paket von einer Anwendung, aber nicht sehen können, aus einer anderen Anwendung.
InformationsquelleAutor Marc Gravell
Den besten Weg für die sockets-Programmierung ist über Ihre Asynchronen Pendants. Stattdessen laufen endlos-Schleifen sollten Sie rufen BeginReceive und legen Sie die callback-Methode, die ausgelöst wird, nach Abschluss der übertragung. Auf diese Weise werden Sie behalten die Kontrolle über Ihre app und verwenden viel weniger Ressourcen.
Referenz: http://msdn.microsoft.com/en-us/library/bbx2eya8.aspx#Y0
Habe nichts zu beanstanden. Wird genauer in meine Antworten ab jetzt 🙂
InformationsquelleAutor Dmitry Reznik
Async-Methode ist die beste Lösung.
Jedoch in diesem Fall, wenn Sie während(true) ist, enthält die Buchse.Receive(buf) es ist keine zusätzliche Arbeit für den Prozessor, denn wenn du es nicht von einer timeout-die sockect block der Schleife, bis Daten ankommen.
InformationsquelleAutor pluka