22 Stimmen

Sockets vs. Named Pipes für lokalen IPC unter Windows?

Gibt es irgendwelche Gründe für die Bevorzugung von Named Pipes gegenüber Sockets für lokale IPC (beide mit win-api), Effektivität-Größe, Ressourcen-Größe oder anderweitig, da beide sehr ähnlich verhalten (und wahrscheinlich durch eine ähnliche Schnittstelle sowieso abstrahiert werden), in einer Anwendung, die wahrscheinlich bereits Sockets für Netzwerkzwecke sowieso verwenden wird?

Ich kann zumindest das Adressierungsproblem benennen: Portnummern für Sockets und Dateinamen für Pipes. Außerdem werden benannte Pipes (AFAIK) die Firewall nicht alarmieren (Dialog zum Blockieren/Entsperren), obwohl blockierte Anwendungen immer noch lokal über Sockets kommunizieren können. Gibt es sonst noch etwas zu beachten?

Gibt es bei der Verwendung von Sockets irgendwelche Winsock-Einstellungen/Flags, die bei der lokalen Verwendung von Sockets empfohlen werden?

20voto

Roger Austin Punkte 201

Einige subtile Unterschiede:

Sockets funktionieren nicht für lokalen IPC, wenn Sie keinen funktionierenden Adapter haben. Wie verbreitet ist es, einen PC ohne funktionierenden Adapter zu haben? Nun, mich hat es erwischt, als jemand versucht hat, einem Kunden unsere Software auf einem Laptop zu demonstrieren, der nicht an ein Netzwerk oder eine Stromversorgung angeschlossen war (so dass das Betriebssystem die Netzwerkkarte deaktiviert hat, um Strom zu sparen) und der drahtlose Adapter deaktiviert war (weil der Laptop-Benutzer kein drahtloses Netzwerk benutzt hat). Sie können dies umgehen, indem Sie einen Loopback-Adapter installieren, aber das ist nicht ideal.

Firewall-Software kann Probleme beim Aufbau von TCP/IP-Verbindungen verursachen. Für den lokalen IPC soll das kein Problem sein, aber ich bin nicht überzeugt. Benannte Leitungen können auch Firewalls haben.

Möglicherweise gibt es Probleme aufgrund der Berechtigungen, die zum Erstellen von Named Pipes oder zum Erstellen neuer Instanzen von Named Pipes erforderlich sind. Ich habe z. B. mehrere Server mit derselben Named Pipe betrieben (wahrscheinlich keine gute Idee, aber das war nur zu Testzwecken), und einige schlugen bei CreateNamedPipe fehl, weil der erste Server, der die Pipe erstellte, im Administratormodus lief (weil er von Visual Studio im Administratormodus gestartet wurde), während die anderen von der Befehlszeile mit normaler UAC-Stufe gestartet wurden.

Obwohl es in dem von Rubens erwähnten Artikel hauptsächlich um IPC über ein Netzwerk geht, wird darauf hingewiesen, dass "Local named pipes im Kernel-Modus läuft und extrem schnell ist".

11 Stimmen

Windows-PCs haben immer eine virtuelle Loopback-Schnittstelle installiert. Sie brauchen keinen Netzwerkadapter oder Treiber im PC, um Windows-Sockets zu verwenden. Verwenden Sie die IP-Adresse 127.0.0.1, um Ihre lokalen Prozesse zu adressieren.

7voto

Kevin Watkins Punkte 101

Eine andere Lösung, die Sie in Betracht ziehen können, ist ein benannter gemeinsamer Speicherbereich. Es ist ein wenig Arbeit, weil Sie selbst ein Flusskontrollprotokoll einrichten müssen, aber ich habe dies in der Vergangenheit erfolgreich eingesetzt, wenn Geschwindigkeit das Wichtigste war.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X