c-uebungen/Assignment_028/solution/socket_server.c

81 lines
2.1 KiB
C

/**
* Socket-Server programmieren.
*
* Schreiben Sie einen Socket-Server, der auf 127.0.0.1
* und Port 8080 lauscht. Wenn sich ein Client verbindet,
* liest der Server eine Zeichenfolge vom Client und sendet
* dann den Text "Hello, " + Zeichenfolge + "!" zurück an
* den Client.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#define PORT 8080
#define BUFFER_SIZE 1024
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char name[BUFFER_SIZE - 20];
char answer[BUFFER_SIZE];
memset(name, 0, sizeof(name));
// Socket erstellen
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == -1) {
perror("Fehler beim Erstellen des Sockets");
exit(EXIT_FAILURE);
}
// Adresse konfigurieren
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// Socket an Port binden
if (bind(server_fd, (struct sockaddr*)&address, sizeof(address)) == -1) {
perror("Fehler beim Binden des Sockets");
exit(EXIT_FAILURE);
}
// Auf Verbindungen lauschen
if (listen(server_fd, 1) == -1) {
perror("Fehler beim Lauschen auf Verbindungen");
exit(EXIT_FAILURE);
}
printf("Server läuft und lauscht auf Port %d\n", PORT);
// Auf Verbindung warten und Nachricht senden
while ((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen))) {
if (new_socket == -1) {
perror("Fehler beim Akzeptieren der Verbindung");
exit(EXIT_FAILURE);
}
// Namen lesen
ssize_t len = read(new_socket, name, BUFFER_SIZE - 20);
if (len < 0) {
perror("Fehler beim Lesen");
exit(EXIT_FAILURE);
}
snprintf(answer, BUFFER_SIZE, "Hello, %s!\n", name);
write(new_socket, answer, strlen(answer));
}
// Verbindung schließen
close(new_socket);
close(server_fd);
return 0;
}