[C#] komische Probleme bei Sockets? oder mach ich was falsch?

fredlllll

Erfahrenes Mitglied
Folgende Situation:
Ich habe fürs Studium einen Generator für Fraktale geschrieben. Wenn ich den Algorithmus intern rechnen lasse (d.h. ich habe den Thread und die Ausgabe im selben Programm) kriege ich ein schönes Bild ohne jegliche Fehler. Ich hab mir jedoch gedacht es wäre toll, wenn ich zum Berechnen der Fraktale mehrere Pcs benutzen könnte. MulitCore support ist ja mit der .Net Runtime kein Problem, denn die legt verschiedene Threads auf die Kerne. Aber ich wollte mehr und habe angefangen meine "kerne" zu schreiben. Jeder Kern ist sozusagen ein Server der auf einem Pc läuft. Ich verbinde mich also mit meinem Programm zu jedem Server im Netzwerk, und gebe jedem Kern dann verschiedene Bereiche der Grafik mit, die Sie dann berechnen sollen. und hier kommts zum Problem. Der Kern berechnet die Daten, und schickt sie mir in der Form 15:X/Y/nummer zurück. Dabei stoße ich zuerst auf das Problem, dass Sockets einfach nachrichten aneinanderKetten, wenn sie schnell hintereinadner gesendet werden. das habe ich damit umgangen, dass ich hinter jede NAchricht einfach ein Environment.newLine gepappt habe. Die Strings sende ich via Encoding.UTF8.getBytes(""); und hole mir also am Client den String wieder. der hängt dann eben zusammen, was mich tierisch nervt >.<
Also trenne ich den string erst durch Newlines, dann hol ich mir den Code der vorne steht (15 in diesem fall) und dann schau ich mir die parameter an. Und jetzt zum eigentlichen problem. ich habe mal einen screenshot angehängt, wo ihr seht, wie mein Bild danach aussieht, erstens fehlen manchmal pixel wie es scheint. das kann daran liegen, dass es nicht so ganz funktioniert, mit dem Buffer, wenn eine nachricht abgeschnitten wird. dann hänge ich sie eigentlich vorne wieder dran, aber manchmal klappt das nicht =( weiß der Teufel wieso.
was mich aber eher aufregt, sind die hellen Punkte mittem im Schwarzen!! die gehören da einfach nicht hin! und der algorithmus ist exact der selbe wie der im Programm drin. also hab ich vermutet, dass da irgendwas mit der Übertragung nicht stimmt. Habe also einfach mal die nachricht 2 mal geschickt, der effekt war, dass die roten Punke weggingen (rot ist der hintergrund der Picbox) aber die Blauen blieben nach wie vor. und jetzt frage ich mich ernsthaft ob ich noch alle Tassen im Schrank habe, weil es kann doch nicht sein, dass ein algorithmus einfach an bestimmten stellen 100 mal durchläuft(oder mehr, je nach Iterationszahl), anstatt der erwarteten 3mal. (wenn die Eingabeparameter falsch wären würde das total anders aussehen)
Was mir dabei noch aufgefallen ist, ist, dass die Muster der Fehler bei jedem mal Identisch sind, also die schrägen linien links unten im bild z.B sind nach neustart beider programme wieder da.
hat irgendwer ne Ahnung wieso die Maschinen mir da derartig Streiche spielen? =(

/edit: ich hab jetzt mal das generierte vom kern lokal gespeichert. und das ist fehlerlos. also muss irgendwas bei der übertragung schiefgehen. aber was****?
 

Anhänge

  • fuu fehler.png
    fuu fehler.png
    107,6 KB · Aufrufe: 25
Zuletzt bearbeitet:
Hi

Betriebssystem? Code? TCP/UDP? ...?
Ohne tech. Infos können wir nur raten.

Es ist im Übrigen normal, dass mehrere Sends zusammengefügt bzw. auseinandergerissen werden.
Für die Sockets zählen nur die Byte; wo eine Nachricht anfängt und aufhört ist komplett egal..

Gruß
 
os win7 home premium 32 bit *schäm*
alles Tcp
und der code ist wahrlich etwas groß um ihn ins forum zu posten...
und wiegesagt, der kern rechnet richtig, nur die nachrichten kommen einfach falsch an.

gibt es dann eine methode womit man eben nachrichten in einem schicken kann**** oderzumindest etwas dass er mir meine nachrichten nicht zerhackt. jemand hat mir erzählt, dass man die sockets in c# auch wie die in java mit stream readern und writern benutzen kann. nur wie geht das?
 
Mit
Code:
new NetworkStream(socket, true)
bekommst du eine Stream-Instanz, die von den ganzen Readern etc weiterverwendet werden kann.

Das true bedeutet, dass mit dem Schließen dem Streams auch der Socket mitgeschlossen wird.
Wenn false muss das einzeln gemacht werden.

Gruß
 
vielen dank =) dann werd ich mich mal daran machen es zu implementieren. Wenn der Generator fertig ist, poste ich den source hier. halt als zip
 
Schreib doch mal probeweise die Daten, die die Clients berechnen, in eine Datei und kopiere die Datei danach manuell rüber auf den Hauptrechner und ließ die Daten dann wieder ein. Wenn dein Bild jetzt immer noch kaputt ist, dann liegt der Fehler nicht in der Übertragung, sondern woanders. Und wenn das Bild richtig aussieht, dann liegt es definitiv an der Übertragung.
 
/edit: ich hab jetzt mal das generierte vom kern lokal gespeichert. und das ist fehlerlos. also muss irgendwas bei der übertragung schiefgehen. aber was?

*hust hust*

nochdazu hab ichs jetz eh mit dem streamreader gemacht und damit funktioniert es, muss jetzt nur noch das ganze so zambasteln, dass es nicht immer abstürtzt
 
Zurück