DirectX Socket Programmierung
-
Hallo liebe Programmierer!
Folgende Situation!
Ich möchte auf einem Rechner (Windows 7 , Mehrkernprozessor) zwei Programme gleichzeitig laufen lassen. Z.B. soll ein Programm vom Anwender Eingaben erhalten (GUI) und diese an den anderen Programm übertragen. Das andere Programm reagiert auf diese Nutzereingaben. Die Kommunikation zwischen den Programmen soll mit DirectX-Socket Befehlen umgesetzt werden. So wie ich das verstanden habe muss ein Programm Server-Funktionen inkl. Ports zur Verfügung stellen.
1. Muss das sendende Programm ein Client sein (Create Client), oder könnte es sich einfach mit Hilfe des Socket Befehls (connect IP) an das Server-Programm andocken!? Oder ist es das gleiche?
2. Muss das IP-Routing aktiviert sein, damit etwas passiert? Bis jetzt konnte ich keine Textdatei übertragen.
3. Wäre es möglich, dass das sendende Programm in C#-geschrieben ist, und der Server in c++? Die Kommunikation aber über Sockets läuft.
Über sinnvolle Antworten, wäre ich sehr dankbar!
Grüße
-
Ich weiß zwar nicht was DirectX-Sockets sein sollen, aber: Das ist so erstmal kein Problem. Du brauchst nen Server und nen Clienten. Was meinst du mit IP-Routing? Die Sprache in der die Programme geschrieben sind, ist nicht relevant.
-
ad 1) "DirectX-Socket" gibt es nicht. Eigene Begriffe erfinden kommt nicht gut, die checkt nämlich keiner. Du meinst zwar vielleicht es müsste klar sein, ist es aber nicht.
Falls du DirectPlay meinst, würde ich nimmer verwenden, das ist tot, d.h. wird nicht mehr weiterentwickelt, und wie lange die Runtime noch unterstützt wird ist auch fraglich.
ad 2) Nein, Routing muss nicht aktiv sein
ad 3) Ja, wäre möglich.
-
Hallo!
Ich habe jetzt die Socket-Funktionen der Winsock-DLL genutzt, und im Konstruktor folgendes geschrieben
m_SocketAddress.sin_family = AF_INET; m_SocketAddress.sin_port = 1234; m_SocketAddress.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); WSAStartup(MAKEWORD(2,0),&m_WSAData); m_Socket = ::socket(AF_INET , SOCK_STREAM, IPPROTO_UDP);
Habe noch eine Server Klasse , die von der socket-Klasse erbt!
Das Programm läuft auch ohne Fehler, aber wenn ich z.b. folgenden Befehl ausführe: telnet 127.0.0.1 1234 , dann kommt folgender Fehler: Verbinden mit der Host ist nicht möglich. Gibt es einen Konsolenbefehl (Windows) der überprüft ,ob ein Server aktiv ist?
Ich verzweifel so langsam!
Wäre es auch möglich mit sogenannte Pipes den Datenaustausch zwischen c++-Programm und c# zu realisieren?
Grüße
-
HelloWorld() schrieb:
Das Programm läuft auch ohne Fehler, aber wenn ich z.b. folgenden Befehl ausführe: telnet 127.0.0.1 1234 , dann kommt folgender Fehler: Verbinden mit der Host ist nicht möglich. Gibt es einen Konsolenbefehl (Windows) der überprüft ,ob ein Server aktiv ist?
Wie genau "führst" du diesen "Befehl" "aus"?
HelloWorld() schrieb:
Wäre es auch möglich mit sogenannte Pipes den Datenaustausch zwischen c++-Programm und c# zu realisieren?
Ja
-
Wie genau?
Ich starte eine Konsole unter Windows XP und gebe den Befehl ein!
Vor dem starte ich meinen Sever!
Grüße
-
Und wie sieht dein Server aus? Ich seh da oben nur, dass du ein Socket erzeugst. Ich seh nicht, wie der Server dann funktioniert. Du rufst offenbar nichtmal listen() oder accept() auf, wie soll das also deiner Meinung nach funktionieren?
-
Das mach ich alles:
::bind(m_Socket, (SOCKADDR*)&m_SocketAddress,sizeof.... ::listen usw.
Den Server rufe ich in einer Endlosschleife auf!
Server myServer: whle (true) { myServer.aktiv(); }
Wenn das Server Programm und der Client auf unterschiedlichen Rechnern laufen, dann funktioniert es. Aber ich wollte ja den Server und den Client auf einen Rechner starten lassen!
Muss ich da vielleicht noch was aktivieren unter Windoes Xp?
Grüße
-
IP richtig? 127.0.0.1?
-
Hallo!
Die IP habe ich auslesen lassen, und die ist OK. Keine Ahnung warum das nicht funktioniert! Liegt das vielleicht an windows XP?
Ich habe das Problem aber jetzt mal mit Hilfe sogenannter Pipes versucht zu lösen. Ein Konsolenprogramm (Server) sendet hinter einander zeitlich versetzt 3 Textnachrichten. Mit Hilfe einer Taste kann ich z.b. die erste Nachricht senden!... und Weitere mit erneuten Tastendruck. Eine Windows-Applikation dient als Client, und soll die Nachrichten erhalten. Das klappt auch recht gut, aber wenn ich die Taste dreimal drücke, dann erscheint die Nachricht erst, wenn ich das Windows-Fenster aktiviere!
Ist die Sache mit den Pipes nicht sonderlich stabil? Sollte ich eine andere Möglichkeit suchen? Was meint Ihr?
Ich wollte eine C# GUI programmieren, die Benutzereingaben übernimmt, und diese an eine C++-Anwendung weiterleitet! Sind da Pipes überhaupt sinnvoll? Ich brauche eine gute Lösung! Leider klappt das nicht mit Socket-Programmierung
Grüße
-
Pipes sind super stabil, Sockets auch und das klappt auch alles wenn man es richtig macht.
Das Problem wird also bei dir liegen.Was Pipes vs. Sockets angeht... selber googeln macht schlau.
Pipes können halt "mehr" als Sockets - man kann z.B. Zugriffsberechtigungen drauf setzen, man kann den Account abfragen der am anderen Ende zugreift (wenn der Client es erlaubt) etc.
Dafür sind sie halt Windows-spezifisch, mit allen üblichen Konsequenzen.Wenn kein guter Grund besteht Pipes zu nehmen würde ich Sockets nehmen.
-
Hallo kluger hustbaer
Solche blöden Kommentare kannst Du Dir sparen! Du kennst mich doch garnicht! Behaupte doch nicht einfach, dass etwas an mir liegt! Die Sachen funktionieren ja im Netztwerk! Ich wollte das Client und Server auf dem gleichen Rechner laufen! Und das geht eben nicht! Lese erst einmal richtig den Text durch! Halt Dich doch einfach zurück, und antworte doch nicht auf einen Beitrag, wo Du eh Nichts beitragen kannst! Da kann ich gerne drauf verzichten!
Oh mann, was für Leute! Bitte nicht antworten! Mit anscheinend klugen Leuten habe ich schon genug zu tun!
-
Hallo infantiler HelloWorld(),
Wenn es korrekt programmiert ist, dann funktioniert es auch wenn Client und Server auf dem selben Rechner laufen.
Umkehrschluss: wenn es nicht funktioniert sobald Client und Server auf dem selben Rechner laufen, dann kann es nicht korrekt programmiert sein.Ergo: der Fehler liegt bei dir (=in deinem Code).
Was ist daran jetzt so schwer zu verstehen?
Da du leider kaum Code zeigst, haben wir auch gar nicht die Chance dir irgendwelche nützlicheren Tips zu geben als "wenn du es richtig machst dann funktioniert es auch".
Solche blöden Kommentare kannst Du Dir sparen! (...) Mit anscheinend klugen Leuten habe ich schon genug zu tun!
Re.
ps:
HelloWorld() schrieb:
Die Sachen funktionieren ja im Netztwerk!
"Aber es funktioniert ja wenn..."
Standardargumentation von Leuten die keinen Plan von dem haben mit was sie arbeiten.