我一直试图通过套接字发送(使用发送或写入功能)40字节(因为要求它应该适用于任何长度的流)二进制文件。但是不能发送超过8字节。我也试过循环。
可能出现什么问题。
这里是代码的一部分
char buf;
char *sbuf;
FILE *fin;
fin = fopen(file.dat, "rb");
while( fread(&buf, sizeof(char), 1, fin) > 0 && (fin != NULL))
counter++;
fseek( fin, 0 , SEEK_SET );
sbuf = (char *) malloc(sizeof(char)*(counter + 1));
fread(sbuf, 1, counter, fin);
// I tried both of this methods
int x;
x = write(s, sbuf, sizeof(sbuf));
printf("sent data size is %d\n", x); //prints 8bytes only while file.dat is of size 40bytes
// the other method
int total = 0;
int *len;
int bytesleft = *len;
while(total < *len) {
x = write(s, sbuf+total, bytesleft);
if (x == -1) { break; }
total += x;
bytesleft -= x;
}
printf("sent data size is %d\n", x); //also prints 8bytes only while file.dat is of size 40bytes
答案 0 :(得分:1)
您的代码存在多个问题。首先,您需要在之前检查文件指针fin
,然后尝试对其执行任何操作。它也不会自动设置为NULL
,因此如果文件正确打开,条件fin != NULL
将始终在循环中为真。
另一个问题是您首先读取所有数据,然后尝试读取更多将失败的数据。您可以使用fseek
和ftell
轻松获取文件大小。然后使用rewind
返回文件的开头。
当你有文件的大小时,你为它分配内存,并读入该缓冲区。并且不要在指针上使用sizeof
,它将返回指针的大小而不是它指向的大小。
阅读完文件后,您必须发送该文件。您可能需要循环发送它,直到所有数据都已发送。
答案 1 :(得分:0)
此代码调用未定义的行为:
int *len;
int bytesleft = *len;
while(total < *len) { ... }
您从未初始化len
。任何事情都可能发生。
此外,在到达文件末尾后,您无法fread()
。您希望在再次阅读之前返回到文件的开头。我建议使用rewind()