Hey,
weiß nicht, ob ich damit hier richtig bin, aber ich wüsste gerne, wie ich mit c# ein normales Windows(-Forms) Programm schreiben kann, das über das Internet mit anderen Computern (die ebenfalls das Programm installiert haben) kommuniziert. Geht das ünerhaupt ohne Webserver?
Ich weiß, wie es mit Webserver und Domain geht, eben als normale Internetseite, aber wie funktioniert das z.B. bei Computerspielen? Kann ich das nur aus Zeitvertreib (also ohne Kosten) machen?
Danke
Hallo kotibus, willkommen im Forum,
allgemein nennt sich das Vorgehen IPC - Interprocess-Communication. In .net gibt es ein paar Möglichkeiten dafür: TcpServer/-Client, Remoting, WCF, ...
Am einfachsten ist es mMn mit WCF. Als Einstieg siehe WCF Tutorial - Basic Interprocess Communication.
Geht das ünerhaupt ohne Webserver?
Ja. Die oben genannten Möglichkeiten benötigen keinen WebServer. Der Server, der für die Kommunikation notwendig ist, kann ein eigenes Programm sein.
Es ist nichts weiter notwendig als das .net-Framework (+ entsprechende Kentnisse zur Verwendung 😉).
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Klare Antwort: Jain
Man kann direkte Verbindungen über das Internet herstellen, wenn auf beiden Computern gleichzeitig ein geeignetes Programm läuft und
Du musst also in jedem Falle einen Weg haben, wie der eine Computer die Addresse des anderen bekommt.
Wenn kein Router/Firewall im Weg ist:
Das einfachste aber für den Benutzer unfreundlichste ist es, den Benutzer die IPs herausfinden zu lassen. Ansonsten kann man soetwas wie dyndns einsetzen. Alternativ kann man irgendwo auf einem Webspace eine Datei oder ein Script platzieren.
Der Vollständigkeit halber sei erwähnt, dass IPC nur zur Kommunikation zweier Prozesse auf dem selben Computer geeignet ist.
Zu IPC zählen z.B. des net.pipe-Binding von WCF bzw. allgemein Anonymous/NamedPipes in .NET.
Andere Bindings von WCF sind dagegen natürlich, wie gfoidl schon gesagt hat, für die Kommunikation über Internet geeignet 😉
Der Vollständigkeit halber sei erwähnt, dass IPC nur zur Kommunikation zweier Prozesse auf dem selben Computer geeignet ist.
Nein. Es spielt keine Rolle, ob die Prozesse auf demselben Rechner laufen oder nicht, man spricht trotzdem von IPC. Und named pipes gehen auch übers Netzwerk, aber das hat damit auch wieder nichts zu tun.
Ok, wenn ich das richtig verstehe, ist es zwar möglich (toll! 😉, allerdings muss der jeweilige Computer meine IP wissen, richtig?
Ginge das dann (angenommen meine IP ist bekannt) auch über mehrere Computer?
Und wie machen das dann z.B. Spiele und Chat-Programme? Ist die IP des Servers einfach irgendwo im Proramm hardgecodet und ändert sich nie? Wenn ja, wäre das bei mir vermutlich auch kein Problem, da ich ja meinen eigenen PC als Server nutzen möchte und (vermutlich) eine statische IP von Kabel-Deutschland habe... 😉
Hallo kotibus,
allerdings muss der jeweilige Computer meine IP wissen, richtig?
Klar, wie sollte er sonst wissen mit wem er sich verbindet? Die Adresse ist notwendig, das ist auch bei der Post so.
Ginge das dann (angenommen meine IP ist bekannt) auch über mehrere Computer?
Kommt auf die Technologie an. Bei WCF kann ein Server beliebig viele Clients bedienen (begrenzt durch die Ressourcen, aber theoretisch unbegrenzt).
Und wie machen das dann z.B. Spiele und Chat-Programme?
Es gibt viele Chat-Demos, such dir eins und lerne daraus. Der Server ist hier meist der Vermittler zwischen den Clients. Aber das wurde schon oft besprochen. Bitte benutze auch die Forensuche.
Ist die IP des Servers einfach irgendwo im Proramm hardgecodet und ändert sich nie?
Wenn du dir sicher bist, dass sie sich nie ändert, kannst du sie auch hartkodieren. Sonst ist das Ablegen dieser in der app.config vorzuziehen, da sie ohne Neukompilierung geändert werden kann (als UserSetting auch vom Benutzer über die Programmoberfläche). Siehe hierzu [Tutorial] Konfigurationsmodell im .NET Framework.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
So, bin nach dem Tutorial das oben gepostet wurde vorgegangen, das Serverseiteige programm läuft. Versucht das Clientseitige nun aber eine Nachricht zu senden, bekomme ich die Fehlermeldung > Fehlermeldung:
Der Server konnte die Anforderung aufgrund eines internen Fehler nicht verarbeiten. Wenn Sie weitere Informationen zum Fehler erhalten möchten, aktivieren Sie entweder IncludeExceptionDetailInFaults (entweder über das ServiceBehaviorAttribute oder das <serviceDebug>-Konfigurationsverhalten) für den Client, um die Ausnahmeinformationen zurück an den Server zu senden, oder aktivieren Sie die Ablaufverfolgung gemäß der Microsoft .NET Framework 3.0 SDK-Dokumentation, und prüfen Sie die Serverablaufverfolgungsprotokolle.
Allerdings habe ich auch alles 1 zu 1 aus dem Tutorial übernommen (natürlich trotzdem alles gelesen und Schritt für Schritt gemacht) und keine URIs geändert oder so. Ich nehme mal an ich muss hierfür noch einige Einstellungen am PC oder Netzwerk vornehmen, richtig?
Zunächst soll das Programm übrigens nur mal auf meinem PC laufen 😉
Edit:
fange Serverseitig auch
host.Faulted += new EventHandler(host_Faulted);
und
host.UnknownMessageReceived += new EventHandler<UnknownMessageReceivedEventArgs>(host_UnknownMessageReceived);
ab, sehe aber keine Wirkung. Die Nachricht kommt also garnicht beim Server an, oder?
Edit2: Firewalls habe ich keine auf dem PC, beim router bin ich mir aber nicht sicher. Es ist ein gemieteter Router mit beschränktem Zugriff, weshalb ich da bisher nicht viel geändert habe. Aber ist das überhaupt relevant solange das Programm nur auf meinem PC läuft?
Hallo kotibus,
obiges Tutorial ist ab .net 4.0. Vorher ist noch eine Konfiguration für WCF notwendig. Siehe hierzu Windows Communication Foundation Configuration Schema - das schaut zwar "wild" aus, so schlimm ist es aber auch nicht. Dennoch ist dies aber lästig und daher empfiehlt es sich auf .net 4.0 zu wechseln.
Wenn du nicht auf .net 4.0 wechseln kannst/willst so kannst du auch eine weitere Alternative verwenden: Zyan, es gibt eben viele Möglichkeiten.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Ah, danke! Klappt jetzt (zumindest mit der "pipe" Variante)... hatte .NET 4.0 Clientblabla verwendet (auch Serverseitig). Vielen dank, damit mach ich morgen weiter und meld mich dann evtl. nochmal 😉
Hey,
Local läuft jetzt sowohl Pipe als auch Proxy. Zudem ist mein Rechner (der als Server fungieren soll) als "Exposed Host" in der FB eingetragen und alle Firewalls auf beiden Testrechnern sind aus. Was muss ich nun als nächstes tun, um den Server auch im Netzwerk (oder sogar im Internet) verfügbar zu machen? Google meint, ich bräuchte eine Konfigurationsdatei, aber die war doch durch die Nutzung von .Net 4.0 überflüssig, oder? Wie also mache ich es ohne diese Datei? Muss ich lediglich eine andere Adresse als "Localhost" wählen?
Meine momentanen Adressen sind, dem Tutorial entsprechend, diese hier:
new Uri("http://localhost:8000"),
new Uri("net.pipe://localhost")
Hallo kotibus,
beim Server kann localhost bleiben - das ist ja auch.
Beim Client muss die entsprechende (öffentlich erreichbare) IP des Servers und entsprechender Port eingetragen werden.
Beachte bitte vorsorglich [Hinweis] Wie poste ich richtig? Punkt 1.1.1. Das sind Grundlagen die eigentlich überall bei Netzwerktechnologie besser beschrieben und erklärt werden als in einem Forum.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Sorry, habe mich falsch ausgedrückt:
Den "Standart-Weg" habe ich schon versucht, ich versuche jetzt einfach über den Client "http://192.168.178.20/Reverse" und "net.pipe://192.168.178.20/PipeReverse", über einen anderen PC klappt keins von beiden, auf meinem eigenen aucn nur die pipe
Hallo kotibus,
das NetNamedPipeBinding ist nur für die Kommunikation am selben Rechner gedacht. Übers Netzwerk geht diese nicht.
BasicHttBinding bzw. allg. HTTP geht übers Netzwerk (und auch lokal) - die Firewall muss dies jedoch auch gestatten. Ist dort der Port freigegeben? Der Rest ist raten, denn "klappt nicht" ist nicht besonders aussagekräftig. Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 5.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Fehlermeldung:
Der Server hat eine Protokollverletzung ausgeführt.. Section=ResponseStatusLine ist die genau Fehlermeldung des http... und normalerweise (so kenne ich es von dem Spiel WC3, das auch immer eine Portfreigabe benötigt) bedeutet "Exposed Host" in der FritzBox, dass alle Ports freigegben sind.
Die URIs sind aber in meinem Code richtig angegeben so wie ichs geschrieben hab? Da steht nämlich jetzt nirgendwo mehr ein Port drin 😛
Edit: Hab den Port jetzt einfach hinter der IP ergänzt und jetzt klappt es auf meinem PC, aber noch immer nicht im Netzwerk obowohl (außer evtl. die Fritzbox) keine Firewalls o.Ä. mehr im Weg sein sollten. Der andere PC findet einfach keinen "lauschenden Endpunkt".
Ist der Port denn in der Windows Firewall freigegeben? Ansonsten wirft die nämlich die Anfrage zurück.
Esseidenn du meintest mit deiner oben genannten Aussage "Firewalls habe ich keine auf dem PC", dass du die Windows Firewall deaktiviert hast.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Eben das 😉 Habe alles außer der Fritz-Box Firewall ausgeschaltet. Habe außerdem noch versucht, apache zu installieren (allerdings gabs nur 32x86), wobei es schon bei der Installation sowie auch beim Starten Fehler gab 😦
Kann keiner mehr helfen? Kriegs einfach nicht hin.
Ich hab in der Fritzbox alle Möglichen Portfreigaben gemacht, meine IP rausgefunden und mit allen möglichen Ports probiert... aber nirgendwo findet er was. Nur der standardmäßige Port der Fritzbox klappt überhaupt, allerdings gibts hier nur eine leere Seite...
Der normale Weg, über das Internet auf meinen PC zuzugreifen, ist doch ganz einfach über die IP oder? Hier steht dann noch der Router im weg, nachdem der aber die entsprechenden Ports freigibt sollte unter diesen (also z.b. 12.34.56.78:8000) was passieren, oder? also eben wie bei mir "localhost:8000"? Oder habe ich da schon im Ansatz einen Fehler?
Frage: Der 2. Rechner mit dem du Anfragst, ist der im LAN oder fragt der über die externe IP die dein ISP vergeben hat an?
PS: Portfreigabe in der Fritzbox reicht von extern nicht, du musst die auch zu deinem Server durchrouten.
Wissen ist nicht alles. Man muss es auch anwenden können.
PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |
Habe zunächst mal mit meinem eigenen Versucht, irgendwas über die IP zusehen... also einfach statt "localhost:8000" mal "12.34.56.78:8000" eingegeben, dachte das würde aufs ghleiche rauskommen. Wie route ich denn durch?