Hi zusammen,
ich arbeite mich gerade ein Wenig in die Netzwerkprogrammierung ein.
Dazu habe ich mir ein wahrscheinlich sehr einfaches Programm
geschrieben, welches einfach eine Zeile entgegen nimmt, und diese
protokolliert.
Das ganze soll später etwas ausgereift werden, daher die etwas
ausführliche Logfunktion.
-------------------- schnipp -------------------
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFFER 4096
#define ERROR 2
#define NOTICE 1
#define JUSTLOG 0
#define PORT_NUMMER 2233
void log(char *, int);
FILE *logfile;
int main(void)
{
struct sockaddr_in adresse;
char puffer[BUFFER],cmd[BUFFER];
int sockfd, connfd, i, n, j;
size_t adrlaenge = sizeof(struct sockaddr_in);
if ((logfile = fopen("srv.log", "ab+")) == NULL)
perror("logfile");
if ( (sockfd = socket(PF_INET, SOCK_STREAM, 0)) < 0)
log("Fehler beim socket-Aufruf", ERROR);
i = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));
adresse.sin_family = AF_INET;
adresse.sin_port = htons(PORT_NUMMER);
memset(&adresse.sin_addr, 0, sizeof(adresse.sin_addr));
if (bind(sockfd, (struct sockaddr *) &adresse, sizeof(adresse)))
log("Fehler beim bind-Aufruf", ERROR);
if (listen(sockfd, 5))
log("Fehler beim listen-Aufruf", ERROR);
sprintf(cmd,"Starte Dienst ...");
log(cmd, NOTICE);
while ( (connfd = accept(sockfd, (struct sockaddr *)&adresse,
&adrlaenge)) >= 0)
{
sprintf(cmd, "Verbindung von %s ... ",
inet_ntoa(adresse.sin_addr));
log(cmd, JUSTLOG);
j=0;
while ( (n = read(connfd, &puffer[j], 1)) > 0)
{
if (puffer[j] == '\n')
{
puffer[j] = 0;
sprintf(cmd,"%s",puffer);
log(puffer, NOTICE);
break;
}
j++;
}
if(n<0)
log("Fehler (n<0)",ERROR);
if(n==0)
log("Nichts emfangen (n=0)",ERROR);
sprintf(cmd,"Verbindung beendet ...");
log(cmd, JUSTLOG);
break;
}
sprintf(cmd,"Beende Dienst ...");
log(cmd, NOTICE);
fclose(logfile);
close(sockfd);
exit(0);
}
void log(char *message, int out)
{
time_t now;
struct tm *time_now;
char logstr[strlen(message)+30]; // +30 für Zeitangaben
now = time(NULL);
time_now=localtime(&now);
sprintf(logstr, "%02d.%02d.%4d %02d:%02d:%02d --- %s\n",
time_now->tm_mday,
time_now->tm_mon+1,
time_now->tm_year+1900,
time_now->tm_hour,
time_now->tm_min,
time_now->tm_sec,
message);
fprintf(logfile,"%s",logstr);
switch(out)
{
case JUSTLOG:
break;
case NOTICE:
fprintf(stdout,"%s",logstr);
break;
case ERROR:
fprintf(stdout,"%s",logstr);
fclose(logfile);
exit(1);
break;
default:
fprintf(stdout,
"Unbekannte Log-Anforderung");
break;
}
}
-------------------- schnapp -------------------
Das ganze kompiliere ich mit
gcc -W -Wall server.c -o server
(BTW gcc --version = 2.95.3)
Den Client simuliere ich mit
telnet localhost 2233
So, nun zu meinen Fragen.
Warum erscheint die Logfunktion sehr verzögert.
Ich lasse mir Ausgabe auf einer Konsole mittels
tail -f srv.log anzeigen.
Der Ausgabe "Starte Dienst ..." erscheint erst, wenn eine
Verbindung erstellt wurde.
Zweite Frage:
Ich habe schon etwas experimentiert.
Ich schaffe es nicht, daß ./server mehrere Clients gleichzeitig
bedienen kann.
Mittels fork() habe ich es leider nicht geschafft.
Kann mir da jemand unter die Arme greifen ?
Danke und Gruß
Martin
--
+-----------------------------------------------------------------+
| Martin Knipper | mail: martin@mk-os.de | http://www.mk-os.de |
+-----------------------------------------------------------------+