2012-03-29 13 views
4

TCP ist stream-basiert, dh, Sie senden Bytes, ohne dass diese sich notwendigerweise in einer "Nachricht" befinden, sodass der Empfänger eine halbe Nachricht oder ein und zwei Drittel der Nachrichten erhalten kann.Senden von Nachrichten in einem TCP-Stream

Also in etwas wie ein Spiel, in dem jede Nachricht eine feste Größe ist, wenn ich einen Teil einer Nachricht erhalte, könnte ich es einfach in einem Puffer behalten, bis ich den anderen Teil erhalte. Das ist ein bisschen mühsam, aber gibt es ein anderes auf Nachrichten basierendes zuverlässiges Protokoll? Es gibt wahrscheinlich, aber keine sind im Betriebssystem wie mit TCP und UDP implementiert, so dass ich einige Bibliothek verwenden müssen, was gut ist, solange es einfach zu bedienen ist.

Ich könnte immer ein einigermaßen zuverlässiges UDP-Protokoll machen. Was schlägst du vor?

Antwort

2

Sie könnten Ihr eigenes ACK-basiertes Protokoll über UDP implementieren. Stellen Sie die Nachricht mit einer Nachrichten-/Sequenznummer auf der Sendeseite vor und geben Sie diese Nummer auf der Empfangsseite an den Absender zurück. Starten Sie für jede Nachricht einen Zeitgeber auf der sendenden Seite und brechen Sie ihn ab, wenn Sie die entsprechende Bestätigung erhalten. Wenn der Timer erscheint, senden Sie die Nachricht erneut.

XMPP ist viel zu schwer für diese Anwendung.

+0

Als diese Frage erneut auftauchte, fiel mir ein, dass ich tatsächlich damit fertig wurde. – slartibartfast

+0

Der Begriff "unzuverlässig" um UDP kann Leute davon abhalten, es zu benutzen, aber meistens bedeutet es, dass zusätzliche Zuverlässigkeitsmaße nicht wie TCP in das Protokoll eingebaut sind. In einigen Kontexten werden Sie möglicherweise nicht benötigt oder sogar reproduziert, z. wenn Ihre Anwendung fehlertolerant ist oder wenn das Netzwerkdesign und die Datenlast die Fehler auf tolerierbare Werte reduzieren. In Echtzeitkontexten könnten diese Extras sogar ablenken. Für Ihren Gaming-Kontext ist UDP, das auf diese Weise verwendet wird, sehr verbreitet. – omatai

0

Sie können einen Blick auf XMPP werfen. Es ist ein TCP/IP-basiertes Protokoll, das auf XML-Nachrichten basiert.

+0

Vielleicht ist das ein bisschen langsam und schwer für Spiele? – slartibartfast

0

Protocol Buffers, ist weniger bekannt, dass XMPP aber in Ihrem Fall von Interesse sein könnte.

http://code.google.com/intl/en-US/apis/protocolbuffers/docs/overview.html

+0

Protokollpuffer sehen interessant aus. Ich werde es mir ansehen. – slartibartfast

+0

Es scheint keine offizielle C-Version zu geben und die von Drittanbietern sind noch nicht voll funktionsfähig. Erwähnen Sie dies, weil die Frage C markiert ist, nicht C++. – Ioan

+0

Diese Antwort ist für die Frage unerheblich. Protokollpuffer lösen das Netzwerkproblem nicht, es stellt nur die Serialisierung bereit. – kshahar

1

Wenn Sie Transportschichtprotokoll suchen, dann SCTP überprüfen. SCTP ist nachrichtenorientiert wie UDP und sorgt für einen zuverlässigen, sequentiellen Transport von Nachrichten mit Überlastungskontrolle wie TCP.

SCTP ist noch nicht weit verbreitet. Also schlage ich vor, TCP mit irgendeiner Art von Framing zu verwenden.

+0

Gibt es eine gute Bibliothek dafür? – slartibartfast

+0

Linux-Kernel hat Unterstützung dafür. Und auch BSD Kernel-Implementierung existiert. Ich kenne keine Windows- oder Userspace-Bibliotheken. – SKi

+0

http://www.bluestop.org/SctpDrv/ ist ein möglicher Treiber für SCTP unter Windows. – Ioan

1

Sie könnten ØMQ (ZeroMQ) als Ihre Messaging-Infrastruktur verwenden. ZeroMQ bietet eine zuverlässige Nachrichtenweiterleitung über TCP und andere Transportmechanismen. Es hat eine C-API und eine umfassende guide.

Beachten Sie, dass Sie eine externe Bibliothek für alle Peers verwenden müssten, aber Sie sagten, dass das OK für Sie ist.

Verwandte Themen