Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben
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?

Wenn du für den Controler einen C Compiler hast und sockets unterstützt werden ja.

Bei der Funktion accept() bleibt das Programm immer hängen.

Was meinst du mit "bleibt hängen"? accept wartet auf eine Verbindung...

Wie kann ich dem Server sagen, dass er jetzt eine bestimmte IP-Adresse hat.

Das versteht ich auch nicht so ganz was du damit meinst. Die IP Deines Servers (PCs) hängt mit dessen Netzwerkeinstellungen zusammen und hat nichts mit deinem Serverprgoramm zu tun.

Ansonsten musste ich gerade an meine ersten Versuche damit denken und evtl. hilfts dir ja weiter:

http://forum.fachinformatiker.de/c-compiler-ides-apis/33778-windows-sockets.html

Geschrieben

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

Geschrieben
Mal angenommen, mein Client ist richtig programmiert, müsste dann nicht das Programm vom Server weiterlaufen, wenn ein connect vom Client erfolgt ist.
Richtig.

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?
Du liegst insofern richtig, als dein Programm eine korrekt konfigurierte Netzwerkschnittstelle benötigt, um arbeiten zu können. Ich bezweifle aber, dass es Aufgabe deines Programms ist, diese selbst einzurichten. eCos ist (soweit ich weiß) ein Multitaskingbetriebssystem. Da sollten solche elementaren Dinge wie das Einrichten des Netzwerks an zentraler Stelle erfolgen. Stell dir vor, du brauchst noch einen Server auf deinem Gerät, und der will auch das Netzwerk einrichten. Das könnte ziemlich durcheinander gehen.
Geschrieben

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

Geschrieben
also kann ich sofort loslegen mit Socket erstellen usw. ohne vorher den IP-Kram zu machen?
Nein. Jemand muss das Netzwerk einrichten. Die Frage ist, ob das dein Serverprogramm tun sollte.

Bevor du mit dem Auto irgendwohin fahren kannst, muss erst einmal eine Straße gebaut werden. Das ist aber nicht Aufgabe des Autos.

Muss ich trotzdem beim Server noch irgendwas einstellen, damit das funktioniert?
Musst du beim Auto irgendwas einstellen, damit es eine Straße baut, wenn noch keine da ist?

Schau mal in die eCos-Dokumentation, was da zum Einrichten des Netzwerks steht. Ich kann mir nicht vorstellen, dass das nicht zentral (z.B. durch eine Konfigurationsdatei) möglich ist.

Geschrieben

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

Geschrieben

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

Geschrieben
1. Kann man irgendwie überprüfen, ob noch ein Socket geöffnet ist?
Das solltest du nicht überprüfen müssen, das sollte dein Programm wissen, wenn es sauber implementiert ist.

Oder reicht da ein WSACleanup() aus?

Hier hilft meistens die Dokumentation der Funktion. WSACleanup hat den gewünschten Effekt, ist aber eher die Holzhammermethode. Besser ist es, wenn du deine Sockets ordentlich schließt.

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()?
Kommt aufs Betriebssystem an. Windows schließt alle offenen Sockets beim Prozessende.

2. Die Funktion getpeername() macht nur einen Sinn, wenn ich mich bereits verbunden habe, sprich ein connect() ausgeführt habe?
Auch hier hilft die Doku: Diese Funktion liefert dir die Adresse einer verbundenen Gegenstelle.

Ich kann also nicht vorher schon ermitteln, welche IP-Adressen im Netz sind.
Doch, im einfachsten Fall durch stumpfes Ausprobieren.

Die IP-Adresse des Servers muss mir also von vorn herein klar sein.
Oder etwas, das sich zu einer solchen Adresse auflösen lässt. Stichwort DNS.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...