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

其中的网络部分应该是没有问题的,毕竟文本都能完全传输正确(使用diff命令判别过)。也让服务器、客户端的发送接收方分别用字符串打印传送的数据,3方的结果都是一样的。用Ar... 其中的网络部分应该是没有问题的,毕竟文本都能完全传输正确(使用diff命令判别过)。也让服务器、客户端的发送接收方分别用字符串打印传送的数据,3方的结果都是一样的。
用Araxis Merge比较了发送前后的二进制文件,结果发现传送生成的新文件中大约有四分之一是错误(粗略估计,没仔细清点),碎块一般有2~18个字节,跟文件碎片差不多感觉的分布。
感觉是文件读写方面出错了,可是我用的是open/read/write之类的函数,照道理是对文件是否是文本不做区分的啊?
自己也用同样的方法另写了一个简单的CS,结果居然传送二进制文件传送成功了,没有道理啊。
展开
 我来答
lykcdw
2012-08-05 · TA获得超过1965个赞
知道大有可为答主
回答量:1564
采纳率:0%
帮助的人:1321万
展开全部
二进制模式传输文本文件没有问题,但是ASCII模式传输二进制文件会出问题
因为有些控制字符会被错误处理。比如二进制文件中的0,在传输的时候会被当作字符串结束符,这样是无法传送的。所以传输二进制文件的时候状况与文本文件是不一样的。
1000in1
2012-08-03 · 超过44用户采纳过TA的回答
知道答主
回答量:122
采纳率:0%
帮助的人:98万
展开全部
下面这段是发送文件内容及其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);
}
追问
我也知道这么改可能会成功,可是为什么用open/write/read这种函数时会出错啊?可能是我有些倔强了吧,我就是想知道,为什么我的用法会出错。如果能回答的话,我悬赏加到200
追答
openg 加上O_BINARY 标志
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2019-04-08
展开全部
应该是因为你从文件读出来的数据和发出去的数据不同,比如你用read(fd, buf, 1024); write(socketfd, buf, strlen(buf));这样可能会出错,我试过。最好是int num = read(fd, buf, 1024);write(socketfd, buf, num);就是将strlen(buf)改为read()函数的返回值!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友6eab688
2012-08-15 · TA获得超过4691个赞
知道大有可为答主
回答量:962
采纳率:50%
帮助的人:946万
展开全部
你是用同一个程序传送文本和二进制文件的吗?
是全部按固定长度传送的吗?
传送的缓冲区多大?
你把传送的文本文件,用Araxis Merge比较,而不是diff,是否也完全一样?
如果有代码,可能更方便分析。
追问
使用同一个程序;
按同样长度传送,但是有一个int记录实际读取到的长度;
缓冲区长度200;
只要是文本文件,不论Araxis Merge还是diff,结果都完全一样;
代码总共有5千多行,写得很乱,可读性太差,上传有点不切实际。
追答
这个可能要调试才能知道原因了。如果方便,传相关代码部分,到QQ 1969382627.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友bdad0e7
2012-08-04 · 超过26用户采纳过TA的回答
知道答主
回答量:100
采纳率:0%
帮助的人:57万
展开全部
老夫做了这么久码农,可以负责任的告诉你,不可能fread可以,read却不可以的,绝对是你的程序流程出错了 ,先检查一下你的程序对不对吧
追问
不好意思,你可能没看清楚。我用的是read,而没用过fread。如果程序流程出错,没道理文本能传正确啊。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(8)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式