我创建了一个从客户端向服务器发送文本文件的应用程序 到目前为止,我发送它像这样的字符串:
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
但是我的教授告诉我,我必须在Binary中发送文件并准备接受任何大小的文件 我正在试图弄清楚如何以二进制形式发送文件并将其分解为块
答案 0 :(得分:1)
您可以一次复制一个字节。
理论上理论上一次读/写多个字节会使它更有效地读写磁盘。但由于二进制文件可能很短,并且磁盘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");