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

WhiteMike

Alter Hase

  • »WhiteMike« ist der Autor dieses Themas

Beiträge: 507

Wohnort: Ulm

Beruf: Schüler

  • Private Nachricht senden

1

01.09.2009, 15:00

[C] recv - ohne einen Limit des Puffers angeben zu müssen

Hallo, Leute! :)

Ich bin schon seit einer Weile nach der Suche für eine Lösung, wie man einen C-Server programmieren kann, der schlichtweg ohne Limit für die emfangene Nachricht arbeiten kann.
Kann da jemand seine Erfahrung mit mir teilen? :>

Vielen Dank im Voraus,
WhiteMike

Mit freundlichen Grüßen,
WhiteMike

2

01.09.2009, 15:04

Unter welcher IP und mit Welchem Port kann ihc den erreichen, um meinen Schadcode einzuschleusen?

Die Limitierung hat ja schon einen Sinn.
Du reservierst ja Speicher, in den die angekommenen Daten geschrieben werden. Wenn du jett keine Maximalgröße beim Empfangen angibst, würden ja Speicherbereiche beschrieben, die für etwas anderes vorgesehen sind.

Was stört dich denn so an diesem Limit?
1. kannst du es ja angeben.
2. kannst du ja in einer Schleife empfangen und dann auch den Rest annehmen

WhiteMike

Alter Hase

  • »WhiteMike« ist der Autor dieses Themas

Beiträge: 507

Wohnort: Ulm

Beruf: Schüler

  • Private Nachricht senden

3

01.09.2009, 15:30

Mit Schadcode und Überschreiben von anderen Bereichen hat es erstmal nichts zu tun. Man muss ja nichts absichtlich falsch machen.
Du kannst dir ja dazu die nicht ganz im Standard enthaltene Funktion getline() anschauen. Dort kann auch eine beliebige Länge eingelesen werden und gerade deswegen stellt sie keine Gefahr dar.

Das mit der Schleife wäre eine Option, nur habe ich dazu keinen Code gefunden, der das verdeutlicht. Kannst du einen Beispiel geben?
Aber fällt dabei nicht für jede Nachricht ein extra Header an?

Es geht mir dabei darum, dass eine andere Anwendung nicht auf den Limit achten muss, da sie wahrscheinlich in einer Sprache geschrieben sein wird, in der es sowas nicht gibt.
Diese wird standardmäßig einfach nur ein Packet mit dem ganzen Inhalt unter einem Header senden.

:edit:
Würde das hier funktionieren?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
char    *buffer     = NULL;
char    tmp[128]    = "";
int     buffersize  = 128;
int     n       = 0;

buffer = malloc(buffersize * sizeof(char));
buffer[0] = 0;

while ((n = recv(s, tmp, 128, 0)) > 0) {
    tmp[n] = 0;
    if ((strlen(tmp) + strlen(buffer)) >= buffersize) {
        buffersize = buffersize * 2;
        buffer = realloc(buffer, buffersize * sizeof(char));
    }
    strcat(buffer, tmp);
    if (buffer[strlen(buffer) - 1] == '\n') {
        ParseData(buffer);
        buffersize = 128;
        free(buffer);
        buffer = malloc(buffersize * sizeof(char));
        buffer[0] = 0;
    }
}


Und nachdem du dich auszukennen scheinst, kannst du vielleicht nach eventuellen Sicherheitslecks schauen? :>

Mit freundlichen Grüßen,
WhiteMike

4

01.09.2009, 16:09

Sofern du nur mit Strings arbeitest, sollte das funktionieren.
Bei der Kombination von C++ und Java hatte ich mal Probleme mit der Codierung, darauf sollte man dann achten.

Etwas robuster wäre der Code wenn du anstelle von

C-/C++-Quelltext

1
buffersize = buffersize * 2; 
folgendes schreibst

C-/C++-Quelltext

1
buffersize += n;

Anstelle von strcat würde ich memcpy nehmen.

Nur musst du auf den ersten Parameter achten.
Also erstmal

C-/C++-Quelltext

1
int lastPos = buffersize;
und dann später

C-/C++-Quelltext

1
memcpy(&buffer[lastPos],&tmp[0],n * sizeof(char));


Das sind aber nur Vorschläge und ist nicht zwingend.

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

5

01.09.2009, 18:27

Zitat von »"WhiteMike"«

Würde das hier funktionieren?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
char    *buffer     = NULL;
char    tmp[128]    = "";
int     buffersize  = 128;
int     n       = 0;

buffer = malloc(buffersize * sizeof(char));
buffer[0] = 0;

while ((n = recv(s, tmp, 128, 0)) > 0) {
    tmp[n] = 0;
    if ((strlen(tmp) + strlen(buffer)) >= buffersize) {
        buffersize = buffersize * 2;
        buffer = realloc(buffer, buffersize * sizeof(char));
    }
    strcat(buffer, tmp);
    if (buffer[strlen(buffer) - 1] == '\n') {
        ParseData(buffer);
        buffersize = 128;
        free(buffer);
        buffer = malloc(buffersize * sizeof(char));
        buffer[0] = 0;
    }
}

Also ich sehe da einen Bufferoverflow. Je nachdem, wie der Compiler die Stackvars anlegt kann man dein Programm so vielleicht ausschalten, aber eher unwahrscheinlich. Trotzdem würde ichs beheben ;) Ich sag mal nicht wo, schließlich will das Verweigern von stl Containern bestraft sein :)

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

6

01.09.2009, 21:31

Hm, ist es denn aus Netzwerktechnischer Sicht überhaupt sinnvoll, sehr große Pakete zu haben?
Ein Paket kann immer mal verloren gehen und muss dann neu gesendet werden. Zumindest passt TCP/IP imo darauf auf.

Ich kenne mich nicht wirklich gut aus, aber ich kann mir gut vorstellen, dass so etwas viele fiese Probleme machen kann,
Lieber dumm fragen, als dumm bleiben!

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

01.09.2009, 21:45

Ja und nein. Für UDP schickt man echt nur ein einzelnes Paket. Bei TCP kümmert sich TCP um das aufspliten etc. Man kann da also den Socket wie einen Stream nutzen. Daher wäre diese grundlegende Frage schonmal wichtig: UDP oder TCP?
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.

Werbeanzeige