<ERLEDIGT> fwrite schreibt nicht
-
Nach 3 Stunden Source ändern und debuggen hab ich jetzt die Schnauze voll, ich finde das Problem nicht. Ich hoffe, ihr findet es. Das Programm wartet auf Port 2222 auf Verbindungen. Wenn ein client einen String sendet, soll fwrite ihn in ne Tempfile packen, da der ankommende string von der Länge variieren kann. Doch fwrite schreibt nicht. Die funktion heißt recvtotmpfile und befindet sich in der sockets.c
gcc sockets.c main.c funzt ohne Problememain.c
#include "sockets.h" int main() { int sock; sock = initsock(LISTENPORT); return 0; }
sockets.h
#ifndef SOCKETS_H #define SOCKETS_H #endif /*for standard funcs*/ #include <stdio.h> #include <stdlib.h> /*void err0r(errno)*/ #include <errno.h> /*for sockets*/ #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <arpa/inet.h> #include <unistd.h> /*memcpy*/ #include <string.h> /*Receive message for log*/ /* Defines */ #define LISTENPORT 2222 #define Hwiddata "http://somepage.tld/somelist" #define RCVBUFSIZE 1024 #define CONFIG "datas.conf" int echo_bind(int client_socket); char *filetobuf(char *filename); char *recvtotmpfile(int sock); int initsock(int Port); void err0r(char *Message);
#include "sockets.h" void err0r(char *Message) { fprintf(stderr, "%s: %s\n", Message, strerror(errno)); exit(EXIT_FAILURE); } int initsock(int Port) { struct hostent *host_info = NULL; struct sockaddr_in server, client; int sock; int len; int fd; unsigned long addr; sock = socket( AF_INET, SOCK_STREAM, 0 ); if ( sock < 0) err0r("Fehler bei socket()"); memset( &server, 0, sizeof (server)); server.sin_family = AF_INET; /* INADDR_ANY take every IP */ server.sin_addr.s_addr = htonl(INADDR_ANY); /* Portnumber */ server.sin_port = htons(Port); /* Bind port */ if(bind(sock,(struct sockaddr*)&server, sizeof( server)) < 0) err0r("Kann das Socket nicht \"binden\""); /* Teile dem Socket mit, dass Verbindungswünsche * von Clients entgegengenommen werden */ if(listen(sock, 5) == -1 ) err0r("Fehler bei listen"); printf("Server bereit – wartet auf Anfragen ...\n"); /* Bearbeite die Verbindungswünsche von Clients * in einer Endlosschleife * Der Aufruf von accept() blockiert solange, * bis ein Client Verbindung aufnimmt */ for (;;) { len = sizeof(client); fd = accept(sock, (struct sockaddr*)&client, &len); if (fd < 0) err0r("Fehler bei accept"); printf("Bearbeite Client mit der Adresse: %s\n", inet_ntoa(client.sin_addr)); /* Daten vom Client auf dem Bildschirm ausgeben */ // echo_bind( fd ); recvtotmpfile(fd); /* Schließe die Verbindung */ } // printf("bla\n"); return sock; } char *recvtotmpfile(int sock) { static char *filename; char *bufpointer; char buf[1024]; char file[] = {"tmprecvXXXXXX"}; int fileptr; int n; FILE *tmpfile; bufpointer = buf; /*und jetz werden die Zeichen generiert und ein fileptr auf mkstemp gesetzt. Typ int, weil mkstemp die func open() nutzt*/ if((fileptr = mkstemp(file)) == -1) { err0r("mkstemp"); } if((tmpfile = fdopen(fileptr, "a+")) == NULL) { err0r("fopen"); } while ((n = recv(sock, buf, 1023, 0)) > 0) { buf[n] = 0; printf("%s",buf); if((fwrite (buf , 1 , sizeof(buf) , tmpfile )) <= 0) { err0r("fwrite"); } } close(fileptr); fclose(tmpfile); return filename; } char *filetobuf(char *filename) { FILE *File; long sizeoffile; char *buffer; size_t result; /* add the b sets your file mode, if it is binary or ascii. */ File = fopen (filename , "r" ); if (File==NULL) { err0r("File error: "); } fseek (File , 0 , SEEK_END); /* tell me the file size */ sizeoffile = ftell (File); rewind (File); /* allocating the mem for the file */ buffer = (char*) malloc (sizeof(char)*sizeoffile); if (buffer == NULL) { err0r("Cannot allocate memory error: "); } /* Copyfile to buf */ result = fread (buffer,1,sizeoffile,File); if (result != sizeoffile) { err0r("File error: "); } /* and now let the server know, what the file includesn */ fclose (File); remove(filename); return buffer; } int echo_bind(int client_socket) { char echo_buffer[RCVBUFSIZE]; int recv_size; time_t zeit; if((recv_size = recv(client_socket, echo_buffer, RCVBUFSIZE,0)) < 0) err0r("Fehler bei recv()"); echo_buffer[recv_size] = '\0'; time(&zeit); printf("Nachrichten vom Client : %s \t%i",echo_buffer, ctime(&zeit)); }
Ich vermute, irgendein klitzekleines Detail verursacht den Fehler... Ich wäre ja so dankbar für Lösungsvorschläge.
-
Ohne den Code mir angeschaut zu haben: Vermutlich hast du n man: fflush vergessen. fwrite etc. sind gebufferte Funktionen. Die schreiben erst wirklich auf das Ausgabedevice, wenn genug Daten vorhanden sind oder wenn man sie zwingt.
-
Ich danke dir, das habe ich nicht gewusst. Hab ich mal wieder was gelernt. Jetz kümmer ich mich nur noch über den Webschrott, der dazu kommt, anscheinen hilft das buf = 0 auch nich( mein backslash spinnt....)
aber das krieg ich schon noch über google hin. Gelöst.