我在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)
但结果仍然相同
答案 0 :(得分:2)
我在C中使用套接字,我想问一下,是正常的读取返回 积极的价值,但什么都不读?
不,这不正常 - 成功时,read()始终返回它放入缓冲区的字节数。
可能出现什么问题?
看起来您正在尝试处理二进制数据,就好像它是ASCII文本数据一样。这是行不通的,因为二进制数据可能会有NUL /零字节,如果你试图把它当作文本数据(例如通过调用strlen()/ strcmp()/ strcpy()/ etc)那些函数将被这些NUL字节的存在所欺骗,因为这些函数需要一个NUL字节来表示字符串的结尾。
特别是,您所看到的是,有时写入recvline的第一个字节为0,这就是strlen(recvline)返回0的原因,即使read()将一个或多个有效字节写入recvline。 / p>