通过套接字发送二进制文件

时间:2014-02-01 17:58:39

标签: c sockets

我一直试图通过套接字发送(使用发送或写入功能)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

2 个答案:

答案 0 :(得分:1)

您的代码存在多个问题。首先,您需要在之前检查文件指针fin ,然后尝试对其执行任何操作。它也不会自动设置为NULL,因此如果文件正确打开,条件fin != NULL将始终在循环中为真。

另一个问题是您首先读取所有数据,然后尝试读取更多将失败的数据。您可以使用fseekftell轻松获取文件大小。然后使用rewind返回文件的开头。

当你有文件的大小时,你为它分配内存,并读入该缓冲区。并且不要在指针上使用sizeof,它将返回指针的大小而不是它指向的大小。

阅读完文件后,您必须发送该文件。您可能需要循环发送它,直到所有数据都已发送。

答案 1 :(得分:0)

此代码调用未定义的行为:

  int *len;
  int bytesleft = *len;

   while(total < *len) { ... }

您从未初始化len。任何事情都可能发生。

此外,在到达文件末尾后,您无法fread()。您希望在再次阅读之前返回到文件的开头。我建议使用rewind()