Verteilte Systeme
Probeklausur SoSe 2023
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)durchrecv(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)