TCP Beispiel

Das folgende Beispiel zeigt eine Implementierung eines "Echo"-Clients/-Servers. Der Local-Client soll lediglich einen Test-String zum Remote-Server in bestimmten Abständen (z.B. jede Sekunde) senden. Der Remote-Server soll darauf sofort den gleichen String unverändert an den Client zurücksenden. 

Der Client soll als Funktionsbaustein implementiert werden, von dem mehrere Instanzen angelegt werden können. Zudem soll der Server mit mehreren Clients kommunizieren können.

Von dem Server können auch mehrere Instanzen angelegt werden. Jede Server-Instanz wird dann über eine andere Portnummer angesprochen. Die Serverimplementierung ist schwieriger, wenn der Server mit mehr als nur einem Client kommunizieren soll. Außerdem wird eine Implementierung eines passenden Clients in .NET vorgestellt. Das Beispiel kann als Ansatz benutzt werden um eigene, komplexere Implementierungen realisieren zu können. 

Systemvoraussetzungen

Projektsourcen

Projektbeschreibung

Hilfsfunktionen im Beispielprojekt

Im Beispiel werden einige Funktionen, Konstanten und Funktionsbausteine benutzt, die im Folgenden kurz beschrieben werden müssen:

FUNCTION LogError : DINT

TCP Beispiel 1:

Die Funktion schreibt eine Meldung mit dem Fehlercode in das Logbuch des Betriebssystems (Event Viewer). Die globale Variable bLogDebugMessages muss vorher auf TRUE gesetzt werden.

FUNCTION LogMessage : DINT

TCP Beispiel 2:

Die Funktion schreibt eine Meldung in das Logbuch des Betriebssystems (Event Viewer), wenn ein neuer Socket geöffnet oder geschlossen wurde. Die globale Variable bLogDebugMessages muss vorher auf TRUE gesetzt werden.

FUNCTION SCODE_CODE : DWORD

TCP Beispiel 3:

Die Funktion maskiert die niederwertigsten 16Bits eines Win32 Fehlercodes aus und liefert diese zurück.

Globale Konstanten/Variablen

Name

Default value

Description

bLogDebugMessages

TRUE

Aktiviert/Deaktiviert das Schreiben der Meldungen in das Logbuch des Betriebssystems;

MAX_CLIENT_CONNECTIONS

5

Maximale Anzahl der Remote-Clients, die eine Verbindung zum Server gleichzeitig aufbauen können;

MAX_PLCPRJ_RXBUFFER_SIZE

1000

Maximale Länge des internen Empfangspuffers;

PLCPRJ_RECONNECT_TIME

T#3s

SERVER: Nach Ablauf dieser Zeit versucht der Local-Server den Listener-Socket neu zu öffnen;
 

CLIENT: Nach Ablauf dieser Zeit versucht der Local-Client die Verbindung zum Remote-Server wiederherzustellen;

PLCPRJ_SEND_CYCLE_TIME

T#1s

In diesen Abständen wird der Test-String vom Local-Client zum Remote-Server zyklisch gesendet;

PLCPRJ_RECEIVE_POLLING_TIME

T#1s

SERVER und CLIENT: In diesem Zyklus werden die Empfangsdaten gelesen (gepollt);

PLCPRJ_RECEIVE_TIMEOUT

T#10s (CLIENT)

T#50s (SERVER)

SERVER: Nach dieser Zeit bricht der Local-Server den Empfang ab, wenn in dieser Zeit keine Datenbytes empfangen werden konnten;
 

CLIENT: Nach dieser Zeit bricht der Local-Client den Empfang ab, wenn in dieser Zeit keine Datenbytes empfangen werden konnten;

PLCPRJ_ACCEPT_POLLING_TIME

T#1s

In diesen Zeitabständen versucht der Locale-Server die Verbindungsanforderungen des Remote-Clients anzunehmen (akzeptieren);

PLCPRJ_ERROR_RECEIVE_BUFFER_OVERFLOW 

16#8101

Interner Beispielprojekt-Fehlercode: Es wurden zu viele Zeichen ohne Nullterminierung empfangen;

PLCPRJ_ERROR_RECEIVE_TIMEOUT

16#8102

Interner Beispielprojekt-Fehlercode: Es konnten keine neue Daten innerhalb der Timeoutzeit (PLCPRJ_RECEIVE_TIMEOUT) empfangen werden.