read()返回正数但recvline中没有任何内容

时间:2016-06-02 15:23:15

标签: c sockets

我在C中使用套接字,我想问一下,是正常的读取返回正值但是什么都不读?

#define MAXLINE 1234
....
upload(){
....
    long long unsigned int byteNum = 0, count = 0;
    ssize_t nbyte;
    char sendline[MAXLINE], recvline[MAXLINE];
....
    while((count += byteNum) < filesize) {
        bzero(sendline, MAXLINE);
        if((byteNum = fread(&sendline, sizeof(char), MAXLINE, fp)) != MAXLINE ){
            printf("End of file or Error\n");
        }
        if((nbyte = write(sockfd, sendline, byteNum)) < 0){
            printf("upload write error at count = %llu\n", count);
            exit(1);
        }read(sockfd, recvline, MAXLINE);
    }
....

}

download(){
....
    long long unsigned int filesize, count;
    ssize_t nbyte;
    char sendline[MAXLINE], recvline[MAXLINE];
....
        while((count += n) < filesize){
                bzero(recvline, MAXLINE);
                if((nbyte = read(sockfd, recvline, MAXLINE)) < 0){
                    printf("download read fail at %llu\n", count);
                    exit(1);
                }if(nbyte == 0){
                    printf("nbyte = 0!!\n");
                    return;
                }if(strlen(recvline) == 0){
                    printf("nbyte = %zd recvline = 0\n", nbyte);
                    return;
                }
                n = strlen(recvline);
                if(fwrite(&recvline, sizeof(char), nbyte, fp) != nbyte)
                    printf("end of file or error\n");
                write(sockfd, "ok", 2);                 
            }
....
}

结果

nbyte = 1234 recvline = 0

仅当文件大小很大时才会发生(在测试用例中,它大约为5GB),但在大约50MB的情况下,它的效果很好。

可能出现什么问题?

我已经改变了nbyte的类型(从unsigned long long改为ssize_t)

但结果仍然相同

1 个答案:

答案 0 :(得分:2)

  

我在C中使用套接字,我想问一下,是正常的读取返回   积极的价值,但什么都不读?

不,这不正常 - 成功时,read()始终返回它放入缓冲区的字节数。

  

可能出现什么问题?

看起来您正在尝试处理二进制数据,就好像它是ASCII文本数据一样。这是行不通的,因为二进制数据可能会有NUL /零字节,如果你试图把它当作文本数据(例如通过调用strlen()/ strcmp()/ strcpy()/ etc)那些函数将被这些NUL字节的存在所欺骗,因为这些函数需要一个NUL字节来表示字符串的结尾。

特别是,您所看到的是,有时写入recvline的第一个字节为0,这就是strlen(recvline)返回0的原因,即使read()将一个或多个有效字节写入recvline。 / p>