Linux C系统编程中的文件传输问题:只能传送文本文件,不能传送二进制文件。(TCP+文件I/O实现)

作者&投稿:刘力 (若有异议请与网页底部的电邮联系)
linux中利用write函数来写是否只能写文本文档,而不能写二进制文件?~

fwrite是库函数, write 是系统调用。fwrite 的缓存由系统分配, write 使用你设置的。

你应该以二进制文件读取的方式进行读取和发送,而不是文本格式。

传输的时候没问题,主要是写的时候,这有个文件编码的问题,编码统一就好了。

二进制模式传输文本文件没有问题,但是ASCII模式传输二进制文件会出问题
因为有些控制字符会被错误处理。比如二进制文件中的0,在传输的时候会被当作字符串结束符,这样是无法传送的。所以传输二进制文件的时候状况与文本文件是不一样的。

下面这段是发送文件内容及其16进制编码的。

file = fopen("w:\\temp.dat","rb");
if(file)
{
buffer[0]=0;
char temp[64];
while(1)
{
r = fread(buffer,1,16,file);
buffer[r]=0;
int index=0;
for(index=0;index<r;index++)
{
sprintf(temp,"%02x ",(unsigned char)buffer[index]);
printf(temp);
send(AcceptSocket,temp,strlen(temp),0);
}
for(index=r;index<16;index++)
{
sprintf(temp," ");
printf(temp);
send(AcceptSocket,temp,strlen(temp),0);
}
for(index=0;index<r;index++)
{
if((unsigned char)buffer[index]>=0x20)
{
sprintf(temp,"%c",(unsigned char)buffer[index]);
printf(temp);
send(AcceptSocket,temp,strlen(temp),0);
}else
{
sprintf(temp,".");
printf(temp);
send(AcceptSocket,temp,strlen(temp),0);
}
}
sprintf(temp,"\r\n");
printf(temp);
send(AcceptSocket,temp,strlen(temp),0);
//send(AcceptSocket,buffer,r,0);
if (r<16) break;
}

printf("(end)\r\n");

fclose(file);
}

应该是因为你从文件读出来的数据和发出去的数据不同,比如你用read(fd, buf, 1024); write(socketfd, buf, strlen(buf));这样可能会出错,我试过。最好是int num = read(fd, buf, 1024);write(socketfd, buf, num);就是将strlen(buf)改为read()函数的返回值!

你是用同一个程序传送文本和二进制文件的吗?
是全部按固定长度传送的吗?
传送的缓冲区多大?
你把传送的文本文件,用Araxis Merge比较,而不是diff,是否也完全一样?
如果有代码,可能更方便分析。

老夫做了这么久码农,可以负责任的告诉你,不可能fread可以,read却不可以的,绝对是你的程序流程出错了 ,先检查一下你的程序对不对吧


乡城县17872739704: Linux C系统编程中的文件传输问题:只能传送文本文件,不能传送二进制文件.(TCP+文件I/O实现) -
屈雷天蟾: 下面这段是发送文件内容及其16进制编码的.file = fopen("w:\\temp.dat","rb"); if(file) { buffer[0]=0; char temp[64]; while(1) { r = fread(buffer,1,16,file); buffer[r]=0; int index=0; for(index=0;index<r;index++) { sprintf(temp,"%02x ",(unsigned char)...

乡城县17872739704: 如何在C语言中实现文件传输?补充:Linux下C编程,通过RS232发送到PC,
屈雷天蟾: 百度文库里 搜了 一下 “C编程 RS232 linux 文件传输” 通信软件设计方法-第七讲-低层接口通信程序设计 2010-04-17 程序来练习gcc 7,练习利用socket函数来编写文件传输的程序 练习利用socket函数来编写文件传输的程序 socket 8,练习利用232硬件接口来实现文件传输的程序 练习利用232

乡城县17872739704: 在linux下如何用c语言实现在服务器接受文件的时候转发给另一个服务器 -
屈雷天蟾: 题目说得比较清楚,但问题说明确让人摸不着头脑.根据题目的意思,其实这个问题很好解决:一旦服务器接收到文件后(接收程序是自己编写的程序),则调用三方ftp的C语言库,将文件ftp到另一个服务器即可.若服务器接收文件不是通过自己写的程序,如是通过NFS写过来的,则需要专门写一个简单的同步程序,定时检查指定目录下的文件属性,一旦发现有新文件,则ftp到另一个服务器即可.

乡城县17872739704: 如何在linux下用c编程实现文件的复制 -
屈雷天蟾: 打开一个读文件和一个写文件,用一个循环,fgetc每读一个字符,就用fputc写入另一个文件,这样就实现了文件的复制,和普通的C语言标准库编程是一样的,代码如下: int c; FILE *in, *out;in = fopen("file.in", "r"); out = fopen("file.out", "w");while( ( c = fgetc(in) ) != EOF)fputc(c, out);fclose(in); fclose(out);

乡城县17872739704: linux c 编程:创建一个线程,监视某个目录,一旦目录里出现新的文件,就将文件转移到指定的目录里去. -
屈雷天蟾: /* 头文件*/#define SRCPATH "srcpath/"#define DSTPATH "dstpath/" int movefile() {DIR *dir;struct dirent *dt;FILE *fp1,*fp2; char filename1[256],filename2[256]; char buf[1024]; int readsize,writesize; if((dir = opendir(SRCPATH)) == NULL) ...

乡城县17872739704: 常用Linux文件传输命令有哪些 -
屈雷天蟾: ftp sftp rcp scp rsync tftp

乡城县17872739704: linux系统以什么形式传输文件 -
屈雷天蟾: linux的文件种类主要有下面这几种:?? 普通文件(regular file):就是一般我们存取的文件,由ls -al显示出来的属性中,第一个属性为 [-],例如 [-rwxrwxrwx].另外,依照文件的内容,又大致可以分为: ?? 纯文本文件(ascii):这是unix系...

乡城县17872739704: 在linux下如何编程通过多线程方法在一个程序中实现服务器与客户端之间的tcp通信来传输文件 -
屈雷天蟾: 一个线程做socket发送,另一个线程做socket接收

乡城县17872739704: 如何把linux目录下每天新增加的文件或目录拷贝到另一台linux服务器上. -
屈雷天蟾: 工具/原料两台装了linux系统的电脑,可在局域网中,也可在广域网中.方法/步骤linux文件传输主要有一下几种方法:1.ftp2.samba服务3.sftp4.scp由于前面3种需要进行配置,在这里小编就不说了,有兴趣的童鞋可以自己查一下相关资料,小编今天

乡城县17872739704: linux远程拷贝文件!! -
屈雷天蟾: 方法很多1.xp或者linux下装ftp server2.用samba3.linux安装openssh-server,xp下用pscp(putty的一个组件)来传4.虚拟机应该提供了共享空间其中第四个根据你的虚拟机而定,其他的第三个方法最简单 linux下: sudo apt-get install openssh-server sudo /etc/init.d/ssh start 最好将文件打包:sudo tar cf /xx.tar /home/XXX xp的cmd下 \PATHTO\pscp user@192.168.1.101:/xx.tar XXX.tar 然后解压之

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网