10 - Interprozesskommunikation


1. Übersicht

Die persistente Personenveraltung vom letzten Praktikum soll auf zwei Programme aufgeteilt werden. Einen Client und einen Server. Der Server ist verantwortlich für die Speicherung der Daten sowie für deren Modifikation. Der Client besteht nur aus der Benutzerschnittstelle. Alle Befehle und die dazugehörigen Informationen werden an den Server weitergeleitet, wo diese dann verarbeitet werden. Allfällige Antworten werden vom Server an den Clientübermittelt und von diesem angezeigt.

Wie immer müssen die bereitgestellten Tests erfolgreich bestanden werden.


2. Lernziele

In diesem Praktikum lernen Sie:

  • Anwendung von Sockets

  • Verbingungsaufbau und Kommunikation

  • Programmaufbau eines Clients

  • Programmaufbau eines Servers

Die Bewertung dieses Praktikums ist am Ende angegeben.

Erweitern Sie die vorgegebenen Code-Gerüste, welche im git Repository snp-lab-code verfügbar sind.


3. Aufgabe: Client Server Funktionen

In einem ersten Schritt sollen einige allgemeine Funktionen, welche in der Nachfolgenden Aufgabe zur Anwendung kommen, implementiert werden. Implementieren Sie dazu die den Programmen tcp_client und tcp_server verwendeten Funktionen.


3.1 Im Modul tcp_client.c:

int client_connect (const char* ServerName, const char* PortNumber);
Diese Funktion erstellt und verbindet einen Socket zum Server und gibt den Socket zurück.
Verwenden Sie folgende Funktionen:
- getAddrInfo mit folgenden hints
	hints.ai_family = AF_INET;       // Nur IPv4
	hints.ai_socktype = SOCK_STREAM; // TCP Stream Sockets
- socket 
- connect
void sendRequest (int communicationSocket, char* buffer, int len);
Diese Funktion sendet einen Request an den Server.
buffer: in buffer steht der Inhalt
len: gibt die Anzahl zu sendende Bytes
int  receiveResponse (int communicationSocket, char* buffer, int len);
Diese Funktion empfängt genau len Anzahl Bytes und speichert diese in buffer.

3.2 Im Modul tcp_server.c:

void server_init(char* portNumber);

int  getRequest(char* requestBuffer, int max_len);

void sendResponse(char* response, int resp_len);

void server_close_connection(void);

4. Aufgabe: Client Server Funktionen

Die zu erstellenden Programme personen_client und personen_server ergänzen die persistente Personenverwaltung vom letzten Praktikum durch folgende Funktionalität:


4.1 Server:

  1. Der Server hat kein User Interface.

  2. Beim Start liest der Server die Datei ein wartet auf Requests eines Clients Es gibt folgende Requests:
    clear
    remove
    insert
    show

    Die Requests werden im unten definierten Format übertragen.

  3. Trifft ein Request ein, wird dieser analysiert, verarbeitet und beantwortet.


4.2 Client

Der Client funktioniert wie die Vorgängerversion, ausser in folgenden Punkten:

  1. Der Client hat keine Personenliste, somit wird beim Start auch keine Liste geladen.

  2. Commands die der Benutzer eingibt werden als Request an den Server übertragen. Eine allfällige Antwort wird vom Client ausgegeben, so wie im vorangehenden Praktikum.


4.3 Übertragungsprotokoll

Zu folgenden User Commands: I(nsert), R(emove), S(how), C(lear) ist jeweils ein Request und gegebenenfalls eine Response definiert:

Insert:

  • Byte 0: I

  • Byte 1: Länge der Daten (Einzufügende Person als csv, wie im letzten Praktikum)

  • Byte 2…: Daten, inkl. terminierender Null

    Response:

    • Byte 1: {0=Ok, 1=not found, 2=invalid data}

Remove:

  • Byte 0: R

  • Byte 2…: wie bei Insert

    Response:

    • Wie bei Insert

Show:

  • Byte 1: S

    Response:

    • Byte 0: noOfRecords

    • Falls noOfRecords >0

    • Byte 1: Länge des 1. Records

    • Byte 2…n: Daten des 1. Records im csv-Format, inklusive terminierender Null

Clear:

  • Byte 0: C

    Keine Response


4.4 Hinweise

  • Verwenden Sie die in der vorangehenden Aufgabe implementierten Funktionen.

  • Die Implementation von person_client und person_server ist im Wesentlichen eine Kombination aus dem entsprechenden Programm der 1. Aufgabe und dem Hauptprogramm aus dem Praktikum.

  • Der Client soll nach jedem Request, und allfällg erhaltener Response den Socket schliessen.

  • Der Server soll nach einem vollständig abgearbeiteten Request Client-Socket schliessen.


5. Bewertung

Die gegebenenfalls gestellten Theorieaufgaben und der funktionierende Programmcode müssen der Praktikumsbetreuung gezeigt werden. Die Lösungen müssen mündlich erklärt werden.

Als Abnahme müssen sich die zur Verfügung gestellten Binary-Files (person_server_test_purpose, person_client_test_purpose) mit den jeweiligen Gegenstücken des Studenten als lauffähig erweisen.

Aufgabe

Kriterium

Punkte

Sie können das funktionierende Programm demonstrieren und erklären.

3.1

Gegebene Funktionen implementiert

1

3.2

Gegebene Funktionen implementiert

1

4

Server-Client-Kommunikation lauffähig und mit UserInterface

2

Summe

4


Version: 09.05.2022