send/recv struct



  • Hallo,

    ich beschäftige mich gerade mit Sockets. Ich habe einen Client geschrieben, der einen struct an einen Server versendet.

    struct foo {
    	int i;
    	char c;	
    };
    
    foo bar;
    
    Sender:
    
    sendto(s, &bar, sizeof(foo), 0, sa.sa.ai_addr, sa.ai_addrlen);
    
    Empfänger:
    
    recvfrom(s, &bar, sizeof(foo), 0, (struct sockaddr*)&sin, &sin_len);
    

    Das was mich jetzt beschäftig ist die Frage, wenn der Client auf seiner Seite foo anders definiert, indem er zum Beispiel den Integer wegnimmt und weitere character hinzufügt, ist das verhalten des Server beim empfang doch nicht mehr definiert.
    Doch wie kann ich verhindern, dass der Server das Pakte nicht falsch interpretiert und gegebenenfalls verwirft?

    Gruß ICH_



  • Sofern dieser Server auch von dir programiert wird, kannst du doch selbst entscheiden was mit den empfangenen Daten passiert.
    Falls es sich bei dem Server um ein schon fertiges Programm handelt von dem du keinen Quellcode hast musst du dich natürlich an die Regeln des Servers halten.

    Falls ich dich falsch verstanden habe, schreibe bitte etwas mehr zu deinem Problem.



  • Es geht mir vor allem um den Sicherheitsaspekt, wenn jemand seinen eigenen Sender baut und eben nicht die zuvor definierte Struktur verwendet, muss es doch eine Möglichkeit seitens des Empfängers geben das falsche Paket zu erkennen.

    Wenn ich einen string versende, kann ich ihn nach meinen Kriterien parsen, doch wenn ich die Struktur in einen string aufteile und dann noch parse steht das ja nicht im Verhältnis, gegenüber dem Versenden einer Struktur.



  • Ohne weiteres wird ein Paket nur dann als falsch erkannt, wenn die Daten falsch sind. Send erwartet zeiger auf char und recv ebenfalls.
    dass du nun eine Struktur foo hast, ist in diesem Sinne irrelevant, weil halt einfach nur bytes gesendet werden.
    In deinem angegebenen Beispiel wird der Server nicht wissen, dass er eine Struktur foo bekommt, der legt die Daten einfach blind an der Speicheradresse dieser Struktur ab und hofft dass es klappt (was es ja auch tut, weil du diese Struktur ja nunmal sendest)

    Wenn du also prüfen möchtest ob das korrekt ist oder nicht musst du dir schon eigene Mechanismen überlegen.

    Die wohl einfachste jedoch auch unsicherste Methode wäre einfach die Größe der empfangen Daten zu überprüfen (eine gefüllte foo-struktur hat halt eine bestimmte Größe).

    Besser wäre jedoch die Daten in einer speziellen Formatierung die der Server versteht in einen String zu packen.

    Dabei könntest du die erforderlichen Daten dann entweder in einer vordefinierten Reihenfolge, jeweils durch ein Trennzeichen getrennt, angeben oder do packst vor jeden Wert noch eine Art schlüsselwort wie z.B.

    "i-Wert:4:c-Wert🅱\t\n"

    und parst das dann.

    Falls du komplett verhindern möchtest, dass jemand ohne weiteres einen eigenen Sender baut, kannst du den ganzen Kram ja dann auch noch verschlüsselt machen.
    Da kann man seiner Fantasie freien Lauf lassen und man darf nicht vergessen, dass das ja nciht alles in einem Rutsch zu geschehen hat.
    Z.B. sollte der Client den Server erst darüber informieren was er jetzt vor hat und eine Antwort vom Server abwarten.
    Die Antwort des Servers könnten dann Informationen bezüglich der Verschlüsselung enthalten usw.


Anmelden zum Antworten