Allgemeine Fragen zu Sockets (Winsock2)



  • Hallo zusammen,

    ich habe vor ein paar Tagen angefangen, mich in Sockets einzuarbeiten. (Bislang nur TCP). Mittlerweile habe ich einen einfachen Server/Client und der Server kann Strings beliebiger länge übermitteln 😃
    Natürlich habe ich jetzt ein paar Fragen:

    a) meistens verschickt man öfters ähnliche Daten - wie unterscheidet man am Besten zwischen den einzelnen "Paketen"? Ich habe das jetzt so gemacht, dass ich zunächst ein 2 Byte Integer mit dem Wert 0xFFFF (kommt bei Strings halt so gut wie nie vor) schreibe und damit einen neuen Wert kennzeichne. Danach kommt die Länge (4 byte) und dann die Daten. Was gibt es noch für gute Alternativen?

    b) Wie kann ich rausfinden, ob der Client / Server abgeschmiert ist? Momentan schau ich beim Schreiben, was der return Wert ist (wird ja zu SOCKET_ERROR wenn was schief läuft) aber nur weil ein send() > 0 zurückgibt, heißt es noch nicht, dass die Daten tatsächlich am anderen Ende angekommen sind sondern nur im Puffer gelandet sind, oder?
    Wenn ich z.B. einfach den Server oder den Client schließe, dann kriegt die andere Seiten den Fehler sofort mit (wenn keine Daten übermittelt werden, mache ich einfach ein send() mit 0 Bytes). Wenn ich allerdings die Netzwerkverbindung trenne, denken beide Applikationen, alles wäre im Butter.

    c) Mein Server läuft in einem eigenen Thread und hier drin habe ich mittels select() gearbeitet, damit möglichst wenige Funktionen blocken (mein Socket ist ein blocking-socket). Wie kann ich rausfinden, ob der Puffer (der mit send() gefüllt wird) bereit ist, neue Daten anzunehmen (und nicht blockt).

    Das wars fürs erste. 🙂
    Danke für jegliche Tipps!

    Gruß

    Mark



  • a)
    - verwende strukturen um deine daten zu versenden.
    - wenn du auf ein \0 stößt wäre das sicherlich auch ein zeichen für das ende der übertragung eines strings. dazu musst du eben byteweise bzw. gepuffert die daten aus den sockets auslesen, wenn meherer 'schlange stehen' und nicht einfach ALLES was grade ansteht. danach einfach die empfangenen daten an \0 in einzelen teilstrings splitten. tada 🙂

    b)
    abschmieren kann in dem sinne nur deine anwendung. (aber...) TCP is ein verbindungsorientiertes protokoll, es stellt immer sicher das alle daten und in richtiger reihenfolge ankommen. sicher kann es auch einen RST oder FIN geben. aber das wird dir dann durch ein SOCKET_ERROR bzw. durch die anderen fehlercodes mitgeteilt (evtl. auch erst nach entsprechenden timeout). aber du wirst immer davon kenntnis bekommen 🙂
    wenn du jetzt hier mit den begriffen nichts anfangen konntest, dann hock dich bitte nochmals hin in lern das OSI modell von layer 1-7 😉

    c)
    im select gibt es unterschiedliche fdSets für die jeweiligen dinge die du prüfen möchtest. fdRead für daten zum abruf. fdWrite für bereitschaft zum senden.
    die MSDN sollte dir hier sicherlich mehr infos geben können 🙂

    grützi
    RadiatioN Off



  • c) auf jeden fall auf non-blocking umschalten


Anmelden zum Antworten