VS Aufgabe 2 - Puffer/Kommunikation

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

VS Aufgabe 2 - Puffer/Kommunikation
In der Aufgabe heißt es ja, dass es einen Puffer geben soll und send sofort zurückkehrt …

übergeben bekomme ich ja ein Address*, ein Buffer* und einen int … die nun in eine Liste speichern und einen neuen Thread erzeugen, der dann immer das älteste Element des Puffers/der Liste nimmt, es aus der Liste löscht und sendet … oder?

Wie kopiere ich mir da im Speicher das Address* Objekt, das ja eigentlich ein InetAddress oder RCXAddress Ding ist?

Nächste Frage: Sollte man sich den Empfang einer Nachricht bestätigen lassen? UDP und serielle Kommunikation sind ja nicht zuverlässig … Prüfsummen?

Wie stellt man fest, wenn eine Nachricht zu Ende ist? Bei UDP “merkt” es receive ja … aber über rcx-sim/seriell? Da geht ja immer nur ein Byte pro Nachricht, oder wie?

Die Aufgabe erschien mir ja eigentlich ganz einfach, aber mit dem ganzen Zeug was der Compiler immer an Fehler ausspuckt, dem ewigen Debuggen, und einem Volksfest im Nacken … wie soll man das bis Montag fertig kriegen, auf einem RCX getestet haben und dabei noch irgendetwas für ein andere Fächer getan haben?


Ich wuerde sagen dass man diese Fragen erst sinnvoll bearbeiten kann wenn man sich ueber das Protokoll im klaren ist. Das ist aber noch nicht teil der Aufgabe… Also ich werde versuchen diese Fragen irgendwie geschickt zu umgehen


Bei mir gibt es eine BufferStruct, die sieht so aus:

struct BufferStruct;
struct BufferStruct
{
    Address* addr;
    Buffer* buffer
    BufferStruct* next;
}

class CommunicationSystem
{
    [...]
    BufferStruct* send_buffer;
}

Es gibt einen send-thread, der wird in main() einmal gestartet, und sendet dann alles, was er in der BufferStruct finden kann.

Was meinst du mit „wie kopiere ich…“?

InetAddress a1(„faui05a…“, 4711);
InetAddress a2(strdup(a1.ip), a1.port); // Kopie von a1

Also bei mir gibt es keine Prüfung, wenn ich was sende kommt es auch an. Beim RCX habe ich die Pufferverwaltung vom UNIX Part genommen, aber anstatt

sendto(fd, buffer, ...

habe ich

for (int i = 0; i < buffer_length; i ++)
   sendchar(buffer[i]);

sendchar(0);

gemacht. Ich sende also ein NULL-char als end sign.

Im Empfänger sieht das dann so aus:


memset(buffer, 0, 1024);

while ((buffer_pos == 0) || (buffer[buffer_pos - 1] != 0))
{
    buffer[buffer_pos] = rcvchar();
    buffer_pos ++;
}

Das mit dem Puffer habe ich ebenso gelöst. Bei der Kopie meinte ich wie man denn ein Address-Objekt kopieren soll, damit es trotzdem noch ein RCXAddress bzw. InetAddress bleibt und man es noch zurückcasten kann. Da wird ja bei einem “new Address(oldaddr)” der falsche Kopierkonstruktor aufgerufen … egal, hab’s mit einer clone()-Methode gelöst.

“0” als Ende anzusehen ist gefährlich. Du sendest später nicht nur Strings über die Leitung sondern BINÄRDATEN … da können beliebig viele Nuller drin vorkommen … besser wäre es am Anfang die Länge der noch folgenden Daten zu übertragen oder etwas ähnliches. Für die Übertragen über Infrarot wären evtl. Bestätigungen der Übertragung sinnvoll …

Oder nicht?