Copyright: Hilfe D2S ® h#s 06/03
Citation: ""


Index
D2S — DDE<–>TCP-Socket-Umsetzer

Um dem Wunsch nach einer einfachen Kommunikation zwischen Windows- und Linux-Anwendungen nachzukommen, wurde dieser Umsetzer mit dem im Folgenden dokumentierten TCP-Protokoll für die Windows-Seite geschrieben.

Die alternative Lösung wäre ein NetDDE-Umsetzer für Linux gewesen; auf Grund des undokumentierten und umständlich „gesattelten“ (Stichwort: NBT) Protokolls wäre es jedoch viel schwieriger.

Dieser Umsetzter funktioniert in beide Richtungen; ausgiebig getestet wurde jedoch nur die Richtung Linux als TCP-Socket-Client und ein Windows-Programm als DDE-Server.

Einführung – Ambitionen

Konfigurationsdialog

D2S als Socket-Server und DDE-Client — TCP-gesteuert
Vorbereitung
Verbindungsaufnahme
DDE-Aufträge
DDE-Antworten
Verbindungsabbau
Umsetzungs-Tabelle
Beispiel

D2S als DDE-Server und Socket-Client — DDE-gesteuert
Vorbereitung
Verbindungsaufnahme
Umsetzungs-Tabelle
„Selbstbefruchtung“

Der Zustand von D2S und die laufende Datenübertragung wird mit 4 verschiedenen Symbolen (Icons) kenntlich gemacht:

Programm ist inaktiv

(Mindestens) eine TCP-Socket-Verbindung ist vorhanden

Eine Transaktion ist fehlgeschlagen

Eine Transaktion ist erfolgreich verlaufen

Die letzten beiden Symbole „blitzen“ für 200 ms kurz auf.

h#s 04/04


Einführung - Ambitionen
Einführung – Ambitionen

D2S agiert sowohl als DDE-Client und TCP-Socket-Server zur Umsetzung eingehender TCP-Verbindungen als auch als TCP-Socket-Client und DDE-Server zur Herausführung von lokalen Programmen ins Internet. Es dient also als (künftig vollwertiger) Ersatz für NetDDE.EXE.

Gegenüber NetDDE hat dieses Programm eine direkte Konfigurationsmöglichkeit sowie eine eigene Host-Erlaubnis-Liste. Natürlich funktioniert dieses Programm nur mit installiertem TCP/IP als Netzwerkprotokoll.

Beispielhafte Verwendung von D2S zur weltweiten Excel-Datenanbindung

Voraussetzung: Windows 3.1 oder höher.

Unter Windows 9x/Me kann das Programm in den Meldungsbereich der Taskleiste (System-Tray) verschoben werden, entweder über's Menü oder beim Start durch Angabe von „als Symbol“.

Wem jegliches Symbol stört, kann es durch die Angabe „Maximiert“ oder (unter Wundows 3.x nur so) durch Angabe des Kommandozeilenparameters „/hidden“ das Fenster ganz verschwinden lassen.

Die Übertragung ist sowohl im ASCII- als auch (künftig!) im Binärmodus möglich.

Welche Vorteile bietet DDE?

–	DDE ist ein seit langem standardisiertes und etabliertes, paketorientiertes Protokoll,

–	ein Übergang von 16 nach 32 bit oder umgekehrt ist absolut problemlos,

–	zahlreiche Anwendungen unterstüzen DDE: MS Office, Matlab, LabView, VEE …,

–	DDE ist so etabliert, dass es wahrscheinlich noch lange „leben“ wird,

–	ein brauchbares Debug-Werkzeug „DDESPY“ ist ebenfalls verfügbar, wenn's mal klemmt,

–	Netzwerk-Fähigkeit (Datenaustausch über Rechnergrenzen hinweg) ist in Windows eingebaut (hier nur im Gegensatz zu OLE betrachtet).

Gibt es Nachteile mit DDE?

–	DDE ist „etwas angestaubt“, Microsoft empfiehlt OLE2,

