C Cleint Programm stürzt ohne Fehlermeldung ab

lolilol

Mitglied
Hallo,

ich sitze gerade an einer Aufgabe für die Uni. Es ist ein kleines (auto, schiff, etc.)-Quartett Spiel mit einem Server und x-clienten.

Ich teste mit derezeit 2 Clienten.

Derzeit stürzt einer oder beide der Clienten jedoch immer ab. Das seltsame dabei ist jedoch, dass sich weder fest machen läst welches das Clientprogramme das ist (also egal, mit welchem ich mich zu erst zum server verbinde und welcher dadurch zuerst die daten bekommt).

Auch ist der Moment des Abruchs immer unterschiedlich. Er zirkuliert zwar um einen bestimmten Bereich der Kommunikation, ist aber nicht genau festzumachen.

Eine Fehlermeldung bekomme ich nicht.

Hat einer eine Idee, woran das liegen könnte? Windows Speicher Restriktionen oder so (auch wenn dass mir unwahrscheinlich erscheint)? Oder irgendwas anderes?


Eine weitere Frage am Rande: gibt es eine Möglichkeit aus einer union auszulesen, welche der variablen besetzt ist?

Vielen Dank,
loli

PS: Arbeite gerade unter WinXP Prof mit Dev-C++ und es ist ein Konsolenprogramm.

PPS: Falls jemand trotz der Zufälligkeit meint das Problem könnte im Code liegen: http://www.theinsanewonderland.com/loli/quartett/
-edit- mir fällt gerade auf, dass Doxygen den Quelltext nicht zur verfügung stellt: sollte er gewünscht sein, einfach nachfragen -/edit-
 
Zuletzt bearbeitet:
Zu Deinem Absturzproblem kann ich zwar jetzt nichts sagen, aber die Frage mit der Union kann ich dir beantworten.
Die Antwort lautet: alle
Alle Teile eines Union greifen auf den gleichen Speicherbereich zu. Daher kannst du ja in den Einen schreiben und aus dem Anderen lesen.
Beispiel:
Code:
union MyUnion {
  struct t_date {
    char[2] Tag;
    char[2] Monat;
    char[4] Jahr;
  } Datum;
  char[8] DatumText;
} DateUnion;
Man kann also mit
Code:
strncpy(DateUnion.DatumText, "24122006", 8);
ein Datum als Text eintragen und die einzelnen Komponenten z.B. mit
Code:
char[2] Tag;
strncpy(Tag, DateUnion.Datum.Tag, 2);
auslesen. Die Anfangsadressen der Member 'Date.Tag' und 'DateText' sind gleich, d.h. es gibt in dieser Union nur einen Speicherbereich von 8 chars, der sowohl von Tag-Monat-Jahr als auch von DateText genutzt wird.
 
Hallo,

danke für die Antwort, das Problem liegt jedoch anderweitig.

Ich hab z.B. folgende union:
Code:
union union_u {
  char[16] text;
  long int integerNumber;
} union_t;

Jetzt sende ich diese über das Netzwerk - hop - und empfange sie auf der anderen Seite.
Hier will ich dem Benutzer den Inhalt ausgeben: Nur wie?

Wenn ich
Code:
printf("%s", union_t.text);
verwende kommt im Textfalle etwas sinvolles heraus, bei einer gespeicherten Zahl nur sinnloser Zeichensalat.

Ebenso nur andersherum bei
Code:
printf("%li", union_t.integerNumber);

Idee?

Gruß,
Oskar
 
Hi.

Das Problem ist, dass du natürlich auf der anderen Seite wissen mußt was in der union jetzt "drin steckt". Das mußt du dir einfach extra merken.

Bsp:
C:
struct {
  enum { num, text } type;
  union {
    char text[16];
    long int num;
  } value;
} numtext;

int main() {
  numtext.type = num;
  numtext.value.num = 1111;

  switch (numtext.type) {
  case num:
    printf("%ld\n", numtext.value.num);
    break;
  case text:
    printf("%s\n", numtext.value.text);
  };

  return 0;
}
Gruß
 
Es tut mir ja leid, Dich enttäuschen zu müssen, aber so wird das auch nicht gehen. Dafür ist die 'union' nicht gemacht.
Wenn Du Daten unterschiedlicher Art über das Netzwerk versendest, mußt du dem Empfänger mitteilen, welcher Art die Daten sind. Du sendest also zuerst eine Datentypbeschreibung (z.B. ein Byte mit einem bestimmten Wert, der einen Typ bezeichnet), dann kommt normalerweise noch die Länge des Datenblockes und danach sendest Du den Puffer mit den Daten.
Der Empfänger liest also alles ein und entscheidet anhand der Typbeschreibung, wie mit den empfangenen Daten umzugehen ist.
Wenn Du unbedingt die union verschicken willst (was ich so nicht tun würde), dann achte darauf, daß Deine union immer 16 Byte lang ist, also so groß wie das Größte seiner Elemente.
 
Zurück