c - 使用winsock将文件分成 block 并将其作为二进制文件从客户端发送到C中的服务器?

标签 c sockets 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

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

最佳答案

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

一次读取/写入多于一个字节理论上会使其更有效地读取和写入磁盘。但是由于二进制文件可能很短,并且磁盘 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");

关于c - 使用winsock将文件分成 block 并将其作为二进制文件从客户端发送到C中的服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29395081/

相关文章:

C - 结构体定义

c - 在绘制文本之前刷新窗口中的区域

java - 将 Java 套接字文件描述符传递给 C 二进制文件的最有效方法

java - 使用 javanio 从阻塞 I/O 转变为非阻塞 I/O

ios - dispatch_io_read 如果接收数据大小小于长度,套接字将等待更多数据

c - OpenGL 中矩阵堆栈的意义何在?

Python TCP 'Send'套接字缓冲区大小

c++ - 为什么要使用非阻塞或阻塞套接字?

c - 使用socket如何获取上传进度?

c - Accept call 不会阻塞第二次(或不止一次)?