Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding > Coding Tutorials
You last visited: Today at 08:17

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[C++] Interprozesskommunikation: Windows Pipes

Discussion on [C++] Interprozesskommunikation: Windows Pipes within the Coding Tutorials forum part of the General Coding category.

Reply
 
Old   #1
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
[C++] Interprozesskommunikation: Windows Pipes

Abend liebe Community,

Ich habe hier ein sehr interessantes Thema für euch: Kommunikation zwischen zwei Prozessen auf dem selben Computer. Das heißt, wie können zwei Programme, die auf einem System laufen, Daten untereinander austauschen? Dazu gibt es erstmal mehrere Möglichkeiten und ich habe mir da jetzt mal die Pipes rausgepickt. Die Frage, was ein Pipe ist, lasse ich mal durch Wikipedia klären. Dazu bitte HIER mal nachschauen. Um für euch den Umgang mit den Pipes einfach zu gestalten habe ich euch mal schnell zwei Klassen programmiert. Eine PipeServer- und einer PipeClient-Klasse. Damit ist es letztendlich nicht sehr schwer das Ganze zu realisieren

Ladet euch die Header- und .CPP-Dateien runter und bindet sie in euer aktuelles Projekt ein.
So, nun können wir anfangen zu Programmieren. Zuerst wollen wir einen Pipe-Server programmieren:

Code:
#include <iostream>
#include <string>
#include "class_Pipe.h"

using namespace std;
using namespace pipe;


int main( int argc, char** argv )
{
    return 0;
}
Der Code dürfte bisher eig. klar sein. Wir binden zuerst den iostream-Header für in- und output ein und dann den Header von unseren Pipe-Klassen. Unsere Klassen stehen zudem im Namensraum pipe, weswegen wir dem Compiler mitteilen, dass wir diesen im gesamten Projekt verwenden wollen. Dann erstellen wir mal ein Objekt der Klasse PipeServer:

Code:
#include <iostream>
#include <string>
#include "class_Pipe.h"

using namespace std;
using namespace pipe;


int main( int argc, char** argv )
{
    PipeServer pipeServer;
    return 0;
}
Einfach Nun teilen wir der Klasse den "Namen" unseres Servers mit, anhand dem wir ihn später identifizieren können und die Größe des Servers in Bytes:

Code:
#include <iostream>
#include <string>
#include "class_Pipe.h"

using namespace std;
using namespace pipe;


int main( int argc, char** argv )
{
    PipeServer pipeServer;
    pipeServer.SetPipeAttributes( "TEST", 512 );
    return 0;
}
In unserem Beispiel ist der Name also "TEST" und die max. Größe 512 BYTES. Nun können wir den Server erstellen und uns mit ihm Verbinden:

Code:
#include <iostream>
#include <string>
#include "class_Pipe.h"

using namespace std;
using namespace pipe;


int main( int argc, char** argv )
{
    PipeServer pipeServer;
    pipeServer.SetPipeAttributes( "TEST", 512 );
    if( ! pipeServer.CreateServer() )
    {
        cout << "Konnte Server nicht erstellen\n";
        return 1;
    }
    if( ! pipeServer.ConnectToServer() )
    {
        cout << "Konnte sich nicht mit dem Server verbinden\n";
        return 1;
    }
    return 0;
}
Der Quellcode sollte wirklich nicht all zu schwer nachzuvollziehen sein ConnectToServer ist nebenbei ein BlockingCall, das heißt der Programmablauf bleibt solange unterbrochen, bis sich ein Client noch mit dem Server verbunden hat. So nachdem sich ein Client mit dem Server verbunden hat, wird der Client an den Server ein Request senden. Diesen soll unser Server natürlich auch empfangen. Das geschieht mit der Funktion Recv(), die als Rückgabewert den empfangenen string enthält:

Code:
#include <iostream>
#include <string>
#include "class_Pipe.h"

using namespace std;
using namespace pipe;


int main( int argc, char** argv )
{
    PipeServer pipeServer;
    pipeServer.SetPipeAttributes( "TEST", 512 );
    if( ! pipeServer.CreateServer() )
    {
        cout << "Konnte Server nicht erstellen\n";
        return 1;
    }
    if( ! pipeServer.ConnectToServer() )
    {
        cout << "Konnte sich nicht mit dem Server verbinden\n";
        return 1;
    }

    string empfangen = pipeServer.Recv();
    cout << "Empfangen: " << empfangen << "\n";
    return 0;
}
Natürlich wollen wir dem Clienten nun auch was zurückschreiben. Das geschieht mit der Funktion Send( string* ). Diese erwartet als Parameter einen Zeiger auf den String, der gesendet werden soll:

Code:
#include <iostream>
#include <string>
#include "class_Pipe.h"

using namespace std;
using namespace pipe;


int main( int argc, char** argv )
{
    PipeServer pipeServer;
    pipeServer.SetPipeAttributes( "TEST", 512 );
    if( ! pipeServer.CreateServer() )
    {
        cout << "Konnte Server nicht erstellen\n";
        return 1;
    }
    if( ! pipeServer.ConnectToServer() )
    {
        cout << "Konnte sich nicht mit dem Server verbinden\n";
        return 1;
    }

    string empfangen = pipeServer.Recv();
    cout << "Empfangen: " << empfangen << "\n";

    string sende = "Huhu";
    pipeServer.Send( &sende );

    return 0;
}
Joa damit sind wir schon fertig mit dem Server. Ich sag ja, ist relativ einfach Nun bereitet uns der Client auch keine großen Probleme mehr denk ich. Wir erstellen wieder zuerst ein Objekt der Klasse PipeClient, übergeben dann die Daten vom Server (Name, Größe), verbinden ns mit dem Server, richten eine request an den Server und empfangen schließlich dessen Antwort:

Code:
#include <iostream>
#include <string>
#include "class_Pipe.h"

using namespace std;
using namespace pipe;


int main( int argc, char** argv )
{
    PipeClient pipeClient;
    pipeClient.SetPipeAttributes( "TEST", 512 );
    if( ! pipeClient.ConnectToServer() )
    {
        cout << "Konnte sich nicht mit dem Server verbinden\n";
        return 1;
    }
    string sende = "Hallo, Server";
    pipeClient.Send( &sende );
    string rec = pipeClient.Recv();
    cout << rec;

    return 0;
}
Wenn ihr Fragen habt, fragt, freue mich auch auf Feedback und wie immer Viel Spaß damit
xNopex is offline  
Thanks
11 Users
Old 03/21/2011, 20:40   #2
 
elite*gold: 0
Join Date: Mar 2011
Posts: 1
Received Thanks: 0
Hey, die Dateien sind leider nicht mehr vorhanden, könntest du sie bitte noch einmal uppen?

Vielen Dank!
ftoby is offline  
Old 12/16/2011, 23:44   #3
 
elite*gold: 0
Join Date: Dec 2011
Posts: 1
Received Thanks: 0
Hallo xNopex,

ich bin an dein Header und CPP-Datein interessiert. Könntest du die eventuell nochmal hochladen?

Vielen Dank!

Gruß
Sharky
Sharky85 is offline  
Old 04/10/2012, 14:15   #4
 
elite*gold: 0
Join Date: Aug 2010
Posts: 1
Received Thanks: 0
die Header- und .CPP-Dateien sind nicht mehr verfügbar könntest du die vllt noch mal hochladen?
l2iX is offline  
Old 04/10/2012, 14:33   #5
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Nä. Hab das selbst gelöscht. War wohl buggy und was weiß ich noch alles.
xNopex is offline  
Reply


Similar Threads Similar Threads
Windows Vista >> Windows 7 (bleibt P-Server bestehen?)
01/31/2012 - Metin2 Private Server - 10 Replies
heyho miteinander Da ich demnächst von Windows Vista auf Windows 7 umsteige, stellt sich mir die frage ob ich meinen eigenen P-Server irgendwie sichern kann um ihn anschliessend wieder aufstarten zu können. Eigentlich gehen keine Daten verloren, jedoch steige ich auf die 64-Bit Variante um. Das heisst: totaler Datenverlust und eventuelles nichtmehrfunktionieren von Software und Treiber. (sagt jedenfalls Microsoft) Um 100%ig sicher zu sein frage ich nach: - Welche Dateien muss ich...
Windows 7 -> Windows Xp als 2. Betriebsystem = Installation Fail x(
05/29/2010 - Technical Support - 0 Replies
Hey, Ich habe ein Problem bei der Installation von 2. Betriebssystemen (Win 7 & Win XP). Ich hatte zuerst Windows 7 auf eine Komplett leere Festplatte Installiert. Das klappte auch ohne Probleme. Anschließend hab ich anhand von diesen guide (Wie kann ich die Windows 7 Partition Verkleinern/Vergrössern?) Verkleinert und eine Neue Partition (:F) von 70 Gb erstellt (Insg. 250 GB vorhanden). dann Windows XP cd ins Laufwerk im Bios die bootreihenfolge umgestellt und on der Windows XP Cd...
[How To] Windows 7 Style bei Windows Vista (Deutsch)
01/31/2010 - Tutorials - 2 Replies
Als erstes kopiert ihr die datein aus dem Theme Archiv in diesen Ordner "C:\Windows\Resources\Themes" Nun macht ihhr einen doppelklick auf die datei Windows7.theme und drückt übernehmen. dann sieht es schon mal etwas wie windows vista aus. wenn ihr das dann hab geht ihr auf start und sucht nach "regedit" diese datei öffnet ihr und geht zu " HKEY_CURRENT_USER -> Control Panel -> Desktop -> WindowMetrics " und geht auf einen freien bereich und macht " rechtsklick -> neu -> Zeichenfolge "....
Get into Mana Pipes
05/11/2007 - WoW Exploits, Hacks, Tools & Macros - 6 Replies
Heya lovely people of xxxxx I was looking a bit around, and noticed quite a few bugs/exploits concentrates around the "Auto-Unstuck" feature. So I thought " wonder if you can get int othe mana pipes in Netherstorm", and I did get into them :P 1. Simply, just drop down infront of one. http://images7.pictiger.com/images/39/142e...5f34 f223039.jpg 2. Use the Auto-Unstuck feature, found under GM help issues (Subject: "Stuck")



All times are GMT +1. The time now is 08:17.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.