Welche Vorteile bietet D2S?

–	macht DDE auf einfachste Art (Socket, ASCII) netzwerkfähig,

–	macht DDE plattform-unabhängig (eigene Programme, Linux, OS/2…),

–	verbindet somit zahlreiche Windows-Programme mit dem Rest der Welt.

Bekannte Bugs von D2S

–	Blockierende send()-Aufrufe (bspw. wegen Überlastung am anderen Ende der Leitung) behindern sämtliche über dieses Programm verlaufende Konversationen, das gilt sinngemäß auch für blockierende Aufrufe von gethostbyname(), speziell bei (irrtümlicherweise) unbekannten Hostnamen,

–	DdeAdvise ist in der Rolle als DDE-Server ungetestet und vermutlich fehlerhaft,

–	das Zählen der Konversationen und Transaktionen ist noch nicht ausprogrammiert; möglicherweise zeigt das Programm im Verlauf noch Konversationen an, obwohl keine existieren.


Der Konfigurationsdialog

Sie können hier folgende Einstellungen vornehmen:

Server-Port

Tragen Sie hier numerisch oder als String die Portnummer ein, auf den D2S auf eingehende Verbindungen „lauscht“. Wenn als String angegeben muss der Dienst in die Datei services (im Windows-Verzeichnis zu finden) eingetragen werden. Vorgabe: 2000. Bis auf wenige Ausnahmen funktionieren unter Windows alle Portadressen, auch solche unter 1024. Beachten Sie dabei Ihre evtl. vorgelagerte oder persönliche Firewall.

Maximale Zeilenlänge

Um DoS-Attacken wenigstens zu erschweren, ist hier eine maximale String- und damit Datenlänge vorggebbar. Dabei beinhaltet eine Zeile vom Kennbuchstaben bis zum terminierenden "\r" (Wagenrücklauf) und/oder "\n" (Zeilenvorschub) alles. Vorgabe: 4096.

Host-Akzeptanzliste

Sie können hier einzelne Hosts per Nummer oder Name vorgeben oder aber IP-Bereiche, nur als Nummer, mit - (Bindestrich) verbunden. Bis zu 10 Einzeladressen oder Bereiche sind erlaubt.

Beispiele:	– panther	(Einzelrechner per Name)

– 134.109.112.9	(Einzelrechner per Nummer)

– 134.109.113.1-134.109.115.254	(IP-Adressbereich)

Der „localhost“ (127.0.0.1) wird stets akzeptiert.

Trennzeichen

Bei ausgehenden TCP-Verbindungen (D2S als DDE-Server) wird dieses Zeichen als Feld-Separator benutzt. Vorgabe: Leerzeichen " ".

Gespeichert wird in einer D2S.INI neben der .EXE-Datei. Wenn Sie die .EXE umbenennen, geht das Programm auch von einem geänderten INI-Dateinamen aus!

Was noch fehlt

–	Zuordnung DDE-Service zu .EXE-Name (Tabelle)

–	Ein Socket (mit mehreren DDE-Konversationen) oder mehrere Sockets (mit je einer DDE-Konversation) als Client zu einem Server (Schalter)

–	TCP-Verbindungsabbau-Zeitverzögerung (Zahl) für Ein-Socket-Konversationen

–	Ordentliche Protokollfunktion


D2S als Socket-Server und DDE-Client - TCP-gesteuert
D2S als Socket-Server und DDE-Client — TCP-gesteuert

Vorbereitung
Verbindungsaufnahme
DDE-Aufträge
DDE-Antworten
Verbindungsabbau
Umsetzungs-Tabelle
Beispiel

Vorbereitung

0.	Stellen Sie sicher, dass keine Firewall den Weg vom Client-Rechner zum anvisierten DDE-Server versperrt. Installieren Sie ggf. ein geeignetes Tunnel-Programm auf der Firewall.

1.	Starten von D2S,

2.	im D2S-Konfigurationsdialog die entsprechende(n) IP-Adresse(n) erlauben,

