81 lines
2.1 KiB
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;
|
|
}
|