-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hallo Martin, richtig helfen kann ich nicht dafür kann ich Dir vielleicht einen Tip geben, falls Du etwas ähnliches vor hast wie das hier entwickelte VisIT. http://www.fz-juelich.de/zam/pt/projects.html#visit Gruss Reimar Am Freitag, 14. Februar 2003 16:38 schrieb Martin Knipper:
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 Ausgaben auf einer Konsole mittels tail -f srv.log anzeigen. Der Ausgabe "Starte Dienst ..." erscheint erst, wenn eine Verbindung erstellt wurde. (Unter c++ kenne ich sowas wie "cout<<"Hallo"<
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
- -- Forschungszentrum Juelich email: R.Bauer@fz-juelich.de http://www.fz-juelich.de/icg/icg-i/ ================================================================== a IDL library at ForschungsZentrum Juelich http://www.fz-juelich.de/icg/icg-i/idl_icglib/idl_lib_intro.html -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.0.7 (GNU/Linux) iD8DBQE+ToW85aOc3Q9hk/kRAjE9AJoDpm99Q1XAoQ1baVgEh737mCAbgQCgndUP X22ws1c9J7AIJTLBNr40L4I= =zWTR -----END PGP SIGNATURE-----