Flush-socket in C++
Habe ich versucht zu Spülen, eine socket-nach dem Aufruf zu send
- Funktion in c++.
Ich verwendet winsock2.h
Bibliothek.
Muss ich senden die Daten sofort, nachdem die Nachricht senden, aber ich finde keine Funktion wie flash
Funktion.
Ich versuche zum senden von Nachrichten an ein Gerät, und Sie erwarten, empfangen von Nachrichten eine nach der anderen.
Ich meine, wenn ich senden von zwei Nachrichten-sender wie "MessageOne" und "MessageTwo", der Empfänger erhielt "MessageOneMessageTwo", die nicht trennen, und das Gerät nicht erkennt die Befehle.
So, wie ich es machen kann?
- Sie können dies überprüfen, previous post oder Gehen Sie durch die MSDN-Dokumentation in Bezug auf die gleiche
- Wenn das socket-TCP ist dann das erste, was zu tun ist, deaktivieren Nagle-Algorithmus
- Wenn Sie nicht brauchen, um etwas anderes zu tun auf den socket schließen würde, flush (wenn ein Verweilen ist nicht im socket-Optionen).
- hier die FAQ bezüglich der Deaktivierung Nagle tangentsoft.net/wskfaq/intermediate.html#disable-nagle
- nicht sicher, warum Sie richten Ihren Kommentar zu mir, aber danke. Wenn Sie impliziert, dass das deaktivieren Nagle-Algorithmus ist eine schlechte Idee, dann kann ich nur Antworten mit "richtigen Werkzeugs für die richtige Aufgabe", Nagle-algo ist deaktiviert, in den meisten low-latency-messaging-software.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es nichts, was Sie tun können, auf dem senden Seite machen die erhalten Seite Nachrichten empfangen 'one by one'. Ist ganz der Seite erhalten Verantwortung für die korrekte Rekonstruktion des gesendeten frames ('Nachrichten'). Erhalten code muss wissen, die Länge der Nachricht irgendwie (völlig Protokoll-spezifische) und erhalten so viele Daten gegebenenfalls zur Erstellung einer gesamten Rahmen (in der Regel erreicht durch Veröffentlichung von "recv" - Vorgang mit einer festgelegten Länge und angegeben, das interessiert nur auf den Puffer, wie zB.
MSG_WAITALL
flag). Ich finde es sehr schwer zu glauben, dass Ihr Gerät nicht weiß, wie damit umgehen, und wenn das tatsächlich der Fall ist, es gibt buchstäblich nichts Sie tun können. Ich finde es irgendwie wahrscheinlicher, dass Sie nicht verstehen, das Gerät/Protokoll-Anforderungen, und da Fragen Sie die falsche Frage stellen.Gibt es keinen "flush" Funktionen für sockets. Wenn Sie brauchen, um zu senden, werden zwei Nachrichten in rascher Folge, dann schicken Sie Ihnen einfach. Wenn es eine TCP-socket-dann kommen Sie in der richtigen Reihenfolge (die Reihenfolge, Sie schicken Ihnen in).
Dieses Muster ist eigentlich nicht ungewöhnlich; Zunächst senden Sie eine Nachricht header, gefolgt von einem separaten senden der message-Daten.
Die genaue Antwort auf Ihre Paket-Schema Frage mit einem Beispiel aus Winsock-FAQ
Meines Wissens es ist wirklich nicht eine "flush" - Fähigkeit. die senden-Funktion gibt an, wie viele bytes gesendet werden, so könnte man die Iteration einer Schleife, bis alle bytes gesendet werden.
Bearbeiten:
Hinzufügen zu dem, was ich gelesen habe, willst du von anderen Benutzern. Die einzige Möglichkeit, die ich kenne Erhöhung des "internen Speicher" (Spülung ist es etwas, winsock tut, auf seine eigene) setsockopt, mit der so_sendbuf option.
Artikel rund um die it:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms740476%28v=vs.85%29.aspx
set socket Optionen NDELAY auf der sendenden Seite