Erhalten Paket von Paket-Daten über TCP-socket?
Habe ich einen tcp-socket, auf dem ich empfangen von video-Streams. Ich möchte Daten empfangen, die als Paket von Paket von der Buchse, so dass ich entfernen konnte, der Paket-header und halten nur die stream-Daten. Wie kann ich dies tun??
jede Hilfe wird geschätzt.
- Was meinst du mit "Paket"? Wenn Sie sprechen über die IP-Pakete, dass wird bereits für Sie getan. Oder meinst du deine video-streaming-Protokoll verwendet einige höhere level-Paket, sendet es über TCP?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht.
TCP
funktioniert nicht mit Paketen /Nachrichten etc.TCP
arbeitet mit bytes. Sie bekommen einen stream von bytes. Das problem ist, dass es keine Garantie hinsichtlich der Anzahl der bytes, die Sie erhalten jedes mal, wenn Sie Lesen von einem socket. Der übliche Weg, dies zu behandeln:Ihre Botschaft könnte sein:
Was werden Sie dann tun müssen ist, Lesen 4 Byte und dann Lesen Sie so viel wie diejenigen, die 4 bytes, sagen Sie. Dann werden Sie in der Lage, Streifen den header und die Daten.
tap
- Schnittstelle (OpenVPN hat sogar ein windows tap-interface) implementieren Sie eigene TCP-Protokoll-stack, und auch eine API bereitstellen, mitSTREAM
Sichtbarkeit der Pakete; das ist aber eine Menge Arbeit.SCTP
. Die Implementierung eines TCP-stack ist in vieler Hinsicht schwieriger als die Implementierung alles andere in einem Betriebssystem.TCP ist ein streaming-Protokoll. Sie bekommen bytes ohne Nachricht an Grenzen. Die Lösung ist ein Puffer, alle Ihre lese-und Extrakt - /Prozess-volle video-Pakete aus dem Puffer.
Algorithmus:
recv()
auf den Puffer, und gehen Sie zu #2.Was für ein "komplett-Paket" enthält, sollte definiert werden, indem der video-streaming-Protokoll.
TCP ist ein stream-Protokoll, und es nicht garantiert, dass beim Aufruf socket read-Funktion erhalten Sie eine komplette packet. UDP oder SCTP sind Paket-orientierte Protokolle und garantieren diese. Für TCP können Sie Teil des Pakets oder paar Päckchen auf einmal. Bauen Sie Ihre eigene Anwendung Protokoll auf TCP und fragmentieren/defragmentieren-Nachrichten manuell.
Wie andere erwähnt haben, TCP ist ein streaming-Protokoll. Dies bedeutet, dass aus einer API-Sicht, es gibt kein Konzept des "packet". Als Nutzer, alles, was Sie erwarten können, ist ein Strom von Daten.
Intern TCP bricht der stream in Segmente, die platziert werden können, in IP-Pakete. Diese Pakete werden gesendet, zusammen mit control data, over-IP, zu dem entfernten Ende. Die Gegenstelle diese IP-Pakete. Es kann entsorgt werden bestimmte IP-Pakete (im Falle von Duplikaten), die Reihenfolge der Pakete oder Daten zurückzuhalten, bis früher Pakete angekommen sind. All dies ist intern TCP Bedeutung für das Konzept einer "TCP-Paket" ist bedeutungslos.
Könnten Sie in der Lage sein, um die Verwendung von raw sockets zu erhalten, die raw-IP-Pakete, aber das wird bedeuten, dass Sie haben zu implementieren viel von dem TCP-stack (wie das versenden von Bestätigungen und anpassen der Größe des Fensters), um das remote-Ende korrekt durchzuführen. Sie wollen nicht, dies zu tun.
UDP, auf der anderen Seite, ist ein Datagramm-Protokoll. Dies bedeutet, dass der Benutzer darauf aufmerksam gemacht wird, wie die Daten über das Netzwerk gesendet. Wenn das Konzept der Pakete oder Datagramme für Sie wichtig sind, werden Sie brauchen, um zu bauen Ihr eigenes Protokoll auf der Oberseite des UDP.
Sind Sie ziemlich sicher, dass über diesen Ansatz? Meiner Meinung nach sind diese "Vorverarbeitung" wird die Einführung eines zusätzlichen overhead auf dem system. Und das ist natürlich behandelt, indem eine untere Schicht Lesen (über OSI-Modells), so ist es nicht einfach zu ändern. Beachten Sie, dass die meisten der bestehenden streaming-Protokolle sind bereits optimiert für die beste Leistung.