3.	dort eventuell auch andere Anpassungen vornehmen (siehe Konfigurationsdialog).

4.	Die DDE-Ziel-Anwendung (bspw. Excel) muss laufen, sie kann zurzeit nicht durch D2S gestartet werden!

Nun kann von den erlaubten IP-Adressen über TCP eine Verbindung aufgebaut werden, über die dann zeilenweise die Aufträge an D2S zur Weiterleitung an DDE geschickt werden können.

D2S arbeitet in dieser Art gegenüber DDE als Client (es initiiert die DDE-Verbindung) und gegenüber TCP als Socket-Server (es nimmt Verbindungen entgegen wie ein WWW-Server).

Das über TCP verbundene, „remote“ („nicht-lokale“, um es nicht mit „entfernt“ übersetzen zu müssen) Programm kann somit wie ein DDE-Client agieren.

Starten Sie bei Notwendigkeit die Programme D2S und den DDE-Server als „Dienst“, entweder über den entsprechenden Registrierungsschlüssel bei Windows 9x oder über SRVANY.EXE (siehe c't 2004 Heft 6 Seite 234).

So ist der Server auch ohne eingeloggten Benutzer erreichbar.


Verbindungsaufbau, TCP-gesteuert
Verbindungsaufnahme, TCP-gesteuert

Bevor eine DDE-Konversation aufgenommen werden kann, muss zunächst eine TCP-Verbindung zum Zielrechner eröffnet werden.

Am einfachsten kann eine probeweise Verbindung über telnet (z. B. lokal: Start–Ausführen: „telnet localhost 2000“) eingerichtet werden, wie sie auch im Menü verfügbar ist.

Hinweis: D2S verarbeitet auch die Editiertaste Rückschritt [image], bei Tippfehlern können Sie mit dieser Taste Korrekturen vornehmen. Die Pfeiltasten werden dagegen (noch) nicht unterstützt.

Ein Programm muss als Socket-Client mit D2S eine Socketverbindung herstellen. In Perl könnte das z. B. so aussehen:

$handle = IO::Socket::INET->new(Proto  => "tcp", PeerAddr => $host, PeerPort => $port);

wobeil $host die IP-Adr. des Zielrechners und $port den Port (standardmäßig 2000) enthält.

Der Socket-Kanal wird umgehend geschlossen, wenn der Rechner nicht in der Host-Erlaubnis-Liste steht.

Ist der Socket-Kanal vorhanden, kann nun der Socket-Client über D2S als DDE-Client agieren und die entsprechenden Aufträge (Konversationen und Transaktionen) abschicken.


DDE-Aufträge, TCP-gesteuert

Alle DDE-Aufträge (Konversationen und Transaktionen) via D2S sind zeilenweise zu erteilen (mit einer Maximallänge von standardmäßig 4096 Zeichen je Zeile zur Abwehr eines DoS-Angriffs). Gemäß DDE ist der Aufbau dieser Aufträge grundsätzlich:

aktion service topic item wert

Das Trennzeichen innerhalb einer Zeile („record separator“) kann ganz nach Bedarf gewählt werden! Da auch Namen häufig Leerzeichen enthalten können, wird von D2S automatisch das zweite Zeichen einer Auftragszeile als Trennzeichen der Elemente verwendet. So sind alle folgende Zeilen gleichermaßen gültig:

aktion;service;topic;item;wert

aktion`service`topic`item`wert

Das Zeilenendezeichen („field separator“) darf "\n", "\r", "\r\n" oder "\n\r" sein, kann jedoch zurzeit nicht verändert werden. Daraus folgt, dass wert nicht aus mehreren Zeilen bestehen darf.

Zeichenkodes ≥80h werden so übertragen, wie sie sind; deren Interpretation hängt von der auf den Rechnern verwendeten Kodeseite ab. Meist wird man ISO-Latin1 resp. Windows-CP1252 benutzen. Bei Übertragungen zwischen verschiedenen Kodeseiten (bspw. nach Osteuropa oder Fernost) ist dann mit Zeichensalat zu rechnen! Das Euro-Symbol €, bei CP1252 auf 80h liegend, ist unter ISO-Latin1 (Linux) nicht definiert.

Die Bedeutung der einzelnen Elemente einer Zeile:

Element	Beschreibung

aktion	Einer der Kennbuchstaben a, c, d, e, p, r, t, u, w
(Unbedingt klein! Großbuchstaben sind für Binärübertragung reserviert.)

service	Name für DDE-Dienst (meist Anwendungsname: Excel, MSAccess)

topic	Name für DDE-Thema (oft Dateiname: TBL, db1)

item	Name für DDE-Element (in Excel bspw. eine Zelle: R1C1, deutsch Z1S1)

wert	Daten (nur für die aktionen e und p)

Die möglichen Namen für topic und item hängen stets von dem als DDE-Server angesprochenen service ab.

Bei Excel sind die item-Namen sogar von der Excel-Sprachversion abhängig (dies ist ansonsten unüblich). So muss man im deutschen Excel die Zelle A1 mit z1s1 (für „Zeile“ und „Spalte“) ansprechen, im englischen Excel hingegen mit r1c1 (für „row“ und „column“).

Bei der Übertragung numerischer Gleitkomma-Werte (die hier stets menschenlesbar übertragen werden) muss man grundsätzlich auf das richtige Dezimaltrennzeichen achten! Ggf. ändere man in der Systemsteuerung das Dezimaltrennzeichen auf der Windows-Seite. {Diese Hürde entfällt bei der künftigen Binärübertragung, sofern der DDE-Server dies unterstützt.}

Die möglichen Aktionen und ihre Bedeutung sind in der folgenden Tabelle aufgeführt.

aktion	Beschreibung

a [service topic] item	Hot-Advise, automatische Lieferung des geänderten Variablen-Wertes von <item> solange, bis eine unadvise (u)-Order erteilt wird.

c service topic	Connect, Verbindungsaufbau

d [service topic]	Disconnect, Verbindungsabbau

e [service topic] kommando	Execute, Ausführung des angegebenen Kommandos

p [service topic] item daten	Poke, Setzen einer Variablen <item> auf den Wert <daten>

r [service topic] item	Request, Abfrage einer Variablen <item>

t [service topic] zahl	Festlegung einer Zeitüberschreitung für folgende DDE-Transaktionen (zurzeit nicht implementiert)

u [service topic] item	Unadvise, Aufheben einer Advise-Anweisung (a oder w)

w [service topic] item	Warm-Advise, Information bei Datenveränderung ohne Daten

Bei den Buchstaben a, e, p, r und w wird automatisch eine Verbindung gestartet, wenn diese nicht bereits existiert, dann allerdings (zurzeit) ohne eine Rückmeldung des Verbindungsaufbaus, wie ihn ein expliziter Auftrag (c service topic) liefern würde.

Außer bei aktion c können service und topic weggelassen werden und beziehen sich dann automatisch auf den letzten Auftrag (über diesen TCP-Kanal).

Pro Zeile können auch mehrere Items, Kommandos oder Item-Daten-Paare angegeben werden; so werden mehrere Transaktionen quasi gleichzeitig ausgeführt. Die Antworten sind aber stets „einzeilig“.

Siehe Beispiel und Tabelle


DDE-Antworten bei TCP-gesteuerter Verbindung

Die Antworten, die der Socket-Client vom DDE-Server erhält, kommen stets einzeilg. Außer bei den aktionen a und w werden sie nur einmal auf Grund eines Auftrages geschickt. Entweder gibt es nur eine Bestätigung, die gleich dem (u. U mit service und topic komplettierten) Auftrag ist (aktionen a, d, e, p, u, w), oder es wird ein Wert hinten angehängt (aktionen c, m, r). Die Antworten mit m als ersten Buchstaben werden vom DDE-Server immer dann verschickt, wenn sich die Bezugsvariable geändert hat. Bei einem Hot-Advise wird der geänderte Wert mitgeliefert, bei einem Warm-Advise nicht.

Als Trennzeichen der Antwortzeilen wird von D2S das des zugehörigen Auftrages verwendet (siehe Beispiel).

Rückmeldung 	Bedeutung

a service topic item	Advise (Hot-Link) OK

c service topic hConv	Connect OK, Quittierung unter Angabe des Konversations-Handles, welches aber nur für die künftige Binärübertragung gebraucht wird

d service topic	Disconnect, Verbindungsabbau OK
Kann auch „unvermittelt“ auftreten, wenn die DDE-Serveranwendung beendet wurde. {Diese Rückmeldung funktioniert irgendwie zurzeit nicht}

e service topic	Execute OK

m service topic item	Datenveränderung auf „Warm-Advise“ (aktion  w)

m service topic item daten	Datenveränderung auf „Hot-Advise“ (aktion  a)

p service topic item	Poke OK

r service topic item daten	Request OK, siehe Daten

u service topic item	Unadvise OK

w service topic item	Advise als „Warm-Link“ OK

# service topic Fehlerkode	Ein DDE-Auftrag lieferte auf der Server-Seite einen Fehler

Siehe Beispiel und Tabelle


Verbindungsabbau (bei TCP-Steuerung)

Der Verbindungsabbau kann auf drei Arten erfolgen:

—	Disconnect auf TCP/IP-Seite mit Kennbuchstaben d

—	Disconnect auf DDE-Seite mit ddeterm() oder ähnlichen Funktionen

—	Kappen der Socket-Verbindung. Dies beendet alle darüber laufenden DDE-Konversationen


TCP-seitiges Protokoll
Umsetzungstabelle fürTCP-gesteuerte Verbindung

TCP-Seite	DDE-Seite (Windows-API) (Matlab)

Aufbau der TCP-Verbindung zu Server und Port	nach Filterung (Erlaubnis-Liste) keine weitere Aktion
Senden von c service topic Zurück kommt c service topic hexnr	DDE-Konversationsaufbau (DdeInit) DdeConnect (…) Application/Service = service Thema/Topic = topic
Senden von t [service topic] zahl Zurück kommt t service topic zahl zahl = Zeit in Millisekunden	Festlegung einer Zeitüberschreitung für alle folgenden Transaktionen (sonst unendlich, zurzeit nicht implementiert!)
Senden von r [service topic] item (item...) Zurück kommt r service topic item value für jedes item; value ist der Wert des Elements	Variable abfragen (DdeRequest) DdeClientTransaction (…, XTYP_REQUEST) Element/Item = item Zwischenablageformat = CF_TEXT
Senden von p [service topic] item value (item value...) Zurück kommt p service topic item für jedes item-value-Paar	Variable setzen (DdePoke) DdeClientTransaction (…, XTYP_POKE) Element/Item = item Wert = value Zwischenablageformat = CF_TEXT
Senden von e [service topic] command (command...) Zurück kommt e service topic command für jedes command	Kommando ausführen (DdeExec) DdeClientTransaction (…, XTYP_EXECUTE) Kommando = command Zwischenablageformat = CF_TEXT
Senden von a [service topic] item (item...) Zurück kommt a service topic item für jedes item	Variable überwachen, „heiß“ (DdeAdv) DdeClientTransaction (…, XTYP_ADVSTART) Element/Item = item Zwischenablageformat = CF_TEXT
Senden von w [service topic] item (item...) Zurück kommt w service topic item für jedes item	Variable überwachen, „warm“ (DdeAdv) DdeClientT… (…, XTYP_ADVSTART|XTYPF_NODATA) Element/Item = item Zwischenablageformat = CF_TEXT
Zurück kommt m service topic item value bei „heißer“ und m service topic item bei „warmer“ Verbindung	Variablenveränderung (Callback-Aufruf) XTYP_ADVDATA Element/Item = item Zwischenablageformat = CF_TEXT
Senden von u [service topic] item (item...) Zurück kommt u service topic item für jedes item	Ende der Variablenüberwachung (DdeUnadv) DdeClientTransaction (…, XTYP_ADVSTOP) Element/Item = item Zwischenablageformat = CF_TEXT
Senden von d [service topic] Zurück kommt d service topic	Ende der Konversation (DdeTerm) DdeDisconnect()
Zurück kommt d service topic	Serverseitiges Konversations-Ende XTYP_DISCONNECT
Kappen der TCP-Verbindung	Ende aller über diesen Socket laufenden Konversationen DdeDisconnect()


Beispiel

1. Beispiel: telnet mit der Ein- und Ausgabe an einer Konsole:

Terminal-Fenster, gegenüber deutsches Excel 4.0, lokales Echo schwarz, Antwort rot:

c excel tab1	Verbindungsaufbau zur Datei "tab1.xls"
c Excel Tab1 0x000030AC
p z1s1 100	Element an Zeile 1, Spalte 1 setzen (auf 100)
p Excel Tab1 Z1S1
r z1s1	Element an Zeile 1, Spalte 1 abfragen
r Excel Tab1 Z1S1 100	…liefert die 100 zurück
d	Verbindungsabbau
d Excel Tab1
_

2. Beispiel: telnet und der Zugriff aufs Startmenü(!):

r progman progman spiele	Verknüpfungen im Verzeichnis "Spiele" beschaffen
r Progman Progman  "Spiele",E:\WINDOWS\LEMMINGS.GRP,4,7
"Solitär","sol",,E:\WINDOWS\SOL.EXE,19,72,0,0,0
"Hearts","E:\WINDOWS\MSHEARTS.EXE",E:\WINDOWS,E:\WINDOWS\MSHEARTS.EXE,89,72,0,0,0
"Minesweeper","winmine",,E:\WINDOWS\WINMINE.EXE,89,0,0,0,0
"Freecell","E:\WINPRG\FREECELL\FREECELL.EXE",E:\WINPRG\FREECELL,E:\WINPRG\FREECELL\FREECELL.EXE,19,0,0,0,0
d	Verbindungsabbau
d progman progman
_

Zwei Probleme werden sichtbar: die Zeilenendezeichen und die tollen Spionagemöglichkeiten: Man erkennt "sofort" das Betriebssystem und die Vorlieben (und daran das Alter) des Benutzers. Mit einem geeigneten Poke können diese Einträge sogar gezielt manipuliert und gelöscht werden…

Sie als Anwender sollten also unbedingt die Host-Erlaubnisliste so streng wie möglich machen.

3. Beispiel: Perl

(kommt noch)


DDE-seitiges Protokoll
D2S als DDE-Server und Socket-Client — DDE-gesteuert

Vorbereitung
Verbindungsaufnahme
Umsetzungs-Tabelle
Selbstbefruchtung

Vorbereitung

0.	Stellen Sie sicher, dass keine Firewall den Weg vom DDE-Rechner zum Ziel-Server versperrt. Installieren Sie ggf. ein geeignetes Tunnel-Programm auf der Firewall.

1.	Starten von D2S,

2.	im D2S-Konfigurationsdialog ein geeignetes Trennzeichen festlegen,

3.	dort eventuell auch andere Anpassungen vornehmen (siehe Konfigurationsdialog).

4.	Ein geeignetes Socket-Server-Programm muss auf dem Zielrechner laufen, das die Daten konform behandelt! Außerdem muss jener Server den Client-Rechner akzeptieren.

D2S arbeitet in dieser Art gegenüber DDE als Server (es nimmt DDE-Verbindungen entgegen) und gegenüber TCP als Socket-Client (startet Verbindungen wie ein WWW-Browser).

Verbindungsaufnahme

Das gesamte DDE-seitige Protokoll weist bis auf die Verbindungsaufnahme keine Besonderheiten auf.

Der DDE-Service ist (mit Absicht!) wie eine URL aufgebaut:

Matlab-Syntax:

c=ddeinit("ndde://[user[:password]@]server[:port]/service","topic")

Kennzeichen ist der ndde-Kopf des recht langen Service-Strings. Die Angaben user und password werden noch nicht ausgewertet.

Die anderen DDE-Transaktionen sind unverändert und führen zu den auf der nächsten Seite aufgelisteten TCP-seitigen Zeilen.


DDE-seitiges Protokoll
Umsetzungtabelle für DDE-gesteuerte Verbindung

DDE-Seite (in Klammern Matlab-Kommando)	TCP-Seite

DDE-Konversationsaufbau (DdeInit) Application/Service = ndde://server:port/service Thema/Topic = topic Rückkehr mit OK nach erfolgreichem TCP-Verbindungsaufbau und Bestätigungs-Zeile mit c	Aufbau der TCP-Verbindung zum angegebenen Server und Port. sendet c service topic erwartet c service topic hexnr
Variable abfragen (DdeRequest) Element/Item = item Zwischenablageformat = CF_TEXT Rückkehr mit Wert value bei Bestätigungs-Zeile mit r	sendet r service topic item erwartet r service topic item value
Variable setzen (DdePoke) Element/Item = item Wert = value Zwischenablageformat = CF_TEXT Rückkehr mit OK bei Bestätigungs-Zeile mit p	sendet p service topic item value erwartet p service topic item
Kommando ausführen (DdeExec) Kommando = command Zwischenablageformat = CF_TEXT Rückkehr mit OK bei Bestätigungs-Zeile mit e	sendet e service topic command erwartet e service topic command
Variable überwachen (DdeAdvise) Element/Item = item Heiß oder warm = (Schalter) Zwischenablageformat = CF_TEXT Rückkehr mit OK bei Bestätigungs-Zeile mit a oder w	sendet a service topic item bei „heißer“ und sendet w service topic item bei „warmer“ Verbindung erwartet a/w service topic item
Variablenveränderung (Callback-Aufruf) Windows-API: XTYP_ADVDATA Element/Item = item Zwischenablageformat = CF_TEXT	erwartet m service topic item value bei „heißer“ und erwartet m service topic item bei „warmer“ Verbindung
Ende der Variablenüberwachung (DdeUnadv) Element/Item = item Zwischenablageformat = CF_TEXT Rückkehr mit OK bei Bestätigungs-Zeile mit u	sendet u service topic item erwartet u service topic item
Ende der DDE-Konversation (DdeTerm) Rückkehr mit OK bei Bestätigungs-Zeile mit d	sendet d service topic erwartet d service topic Die TCP-Verbindung wird standardmäßig gekappt.
Unerwartetes Konversations-Ende Windows-API: XTYP_DISCONNECT	erwartet d service topic Die TCP-Verbindung wird standardmäßig gekappt.


„Selbstbefruchtung“

Das TCP-Protokoll wurde mit Absicht so konstruiert, dass auf dem „anderen Ende der Leitung“ bei einer DDE-gesteuerten Verbindung wiederum ein D2S-Dienst laufen kann, der dann TCP-gesteuert einen DDE-Server anspricht. So können sich zwei Windows-Rechner „unterhalten“, die weit voneinander entfernt stehen, und das ohne NetDDE.

Sie können D2S komplett und ganz einfach mit nur einem Rechner testen, indem Sie bei einer funktionierenden DDE-Verbindung vor den verwendeten DDE-Service einfach ndde://localhost/ davorschreiben.

Dann geht die Verbindung zweimal über D2S, einmal als DDE-Server [image] Socket-Client, und gleich danach als Socket-Server [image] DDE-Client.


DDE-Terminologie: Konversation

Ein „Gespräch“.

Beinhaltet das Einrichten (c) und Beenden (d) eines „Kanals“ für künftige Transaktionen.


DDE-Terminologie: Transaktion

Eine (Daten-)Übertragung.

Beinhaltet sowohl Abfrage (r) und Setzen (p) einer Variablen als auch das Ausführen (e) eines Kommandos.

Ferner gehört das Einrichten einer automatischen Benachrichtigungsschleife (a, w, u) zu den Transaktionen.