
Kati82
Mitglieder-
Gesamte Inhalte
108 -
Benutzer seit
-
Letzter Besuch
Inhaltstyp
Profile
Forum
Downloads
Kalender
Blogs
Shop
Alle Inhalte von Kati82
-
Hallo, ich muss da noch mal kurz nachfragen, weil ich bisher noch nicht die richtigen Infos im Internet finden konnte. 1. Kann man irgendwie überprüfen, ob noch ein Socket geöffnet ist? Oder reicht da ein WSACleanup() aus? Hintergrund: Ich möchte, das bei meinem Client-Programm auch wirklich alles "aufgeräumt ist, wenn ich das Programm beende. Was passiert wenn ich kein close vorher mache()? 2. Die Funktion getpeername() macht nur einen Sinn, wenn ich mich bereits verbunden habe, sprich ein connect() ausgeführt habe? Ich kann also nicht vorher schon ermitteln, welche IP-Adressen im Netz sind. Die IP-Adresse des Servers muss mir also von vorn herein klar sein. Wäre nett, wenn da noch mal jemand meine Klarheiten beseitigen könte . Gruß Kati82
-
Also ich habe es in eine csv-Datei gespeichert. Ist aus meiner Sicht einfacher. Habe dazu zeilenweise das dgv ausgelesen und in die Datei reingeschrieben. Wenns dich interessiert, kann ich den Code posten. Gruß Kati82
-
Hallo nochmal, also wie es aussieht, habe ich es hinbekommen. Ich hatte es von Anfang an eigentlich richtig gemacht. Nachdem ich mir hunderte von ecos-Beispielen zum Thema Sockets angeschaut habe, ist mir dann irgendwann ein gravierender Unterschied aufgefallen. Bei den Beispielen wurde in der main immer ein neuer Thread für das eigentliche Programm erstellt. Das hatte ich nicht gemacht. Jetzt nachdem ich alles in einen eigenen Thread ausgelagert habe funktioniert alles. Trotzdem nochmal vielen Dank für eure Hilfe. Gruß Kati82
-
Hallo, also kann ich sofort loslegen mit Socket erstellen usw. ohne vorher den IP-Kram zu machen? Bzw. habe ich jetzt nur das "init_all_network_interfaces()" drin gelassen (sonst gibts ja schon ne Fehler bei bind()), was aus meiner Sicht den IP-Kram für mich erledigt. Wie bekomme ich dann die IP-Adresse heraus? Ich hab mal versucht das mit dem Tool "Hercules" zu testen. Über Wireshark habe ich eine IP herausbekommen, von der ich annehme, dass es mein Server ist. Mit Hercules habe ich jetzt versucht über diese IP und Port mich mit dem Server zu verbinden. Leider sagt mir Hercules, dass dann ein Fehler aufgetreten ist, genauer gesagt: "TCP connection error :10049". Habe herausgefunden, dass das bedeutet, die Adresse wäre nicht verfügbar. Ich nehme dann also mal an, dass die IP, die ich über Wireshark herausbekommen habe, die falsche ist. Muss ich trotzdem beim Server noch irgendwas einstellen, damit das funktioniert? Gruß Kati82
-
Danke schon mal für die Hilfe. Also bei mir bleibt der Server regelrecht hängen. Das bei accept auf eine Verbindung gewartet wird ist mir jetzt auch klar geworden. Mal angenommen, mein Client ist richtig programmiert, müsste dann nicht das Programm vom Server weiterlaufen, wenn ein connect vom Client erfolgt ist. Aber ich weiß ja selber, dass der Client nicht 100%ig sauber programmiert ist. Da muss ich eh nochmal ran. Ich will halt nur erst mal das Grundprinzip verstehen. Jetzt nochmal zur IP. Der Server ist soll auf dem Arm9-Controller sein. Ich wüsste jetzt nicht, wie ich da einfach ne IP reinhämmern kann. Oder sucht der sich automatisch eine? Wenn ja, wie kann ich diese dann vom Client ermitteln. Ich weiß jetzt nicht, ob du dir mal mein Server-Programm mal angeschaut hast, aber wenn ich dich richtig verstanden habe, kann ich den Kram mit ApplyInterfaces weglassen. Wenn ich das allerdings mache, dann schlägt bereits die Funktion bind() fehl. Und meine Vermutung ist da einfach, dass er schon eine direkte IP-Adresse benötigt. Liege ich da richtig mit meiner Vermutung? Gruß Kati82
-
Hallo zusammen, ich hoffe ich schreibe das jetzt ins richtige Forum, ansonsten bitte verschieben. Ich versuche mich gerade an der Socket-Programmierung und habe dabei ein paar Probleme. Ich hoffe, ihr könnt mir da weiterhelfen. Ich plane ein Client-Server-Programm zu schreiben. Dabei soll der Server auf einem Arm9-Controller mit Betriebssystem eCos sein und der Client auf einem normalen PC (mit Windows). Ist sowas überhaupt realisierbar? Ich habe jetzt schon mit beiden Programmteilen mal angefangen, doch beim Server hakt es gewaltig. Bei der Funktion accept() bleibt das Programm immer hängen. Außerdem habe ich ein leichtes Verständnisproblem. Wie kann ich dem Server sagen, dass er jetzt eine bestimmte IP-Adresse hat. Ist der Weg richtig so, wie es gemacht habe (siehe tcpecho.c im Anhang)? Ich bin nämlich der Meinung, dass man da bei Wireshark oder ähnlichen Programmen eine Meldung sehen müsste, dass es eine neue IP gibt. Die gibt es aber leider nicht. Was könnten Gründe dafür sein, dass die accept()-Funktion nicht geht? Mir fällt da langsam nichts mehr ein. Bei dem Client-Programm arbeite ich mit C++/CLI. Ich habe vorerst nur ein Form mit einem Button drauf. Bei Klick auf dem Button wird dann die Funktion SendTcpData() in der angehängten Datei ausgeführt. Ich weiß, performance-technisch ist da einiges zu optimieren, aber ich will erst mal, dass es überhaupt geht. Könnte das so funktionieren. Da ich bei meinem Server nicht weiterkomme, kann ich das ja leider nicht testen. Wäre schön, wenn mal einer von euch drüber schauen könnte. Falls ihr noch mehr Infos braucht, fragt einfach nach. Vielen Dank im voraus. Kati82 tcpecho.txt client.txt
-
Du kannst deine DataTable als Datenquelle (DataSource) für das DataGridView benutzen. Ich hatte neulich das gleiche Problem. Schau mal da: [C++/CLI] einzelne Zellen im DataGridView Gruß Kati82
-
Also bei mir funktioniert das auf diese Weise einwandfrei. Hast du auch den Header deines neuen Forms inkludiert? Das ist noch das Einzige, was mir einfallen würde, weil es nicht bei dir mit da steht.
-
Ich habs. Das Zauberwort heißt "PerformLayout". Die Scrollbar verändert sich zwar nicht mit dem Wachsen der dgv, aber immerhin ist jetzt die Scrollbar erst mal da. Ist halt eben ein Schönheitsfehler.
-
Ich hab noch was festgestellt. Bei meiner DataGridView habe ich die Anchor-Eigenschaft etwas verändert. Wenn ich jetzt das Programm laufen lasse und das und ich die Fenstergröße verändere nachdem die Liste gefüllt ist, dann erscheinen auf einmal die Scrollbalken. Was passiert also beim Ändern der Fenstergröße? Das kann doch auch nichts anderes sein als eine Art Refresh. Wenn ich das rauskriegen könnte, dann wäre mir schon geholfen. Habt ihr ne Idee?
-
Ich hab ehrlich gesagt, noch nicht verstanden, was du mit dem Timer anstellen möchtest. Nachdem der Download fertig ist, startest du also einen Timer. Möchstest du, dass für eine bestimmte Zeit etwas getan wird? Ich kenn mich jetzt nicht so wahnsinnig doll mit Visual Basic aus und mit Timern habe ich bisher auch nur wenig gearbeitet. Aber vielleicht ist der System.Threading.Timer besser geeignet für dich. Vielleicht schilderst du noch mal stichpunktartig, wie du dir den Ablauf vorstellst. Vielleicht wirds dann klarer. Gruß Kati82
-
So ähnlich hatte ich es ja auch. Es ging wohl deswegen nicht, weil ich mit unterschiedlichen Klassen gearbeitet habe. Und jetzt nachdem ich das etwas umstrukturiert habe, läuft es. Ich hatte gehofft, dass das Problem geklärt ist. Aber wenn man das eine Problem gelöst hat, taucht dafür ein Anderes wieder auf. Ich habe jetzt das Problem, dass keine Scrollbars angezeigt werden. Das ist ungünstig, wenn die Liste mal etwas länger wird. Gabs da nicht mal eine Eigenschaft, wo man sagen konnte, dass die Scrollbars immer angezeigt werden sollen? Wie hieß die nochmal? Oder muss ich mir jetzt selber einen Scollbar basteln?
-
Welchen Timer verwendest du? Ich glaub, es gibt nämlich zwei unterschiedliche Timer. Vielleicht ist dir das schon eine Hilfe. Gruß Kati82 P.S.: Mit welcher Programmiersprache machst du das?
-
Ok, also ich habe jetzt folgendes: DataTable^ dtResults = gcnew DataTable(); DataColumn^ ColNr = gcnew DataColumn(); DataColumn^ ColIP = gcnew DataColumn(); DataColumn^ ColResp1 = gcnew DataColumn(); DataColumn^ ColResp2 = gcnew DataColumn(); DataColumn^ ColResp3 = gcnew DataColumn(); dtResults->Columns->Add(ColNr); dtResults->Columns->Add(ColIP); dtResults->Columns->Add(ColResp1); dtResults->Columns->Add(ColResp1); dtResults->Columns->Add(ColResp1); In der Methode, wo ich nach und nach die DataTable füllen möchte, habe ich noch das (zum Test mal nur eine Spalte füllen): DataRow^ row; for (int i = 0; i < 10; i++) { row = dtResults->NewRow(); dtResults->Rows->Add(row); dtResults->Rows[i][0] = Convert::ToString(i) + ". String"; } Die Datatable habe ich als Datenquelle für das dgv angegeben. In dem Thread, wo ich das dgv updaten möchte, habe ich einfach nur ein Refresh() für das dgv eingefügt. Das scheint aber nur teilweise zu funktionieren. Das Problem ist, dass nur die erste Zeile im dgv angezeigt und der Rest komplett unterschlagen wird. Und ich bin bisher noch nicht dahinter gestiegen, warum das so ist. Ich vermute, es liegt an der DataTable. Leider kann ich dem dgv nicht die Zeilen selber hinzufügen, z.B. wenn das Form lädt. Es kommt dann immer die Exception, dass Zeilen erst dann hinzugefügt werden können, wenn es auch Spalten gibt. Da die Spalten aber von der DataTable abhängig sind, weiß ich momentan nicht, wie ich den Fehler umgehen kann. Ich hoffe, ich finde den Fehler noch heraus. Viele Grüße Kati82
-
Und wie füge ich einzelne Daten in eine DataTable ein? Will heißen, wir befülle ich genau eine Zelle der DataTable? Oder geht das nur beim DataSet? Mit nem normalen Index kann man ja da nicht arbeiten, oder? Google und MSDN haben mir bis jetzt noch nichts hilftreiches gezeigt.
-
Willst du denn hinterher noch die genaue Position im dgv wissen? Wenn nicht kannst du dgv.Contains("hier dein String") benutzen. Ansonsten wirst du wohl mit zwei verschachtelten for-Schleifen arbeiten müssen. Ein IndexOf ist mir jetzt beim dgv nicht bekannt. Kann mich aber auch irren. Oder was ist jetzt genau dein Problem?
-
Erst einmal noch ein Dankeschön für eure Unterstützung. Ich hab mir die Spalten der Tabelle in etwa so vorgestellt (ob ich die Ziel-IP mit reinnehme, weiß ich noch nicht, die ist ja eh immer gleich). Lfd. Nr.;Ziel-IP;Antwortzeit (100 Bytes);Antwortzeit (1000 Bytes);Antwortzeit (10000 Bytes) Ich soll nämlich einen bereits vorgefertigten Test machen, wo zunächst eine bestimmte Anzahl an Pings mit 100 Bytes, danach mit 1000 Bytes, und zum Schluss mit 10000 Bytes Paketgröße gesendet wird. Das würde also bedeuten, dass sich zuerst (mal abgesehen von den ersten beiden Spalten) die 3. Spalte füllt, dann die 4. und zum Schluß die 5. Falls jemand nen Vorschlag hat, wie ich es besser machen könnte, ich bin für alles offen. @Guybrush: Also ist das so richtig wie ich das mit der Datenquelle angegeben habe?
-
Wie sage ich dem dgv, dass es die Datatable als Datenquelle nehmen soll? Einfach so? dgv->DataSource = DataTable; Compilieren lässt sich das zwar, aber der Designer von dem WindowsForm spinnt dann. Ist das richtig so?
-
Ich kenn mich jetzt damit nicht so aus. Habe es auch noch nie gemacht. Aber meinst du das so, dass ich als Datenquelle ein XML-Dokument oder ähnliches benutze und das dann bei Aktualisieren auslese?
-
Ich möchte mein GUI oder vielmehr mein DGV regelmäßg refreshen (so alle 2, 3 Sekunden), weil ich möchte, dass der Anwender immer mal ein paar aktuelle Daten vor Augen hat. Ich habe jetzt im Grunde 2 Klassen, ein für die Oberfläche und eine wo der ganze Sende-/ Empfangkram drin ist. Ich hab mir das jetzt so vorgestellt, dass ich die Daten, die ich in der zweiten Klasse alle bekomme, in eine Liste oder ähnliches reinschmeiße. Von dem Thread aus, von dem aus ich refreshe, rufe ich dann diese Listen ab. Ich glaub, die Herangehensweise ist überhaupt nicht optimalt. Liegt wohl daran, dass ich wenig mit DGV und so komplexen Datensätzen arbeite. Ich hoffe ich, ich hab es jetzt verständlicher ausdrücken können. Wenn nicht, bitte entschuldigt, es ist Freitag. Kati82
-
Nee, den Anwender wirds nicht stören, der darf nämlich nix reinschreiben. Hintergrund ist der, das ich mit meinem Programm mit einem anderen Gerät kommuniziere. Vorerst ist es erstmal ein einfacher Ping. IM DGV sollen dann die Antwortzeiten je nach Paketgröße augelistet werden. Und wenn man nun mal ein paar 100 Pings schickt und ich erst zum Schluss das DGV refreshe, weiß ich nicht, ob das so günstig ist für den Anwender. Die Daten trage ich übrigens nicht in eine DataTable ein. Wäre das in meinem Fall ratsam? Gibts eventuell noch ne bessere Möglichkeit, die Ergebnisse darzustellen? Kati82
-
Nur so ne Idee, kann das mit den Ascii-Zeichen zusammenhängen?
-
Könnte man nicht versuchen, den eingegeben String in "DateTime" oder sowas ähnliches umzuwandeln? Wenn du noch ein try/catch drum machst, müsste es doch gehen, oder? Kati82
-
Hallo, ich hätte da mal noch ne Frage. Ich habe mir jetzt einen Thread erstellt, der meine GUI zyklisch aktualisiert. Bei Labels etc. funktioniert das auch ganz gut. Nur bei der Datagridview weiß ich nicht, wie ich das anstellen soll. Ich habe mir das ganze so vorgestellt, dass ich in einer anderen Klasse Listen mit Daten befülle. Diese Listen stellen dann die einzelnen Spalten der DatagridView dar. Das Problem ist nämlich, dass ich die View zum Teil nur zellenweise befüllen kann. Wie kriege ich aber nun heraus, wie weit ich eine Spalte der View bereits gefüllt habe? Hoffentlich habt ihr mein Problem verstanden. Gibts eventuell noch nen einfacheren Lösungsansatz? Danke schon mal im voraus. Viele Grüße Kati82
-
Danke, genau das wars. Blöd, dass Google einen manchmal auf die falsche Fährte lenkt. Kati82