#$K+ 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

#$K+ 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.

#$K+ 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

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

#KVorbereitung
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.

#$K+ 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 , 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.

#$K+ 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

#$K+ 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

#$K+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

#$K+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()	

#$K+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)

#$K+D2S als DDE-Server und Socket-Client — DDE-gesteuert
	Vorbereitung
	Verbindungsaufnahme
	Umsetzungs-Tabelle
	Selbstbefruchtung
#KVorbereitung
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).
#KVerbindungsaufnahme
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.

#$K+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.	

#$K+„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-ServerSocket-Client, und gleich danach als Socket-ServerDDE-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.