2015-04-01 126 views
1

我创建了从客户端发送一个文本文件到服务器 的应用到目前为止,我是把它作为字符串是这样的:使用winsock将文件分解为块并将其作为二进制从客户端发送到服务器?

fp = fopen(filename, "r"); 
    if (fp != NULL) { 
     newLen = fread(source, sizeof(char), 5000, fp); 
      if (newLen == 0) { 
       fputs("Error reading file", stderr); 
      } else { 
    source[++newLen] = '\0'; /* Just to be safe. */ 
      } 
    }else{ 
     printf("The file %s does not exist :("); 
     return 1; 
    } 


    fclose(fp); 

    send(s , source , strlen(source) , 0); //send file 

但是我的教授告诉我,我必须将文件中的二进制和准备接受任何大小的文件 我想弄清楚如何以二进制文件发送文件并将其分割成大块

+0

问题是? – alk 2015-04-01 15:53:56

+0

如果'source'是5000'char' long,那么这个'source [newLen] ='\ 0''写入数组的末尾。 – alk 2015-04-01 15:54:49

+1

你应该阅读man strlen()。这很糟糕也不需要,因为您已经知道有多少有效字节已被读入缓冲区。 – 2015-04-01 17:22:10

回答

1

您可以一次复制一个字节。

一次读取/写入多于一个字节理论上会使它更高效地读写磁盘。但是由于二进制文件可能很短,而且磁盘I/O已经在内部进行了缓冲,所以它可能没有明显的区别。

perror()是一个方便的函数,它显示与从最近的UNIX系统调用返回的错误代码相关的文本。引号中的文本是在向您显示与代码关联的系统消息之前显示的标题。

exit(EXIT_FAILURE)以-1值退出,这是脚本可以测试以查看程序是成功还是失败,因为可以为UNIX程序检索退出状态。

size_t是一个整数类型,但它被命名为size_t来提示您使用的是什么。

如果您想一次传输更多数据,您可以。但1字节的xfer很简单,安全,并且工作。

FILE *exein, *exeout; 

exein = fopen("filein.exe", "rb"); 
if (exein == NULL) { 
    /* handle error */ 
    perror("file open for reading"); 
    exit(EXIT_FAILURE); 
} 
exeout = fopen("fileout.exe", "wb"); 
if (exeout == NULL) { 
    /* handle error */ 
    perror("file open for writing"); 
    exit(EXIT_FAILURE); 
} 
size_t n, m; 
unsigned char buff[8192]; 
do { 
    n = fread(buff, 1, sizeof buff, exein); 
    if (n) 
     m = fwrite(buff, 1, n, exeout); 
    else 
     m = 0; 
} while ((n > 0) && (n == m)); 
if (m) 
    perror("copy"); 
+0

你能解释一下吗? – user25633 2015-04-01 15:48:28

+0

这与您已经拥有和了解的内容非常相似。你想要澄清什么部分?我更新了顶部的文本以解释为什么我使用1字节的xfer。通过1个字节读取 – clearlight 2015-04-01 15:49:31

+2

使得巨大的差异。问题不在于缓存,而在于从进程到系统的上下文切换以及每个字节的切换。 – 2015-04-01 15:53:50

相关问题