This is part of the server (sendfile):
offset = 0; for (size_to_send = fsize; size_to_send > 0; ){ rc = sendfile(newsockd, fd, &offset, size_to_send); if (rc <= 0){ perror("sendfile"); onexit(newsockd, sockd, fd, 3); } offset += rc; size_to_send -= rc; } close(fd); memset(buffer, 0, sizeof(buffer)); strcpy(buffer, "226 File Successfully transfered\n"); if(send(newsockd, buffer, strlen(buffer), 0) < 0){ perror("Errore durante l'invio 226"); onexit(newsockd, sockd, 0, 2); } memset(buffer, 0, sizeof(buffer));
and this is part of the client part (recv file):
fsize_tmp = fsize; sInfo.filebuffer = malloc(fsize); if(sInfo.filebuffer == NULL){ perror("malloc"); onexit(sockd, 0, fd, 4); } while(((uint32_t)total_bytes_read != fsize) && ((nread = read(sockd, sInfo.filebuffer, fsize_tmp)) > 0)){ if(write(fd, sInfo.filebuffer, nread) != nread){ perror("write RETR"); onexit(sockd, 0, 0, 1); } total_bytes_read += nread; fsize_tmp -= nread; } close(fd); memset(buffer, 0, sizeof(buffer)); if(recv(sockd, buffer, 34, 0) < 0){ perror("Errore ricezione 226"); onexit(sockd, 0, 0, 1); } printf("%s", buffer); memset(buffer, 0, sizeof(buffer)); memset(dirpath, 0, sizeof(dirpath)); free(sInfo.filebuffer);
The problem is that the line "226 File, etc." written inside the sent file.
I tried to do a little debugging, so I added printf after the for (server sendfile) loop and printf after the while (client) loop, and I noticed that the file was sent, but on the client it does not exit from this time because printf not printing. ..
Why did I get this strange behavior?
br>
EDIT:
The server sends the file size to the client with this code:
fd = open(filename, O_RDONLY); if(fd < 0){ error!! } if(fstat(fd, &fileStat) < 0){ perror("Errore fstat"); onexit(newsockd, sockd, fd, 3); } fsize = fileStat.st_size; if(send(newsockd, &fsize, sizeof(fsize), 0) < 0){ perror("Errore durante l'invio della grandezza del file\n"); onexit(newsockd, sockd, fd, 3); }
the client receives fsize from the server using this code:
if(read(sockd, &fsize, sizeof(fsize)) < 0){ perror("Errore durante ricezione grandezza file\n"); onexit(sockd, 0 ,0 ,1); } fd = open(sInfo.filename, O_CREAT | O_WRONLY, 0644); if (fd < 0) { perror("open"); onexit(sockd, 0 ,0 ,1); } fsize_tmp = fsize;
both fsize are declared as uint32_t ...