2012-07-07 53 views
0

這是我的客戶端代碼片段:Ç的sendfile,然後其他文本

while(((uint32_t)total_bytes_read != fsize) && ((nread = read(sockd, filebuffer, sizeof(filebuffer))) > 0)){ 
    if(write(fd, filebuffer, nread) < 0){ 
     perror("write"); 
     close(sockd); 
     exit(1); 
    } 
    total_bytes_read += nread; 
} 
memset(buffer, 0, sizeof(buffer)); 
if(recv(sockd, buffer, sizeof(buffer), 0) < 0){ 
    perror("Errore ricezione 226"); 
    close(sockd); 
    exit(1); 
} 
printf("%s", buffer); 
memset(buffer, 0, sizeof(buffer)); 
if(recv(sockd, buffer, sizeof(buffer), 0) < 0){ 
    perror("Errore ricezione 221"); 
    close(sockd); 
    exit(1); 
} 
printf("%s", buffer); 
close(fd); 

其中第一它接收文件和比它監聽2服務器的消息。
這裏的服務器的片段:

offset = 0; 
rc = sendfile(newsockd, fd, &offset, fileStat.st_size); 
if(rc == -1) { 
     fprintf(stderr, "Errore durante l'invio di: '%s'\n", strerror(errno)); 
     onexit(newsockd, sockd, fd, 3); 
} 
if((uint32_t)rc != fsize) { 
    fprintf(stderr, "Trasferimento incompleto: %d di %d bytes inviati\n", rc, (int)fileStat.st_size); 
    onexit(newsockd, sockd, fd, 3); 
} 
memset(buffer, 0, sizeof(buffer)); 
strcpy(buffer, "226 File trasferito con successo\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)); 
strcpy(buffer, "221 Goodbye\n"); 
if(send(newsockd, buffer, strlen(buffer), 0) < 0){ 
    perror("Errore durante l'invio 221"); 
    onexit(newsockd, sockd, 0, 2); 
} 

的問題是,已經RETRived該文件還包含由它爲什麼發生在服務器O.o
發出的2條消息?我已經對客戶說:「recv直到文件大小」......我不明白爲什麼該文件還包含2條消息-.-''

回答

1

while(((uint32_t)total_bytes_read!= FSIZE)& &((NREAD =讀(sockd, filebuffer,的sizeof(filebuffer)))> 0))

如果你碰巧讀人比FSIZE的說法仍然是正確的,你贏了」多字節t擺脫了循環。

+0

所以我要把'total_bytes_read polslinux 2012-07-07 14:22:45

+0

<=,寫下文件的剩餘部分,然後開始爲2條消息做適當的操作,因爲您可能已經有一些字節了。 – Duck 2012-07-07 14:35:23

+0

以'<'和也與'<='我有一個奇怪的現象:文件retrived但它是空的,其內容寫到stdout:是什麼在這裏我完全不明白的標準輸出部分基於Ø – polslinux 2012-07-07 14:38:04