Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

07.07.2007, 16:20

Datastreaming mit Winsock

Hallo

Ich bin gerade dabei ein kleines Netzwerk Programm zu schreiben, dass Daten über das Netzwerk an einen Host im Netz versendet. Der Cient kann dabei den Datenstrom stopen und starten.

Der Aufbau sieht folgendermaßen aus:
Der Server sendet die Daten in einer Schleife. Am Anfang dieser Schleife wird immer auf Daten die vom Client gesendet werden abgefragt. Wird ein bestimmter Befehl vom Client empfangen so wird die Schleife verlassen und das Programm verlassen. Das funktioniert auch in den meisten Fällen ohne Probleme. Der Client kann den Server Stopen und wieder Starten jedoch in manchen Fällen wird der Befehl vom Client gesendet aber wie es aussieht vom Server nicht empfangen und so wird nur der Client heruntergefahren.

Meine Vermutung ist, dass der Sende Befehl vom Client gleichzeitig mit dem Sende vom Server aufgerufen wird und so Daten verloren gehen.

Doch das sollte bei den sockets mit dem Type SOCK_STREAM nicht basieren oder?

Kann mir einer Bitte mit diesen Problem weiterhelfen Danke.

Mögliche Lösung die mir noch einfiehl wäre zum Beispiel ein weiteres Socket anzulegen und die Start Stop Befehle über diese Socket abzuwickeln und die Daten über das biesherige Socket zu schicken.

2

07.07.2007, 18:23

Könnte sein das di in deinem Programm die Verbindung trennst bevor die Daten komplett beim Server angekommen sind. Dieses Problemm hatte ich zwischen einem C++ Client und einem Java Server.

Bau mal ein sleep ein bevor du die Verbindung trennst und das Programm beendest. Eventuell reicht das.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

08.07.2007, 13:31

Oder man macht es sauber und beendet eine Verbindung so, wie sie bei TCP/IP auch aufgebaut wird: 3 Way-Handshack-like ;)

Client sendet "ByeBye"
Server empfängt "ByeBye"
Server sendet "ByeBye"
Server fährt sich runter
Client empfängt "ByeBye"
Client fährt sich runter


Gute der dritte Schritt existiert hier nicht, aber die Lösung ist auf jedenfall sauber :)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

4

09.07.2007, 22:34

Hallo
Danke Chriss und Nox habt mir schon weitergeholfen.

Von Chriss der Vorschlag mit dem Sleep Befehl hat das Problem beseitigt.
Der Ansatz von Nox hat Leider nicht funktioniert. Es kamm immer noch der selber Fehler trotz toppelter Handshake.

Ich vermute mal das sich beim Client im Empfänger Speicher noch Daten von Daten streaming befinden, die nocht nicht ausgelesen wurden. Erst beim Auslesen des eigentlichen Stop Befehles werden fälschlicher Weise diese Daten eingelesen. Da diese Daten jedoch nicht dem Stop Befehl entsprechen kommt es zu einen Fehler.

Wie kann man sich den Empfangssepeicher eines Sockets vorstellen.? Ist das ein Stapelspeicher oder wie kann man auf diesen Zugreifen auser send und recv.
Kann man vielleicht den Empfangssepeicher irgendwie löschen?

Danke schon mal :)

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

5

10.07.2007, 10:07

Eine ähnliche frage hab ihc mir auch schonmal gestellt(die was mit dem empfangspuffer zu tun hat) und jetzt poste ich die einfach mal hier, bevor ich einen extra thread aufmache.

Stellt euch folgendes vor: es gibt einen server und der client connected zu diesem server.

Dann sendet der Client 2 mal daten an den Server:
1) "Hallo"
2) " Welt"

Was er sendet ist eig egal. Nun stellt sich mir aber die frage, ob der server dass dann alles mit einem einzigen aufruf von recv empfangen kann.
Dass er also den String "Hallo Welt" empfangen hat?
Oder muss ich recv dann auch 2 mal aufrufen?

Socke

EDIT
Den empfangspuffer(wie auch immer man das nenen will) leeren, ist ganz einfach:
Du ruft einfach in einer schleife recv auf und empfängst immer ein byte. das darfst du aber nru solange machen, wie noch daten da sind(mit select überprüfen).
Das byte kannst du ja irgendwo speichern, es wird ja net weiter benötigt.


Socke

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

10.07.2007, 10:27

Klar kann er das auf einmal auslesen. Solang die Daten im Stream verfügbar sind. Er kann aber auch öfter als zweimal im Stream anfragen ohne das er beide String bekommt.
@D13_Dreinig

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

7

10.07.2007, 10:29

Danke. tut mir ja echt leid, dass ich diesen thread für meine fragen missbrauche:
Kann man die Zeichen 1-4 aus der ASCII Tabelle eigentlich auch übertragen, oder werden die intern verwendet? Das würde meinem "Protokoll" (auf anwendungsebene) nämlich sehr zugunsten kommen.



Socke

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

10.07.2007, 10:34

Du kannst grundsätzlich alles übertragen was in ein char passt.
@D13_Dreinig

9

12.07.2007, 21:01

Hallo

Danke für die vielen Antworten. Aber ich sitz immer noch an meinem Problem.
Ist der "Eingangsbuffer" eines Sockets ein "Stapelspeicher" oder eben nicht?

Denn wenn ja dann glaub ich das Problem bei meiner Anwendung gefunden zu haben. Es werden vermutlich nicht alle Daten vom Steaming ausgelesen und so wird beim Beenden fälschlicherweise Daten vom Streaming eingelesen anstatt dem Stop Befehl.

:)

Werbeanzeige