Moin
Vorne weg: Ja, es ist eine Hausaufgabe für mich. Meine Aufgabe ist es, einen Client und einen Server zu basteln.
Das habe ich auch getan.
Allerdings habe ich ein Problem, dass ich nicht ergründen kann. Der Server beendet sich einfach unvermittelt und ich kann die Fehlerursache nicht finden.
client.c
Funktioniert einwandfrei mit dem Echo-Server, den die Hochschule zum Testen bereit hält.
server.c
Funktioniert bis zum "debug 1" (sehr weit hinten im Quelltext).
Ausgabe des Clienten:
Ausgabe des Servers:
Ich muss wohl blind sein. Erkennt jemand, warum er an dieser Stelle das Programm einfach ohne Fehlermeldung abbricht?
Gruß, Laurin
Vorne weg: Ja, es ist eine Hausaufgabe für mich. Meine Aufgabe ist es, einen Client und einen Server zu basteln.
Das habe ich auch getan.
Allerdings habe ich ein Problem, dass ich nicht ergründen kann. Der Server beendet sich einfach unvermittelt und ich kann die Fehlerursache nicht finden.
client.c
Funktioniert einwandfrei mit dem Echo-Server, den die Hochschule zum Testen bereit hält.
Code:
#include <netdb.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <errno.h>
#define PROTO_TCP "tcp"
#define SERVICE "echo"
#define MAXLINE 512
int main( int argc, char *argv[], char *envp)
{
struct hostent *hostInfo;
struct servent *serviceInfo;
struct protoent *protoInfo;
struct sockaddr_in connection;
char sendline[] = { "Hallo Welt!" };
char recvline[MAXLINE + 1];
int lauf;
int sock;
// 2. Argument ist der Hostname
if ( argc == 2 )
{
// Hostinformationen abrufen.
{
if ( (hostInfo = gethostbyname(argv[1])) == NULL )
{
// Konnte keine Informationen über den Host bekommen.
fprintf(stderr, "IP-Adresse von %s konnte nicht ermittelt werden !\n", *argv);
return 1;
}
printf("Hostname: %s\n", hostInfo -> h_name);
}
// IP-Adresse des Hosts ermitteln.
{
printf("IP: ");
for(lauf = 0; lauf < hostInfo -> h_length; lauf++)
{
if( lauf> 0) printf(".");
printf("%i", (unsigned char) hostInfo -> h_addr[lauf]);
}
printf("\n");
}
// Echo-Service ansprechen.
{
// Socket anlegen.
{
protoInfo = getprotobyname(PROTO_TCP);
sock = socket(AF_INET, SOCK_STREAM, protoInfo -> p_proto);
// Fehlerbehandlung
if ( sock < 0 )
{
fprintf(stderr, "Socketfehler");
return 1;
}
printf("Socket geöffnet\n");
}
// Verbindung herstellen, etwas senden und empfangen, Verbindung schließen.
{
// Verbindung herstellen.
{
if ( (serviceInfo = getservbyname(SERVICE, PROTO_TCP)) == NULL )
{
fprintf(stderr, "Servicefehler.");
return 1;
}
memset(&connection, 0, sizeof(connection));
connection.sin_family = AF_INET;
connection.sin_addr = *(struct in_addr *)*hostInfo -> h_addr_list;
connection.sin_port = htons(serviceInfo -> s_port);
if ( connect(sock, (struct sockaddr *) &connection, sizeof(connection)) < 0 )
{
perror("Verbindungsfehler");
close(sock);
return 1;
}
printf("Verbindung hergestellt.\n");
fflush(stdout);
}
// Etwas übertragen.
{
if ( send(sock, sendline, sizeof(sendline), 0) < 0 )
{
fprintf(stderr, "Sendefehler");
close(sock);
return 0;
}
printf("\"%s\" an den Server gesendet.\n", sendline);
}
// Etwas empfangen.
{
if ( recv(sock, recvline, MAXLINE, 0) < 0 )
{
fprintf(stderr, "Empfangsfehler");
close(sock);
return 0;
}
printf("Vom Server empfangen: \"%s\"\n", recvline);
}
// Verbindung schließen.
{
close(sock);
}
}
}
return 0;
}
else
{
printf("Syntax: ./client Hostname\n\n");
printf("Hostname - Host- oder Domainname eines Computers,\nbei Leerzeichen in Anführungsstriche setzen.\n");
return 0;
}
}
server.c
Funktioniert bis zum "debug 1" (sehr weit hinten im Quelltext).
Code:
#include <netdb.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#define PROTO_TCP "tcp"
#define SERVICE "echo"
#define MAXLINE 512
int main( int argc, char *argv[], char *envp)
{
struct protoent *protoInfo;
struct sockaddr_in server, client;
struct servent *serviceInfo;
int sock, sock_client;
socklen_t len;
char recvline[MAXLINE + 1];
int quit = 0;
// Echo-Service ansprechen.
{
printf("\nServer startet...\n");
// Socket anlegen.
{
protoInfo = getprotobyname(PROTO_TCP);
sock = socket(AF_INET, SOCK_STREAM, protoInfo -> p_proto);
// Fehlerbehandlung
if ( sock < 0 )
{
fprintf(stderr, "Socketfehler");
return 1;
}
printf("Socket angelegt.\n");
}
// Socket binden
{
if ( (serviceInfo = getservbyname(SERVICE, PROTO_TCP)) == NULL )
{
fprintf(stderr, "Servicefehler.");
return 1;
}
memset(&server, 0, sizeof(server));
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl(INADDR_ANY);
server.sin_port = htons(serviceInfo -> s_port);
if ( bind(sock, (struct sockaddr*) &server, sizeof(server)) < 0 )
{
// Fehlerbehandlung
fprintf(stderr, "Bind-Fehler");
return 1;
}
printf("Socket-Bind ausgefuehrt.\n");
}
// Warteschlange einrichten
{
if ( listen(sock, 5) == -1 )
{
// Fehlerbehandlung
fprintf(stderr, "Listen-Fehler");
return 1;
}
printf("Warteschlange eingerichtet.\n");
}
printf("Server bereit.\n\n");
}
// Socket abhoehren
{
while ( quit == 0 )
{
// Eingehende Verbindung akzeptieren
len = sizeof(client);
sock_client = accept(sock, (struct sockaddr*) &client, &len);
if (sock_client <= 0)
{
// Fehlerbehandlung
fprintf(stderr, "Clientverbindung fehlgeschlagen. Server laeuft weiter.");
}
else
{
// Daten vom Clienten empfangen.
{
if ( recv(sock_client, recvline, MAXLINE, 0) < 0 )
{
fprintf(stderr, "Empfangsfehler.");
quit = 1;
}
printf("Vom Clienten empfangen: \"%s\"\n", recvline);
}
[COLOR="Red"]printf("debug 1\n");[/COLOR]
// Antwort an den Clienten schicken.
{ printf("debug 2");
if ( send(sock, recvline, sizeof(recvline), 0) < 0 )
{
fprintf(stderr, "Sendefehler.");
quit = 1;
}
printf("Antwort an den Clienten gesendet.\n");
}
printf("debug 3\n");
// Verbindung zum Clienten unterbrechen.
{
close(sock_client);
printf("Verbindung zum Clienten getrennt.\n\n");
}
}
}
}
// Server beenden.
{
printf("Server wird beendet...\n");
if ( sock_client >= 0 )
close(sock_client);
if ( sock >= 0 )
close(sock);
printf("Server beendet.\n\n");
}
}
An der roten Stelle sollte eigentlich "Vom Server empfangen: Hallo Welt!" stehen. Der Server sendet aber offenbar keine Antwort, weswegen der String leer bleibt.$ ./client localhost
Hostname: localhost.localdomain
IP: 127.0.0.1
Socket geöffnet
Verbindung hergestellt.
"Hallo Welt!" an den Server gesendet.
Vom Server empfangen: ""
Ausgabe des Servers:
Das ist mir völlig unverständlich. Hier müsste mehr ausgegeben werden, aber das Programm ist da einfach zuende.$ ./server
Server startet...
Socket angelegt.
Socket-Bind ausgefuehrt.
Warteschlange eingerichtet.
Server bereit.
Vom Clienten empfangen: "Hallo Welt!"
debug 1
Ich muss wohl blind sein. Erkennt jemand, warum er an dieser Stelle das Programm einfach ohne Fehlermeldung abbricht?
Gruß, Laurin