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

25.03.2015, 10:52

UDP - Zugeschickten String richtig ausgeben

Hey Leute,

ich habe gerade ein kleines Testprogramm geschrieben, welches mir einen String von einer Java Anwendung per UDP zu einer C++ Anwendung schickt.

Nun ist das Problem, dass Java seine String nicht mit \0 beendet. Wenn ich den String also als Byte Array verschicke und in c++ als char Array empfange, dann wird das gesamte Array, also auch die Teile, die nicht empfangen wurden, weil die Nachricht kürzer als der Bufer war, ausgegeben.

Gibt es eine Möglichkeit den String in c++ richtig ausgeben zu lassen? Ist nämlich auch doof, wenn ich zuerst eine Nachricht "Wie gehts es dir" schicke und als nächstes eine Nachricht "Hey" schicke, dann steht nämlich im bufer Array:


Gruß
T

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

2

25.03.2015, 10:53

Was spricht denn dagegen beim Senden einfach eine \0 dran zu hängen? Oder einfach die Länge des Strings mit zu schicken?

3

25.03.2015, 11:02

Eigentlich nichts, aber mich würde halt interessieren, ob es andere Methoden gibt, sprich ob man evtl. in C++ irgendwie die Länge der empfangenen Bytes herausfinden kann, weil rein prinzipiell müsste der Empfänger ja wissen, was an ihn gesendet wird.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

25.03.2015, 11:06

Die winsock recv Funktion gibt dir die Anzahl der empfangenen Bytes zurück. Die wirst du später eh brauchen sobald du in den Fall kommst das eine Nachricht gesplittet ankommt.

5

25.03.2015, 11:38

Wie genau komm ich da denn ran? Ich sehe da nur den int Pointer, welcher die Länge des SOCKADDR_IN repräsentieren soll, welche auch scheinbar immer gleich ist...

CentuCore

Frischling

Beiträge: 43

Wohnort: Wien

  • Private Nachricht senden

6

25.03.2015, 11:45

Die Funktion gibt dir die Anzahl an. Nicht die SOCKADDR_IN Struktur.
(per Rückgabewert)

7

25.03.2015, 12:28

Moment, ich glaube jetzt reden wir aneinander vorbei. Die Funktion recvfrom gibt zwar einen Integer zurück, dieser scheint aber für die Fehlerbehandlung zu sein. Nur wenn der Rückgabewert != 0 ist, dann ist die funktion fehlerlos ausgeführt worden.

Der Parameter:
_Inout_opt_ int *fromlen

Wird in dem Beispiel hier: https://msdn.microsoft.com/en-us/library…v=vs.85%29.aspx

mit &SenderAddrSize gefüttert.
SenderAddrSize wird am Anfang auf sizeof(SenderAddr) gesetzt. Lasse ich diesen Punkt weg, bekomme ich bei der Ausführung einene Fehler,
außerdem verändert sich der Wert von SenderAddrSize nicht nach dem Aufruf von recvfrom ...

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

8

25.03.2015, 12:31

Mal direkt aus deinem Link kopiert: If no error occurs, recvfrom returns the number of bytes received.

9

25.03.2015, 12:41

Alles klar, danke habe da wohl einfach drüber hinweg gelesen.
Bei mir ist der Rückgabewert allerdings 0, sprich die Socket Verbindung wird "gracefully closed" (was auch immer das heißt).
Jetzt stelle ich mir die Frage, wieso der Socket geschlossen wird bzw. was da eigentlich passiert, denn wenn noch eine Nachricht an meinen "Server" gesendet wird, kann er diese immer noch empfangen, was bei einem geschlossenen Socket eigentlich nicht gehen sollte.

€dit:

Okay habe folgende Aussage gefunden:

Zitat

Anders als bei recv deutet ein Rückgabewert von 0 nicht auf das
Beenden einer Verbindung hin! Es handelt sich um ein völlig
legitimes, leeres Paket.


Das kann aber nicht stimmen, da die Nachricht ankommt !? :?:

€dit2:

Es liegt wohl hierran:

Quellcode

1
2
3
4
5
6
7
8
9
int DatagramSocket::recvfrom(char* buf, int length, SOCKADDR_IN *from) {
    int fromlen = sizeof(*from);
    int result;
    if (result = ::recvfrom(s,buf, length, 0, (sockaddr *)from,&fromlen) == SOCKET_ERROR) {
        cout << WSAGetLastError();
        throw IOException("Fehler beim Empfang. Error: ");
    }
    return result;
}

Wieso funktioniert die Zuweisung im if nicht? Dachte sowas würde gehen!?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Tockra« (25.03.2015, 12:55)


Tobiking

1x Rätselkönig

  • Private Nachricht senden

10

25.03.2015, 13:15

Schau mal was du in der Bedingung dem result wirklich zuweist. Kleiner Tipp, es ist nicht der Rückgabewert.

Werbeanzeige