c - read() 返回正值,但 recvline 中没有任何内容

标签 c sockets

我在C中使用socket,我想问一下,正常读取返回正值但什么也没读到吗?

#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)

但结果还是一样

最佳答案

I'm using socket in C, and I want to ask, is that normal read return positive value but read nothing?

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

What might be wrong?

看起来您正在尝试像处理 ASCII 文本数据一样处理二进制数据。这是行不通的,因为二进制数据中可能有 NUL/零字节,如果您尝试将其视为文本数据(例如通过调用 strlen()/strcmp()/strcpy()/etc )那些函数会被这些 NUL 字节的存在所欺骗,因为这些函数期望 NUL 字节来指示字符串的结尾。

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

关于c - read() 返回正值,但 recvline 中没有任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37595998/

相关文章:

C 编程温度转换

比较 C 中的两个 GUID

c - C连接值重新分配中的TCP/IP

c - 一个数在没有休息的情况下整除多少次?

c - 为什么这段代码可以从返回地址中得到函数地址呢?

c - Linux 中 kmemdup_nul() 和 kstrndup() 有什么区别?

python - 将两个套接字连接在一起而不编写字节操作管道代码?

java - Java 套接字中的 HTTP

sockets - lwip stm32-HTTP请求失败

c - linux 2.6中的posix aio是否支持套接字文件描述符?