0

これは私のクライアントコードのスニペットです:

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されたファイルに、サーバーによって送信された2つのメッセージも含まれていることです。Oo
なぜ発生するのですか?私はクライアントに「ファイルサイズまでrecv」と言いました...ファイルに2つのメッセージも含まれている理由がわかりません-.-」

4

1 に答える 1

1

while(((uint32_t)total_bytes_read!= fsize)&&((nread = read(sockd、filebuffer、sizeof(filebuffer)))> 0))

fsizeより1バイト多く読み取った場合でも、ステートメントは真であり、ループから抜け出すことはありません。

于 2012-07-07T14:21:50.327 に答える