繁体   English   中英

使用Winsock将文件分解成块,然后以二进制形式从客户端发送到C中的服务器吗?

[英]Break a file into chunks and send it as binary from client to server in C using 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

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

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

理论上说 ,一次读取/写入一个字节以上将使它对磁盘的读取和写入效率更高。 但是由于二进制文件可能很短,并且磁盘I / O已经在内部进行了缓冲,因此可能不会产生明显的变化。

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

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

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

如果您想一次传输更多数据,则可以。 但是1字节xfers简单安全,并且可以正常工作。

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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM