Skip to Content

Verteilte Systeme

Gegeben sei die folgende C++-Implementierung eines Clients in einer Server-Client-Anwendung, die via Sockets Daten in Form eines Strings vom Client zum Server sendet.

#include <iostream > #include <cstring > // Needed for memset #include <sys/socket.h> #include <arpa/inet.h> // For inet_addr #include <unistd.h> #define MAX_BUFFER_SIZE 1024 #define PORT 8081 int main() { int sock; struct sockaddr_in server; char message[MAX_BUFFER_SIZE]; // Create socket sock = socket(AF_INET , SOCK_STREAM , 0); if (sock == -1) { std::cerr << "Could not create socket\n"; return 1; } server.sin_addr.s_addr = inet_addr("127.0.0.1"); server.sin_family = AF_INET; server.sin_port = htons(PORT); // Connect to server if (connect(sock , (struct sockaddr*)&server , sizeof(server)) < 0) { std::cerr << "Connect failed\n"; return 1; } std::cout << "Connected\n"; // Communicate with the server std::cout << "Enter a message: "; std::cin.getline(message , MAX_BUFFER_SIZE); if (send(sock , message , strlen(message), 0) < 0) { std::cerr << "Send failed\n"; return 1; } std::cout << "Closing connection ...\n"; close(sock); return 0; }

Teilaufgabe 1:

Wir wollen zur Steigerung der Effizienz der Kommunikation nun nicht mehr ASCII-Zeichen sondern ganze Zahlen (Integer) im Binärformat versenden. Passen Sie den Client entsprechend an, dass nun ein Integer-Wert anstelle eines Strings versendet wird. Hinweis: Sie müssen nicht den bestehend Quellcode abschreiben. Geben Sie Zeilennummern an, um kenntlich zu machen, wo Sie welche Änderungen vornehmen.

Antwort:

char message[MAX_BUFFER_SIZE]; -> int message; std::cout << "Enter a number: "; std::cin >> number; if(send(sock , &number , sizeof(number), 0) < 0) { std::cerr << "Send failed\n"; return 1; }

Teilaufgabe 2:

Erläutern Sie kurz, welche Änderungen auf Seiten des Servers notwendig sind und welche Aspekte beim Versand von Binärdaten noch zu beachten sind, um die gewünschte Funktionalität zu realisieren.

Antwort:

  • Der Server muss anstelle eines char-Arrays einen int-Puffer verwenden.

  • Ersetze recv(sock, buffer, MAX_BUFFER_SIZE, 0) durch recv(sock, &number, sizeof(number), 0).

  • Beim Senden sollte sichergestellt werden, dass die Daten in Network Byte Order gesendet werden.

  • Senden: htonl(number)

  • Empfangen: ntohl(number)

Last updated on