gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:20:29 24 4
gpt4 key购买 nike

我在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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com