socket编程进行文件传输

sigesan 2016-04-29 04:29:03
txt格式的文本文档能传输成功,但是问题出在别的格式的文件上
目前只拿了可执行文件exe和word文档的doc格式文件测试,都不能完整发送。
就拿word文档来说,我在doc文档(A.docx,大小有10KB)中写入了5个数字。文件传输之后,得到的文件(B.docx)只有5个字节。而且内容乱码。我把文档A的后缀改成了.txt 发现B中的内容正是A.txt的最前面的几个字符。我把A.txt中的内容全选复制到了另一个新建C.txt中。这个C.txt的大小要比A.txt要小些,传输C,全部收到了。(好吧 说这些只是让我自己更清晰)

CFile rFile;
rFile.Open(m_PathName, CFile::modeRead | CFile::typeBinary);
dw = rFile.GetLength();
pBuf = new char[dw + 1];
pBuf[dw] = 0;
rFile.Read(pBuf, dw);
//读取选中文件的数据,存放到了pBuf;
fileInfo.FileName = m_FileName;
fileInfo.Size = dw ;
rFile.Close();

以上是我打开文件流的代码,单步执行传输文件A,发现pBuf中也只得到了部分数据。
感觉应该不是传输出了问题 大致是编码问题吧? 求问怎么解决? 传输EXE也是这样子 不知道怎么下手。
...全文
386 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-05-03
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
sigesan 2016-05-03
  • 打赏
  • 举报
回复

Read的返回值也和文件大小相符 为什么读取的数据就这么少呢
sigesan 2016-05-03
  • 打赏
  • 举报
回复
引用 11 楼 kxltsuperr 的回复:
你是用tcp发的吗,tcp是没有边界的,所有你发之前要先记录下要发多少,这样收的时候才有数。 或者你直接写个应用层协议也行。
是用TCP发的 协议不会写啊 我才刚接触网络编程 至于问题 我觉得应该是打开文件流的问题 毕竟调试到这一步就可以看出来 读取的内容太少
小小爬虾 2016-05-01
  • 打赏
  • 举报
回复
你是用tcp发的吗,tcp是没有边界的,所有你发之前要先记录下要发多少,这样收的时候才有数。 或者你直接写个应用层协议也行。
encoderlee 2016-04-30
  • 打赏
  • 举报
回复
在调试窗口里当然只能只看这点数据,因为遇到'\0'就截断了,实际读出多少要以Read返回值为准
sigesan 2016-04-29
  • 打赏
  • 举报
回复

还是不行 pBuf里只能读取到这点数据
sigesan 2016-04-29
  • 打赏
  • 举报
回复
引用 7 楼 ks15629128271 的回复:
[quote=引用 5 楼 piaobotudou 的回复:] [quote=引用 3 楼 ks15629128271 的回复:] 确实是因为没有读取到所有数据 但是这样真的有用么?之前 我把改了后缀的A(从A.docx改成了A.txt)中乱码的数据复制到另一个新建文本文档.txt再传输 却能够完整传输 也没用循环读取啊
Read函数不保证一次能完全读取内容,你复制数据后,文件很小,原来的有10k,小的一次读取完的可能性大。 并且读取的文件长度不够,很容易根据返回值判断出来。并且如果Read返回值为0的时候还可以用GetLastError()判断错误原因,肯定会有帮助,这样试一下只有好处没有坏处。[/quote] 在
int curread = rFile.Read(&pBuf[readed], dw);
这一句就中断了 怎么使用GetLastError()啊 在这句之前用还没出错,到这一句就直接中断了 弹出对话框 :访问文件发生未知错误。[/quote] 好吧 这里是我自己的错误 忘记给pBuf分配内存了...
sigesan 2016-04-29
  • 打赏
  • 举报
回复
引用 5 楼 piaobotudou 的回复:
[quote=引用 3 楼 ks15629128271 的回复:] 确实是因为没有读取到所有数据 但是这样真的有用么?之前 我把改了后缀的A(从A.docx改成了A.txt)中乱码的数据复制到另一个新建文本文档.txt再传输 却能够完整传输 也没用循环读取啊
Read函数不保证一次能完全读取内容,你复制数据后,文件很小,原来的有10k,小的一次读取完的可能性大。 并且读取的文件长度不够,很容易根据返回值判断出来。并且如果Read返回值为0的时候还可以用GetLastError()判断错误原因,肯定会有帮助,这样试一下只有好处没有坏处。[/quote] 在
int curread = rFile.Read(&pBuf[readed], dw);
这一句就中断了 怎么使用GetLastError()啊 在这句之前用还没出错,到这一句就直接中断了 弹出对话框 :访问文件发生未知错误。
yli5891 2016-04-29
  • 打赏
  • 举报
回复
pBuf = new char[dw + 1];更改为pBuf = new Byte[dw+1]
微型蚂蚁 2016-04-29
  • 打赏
  • 举报
回复
引用 3 楼 ks15629128271 的回复:
确实是因为没有读取到所有数据 但是这样真的有用么?之前 我把改了后缀的A(从A.docx改成了A.txt)中乱码的数据复制到另一个新建文本文档.txt再传输 却能够完整传输 也没用循环读取啊
Read函数不保证一次能完全读取内容,你复制数据后,文件很小,原来的有10k,小的一次读取完的可能性大。 并且读取的文件长度不够,很容易根据返回值判断出来。并且如果Read返回值为0的时候还可以用GetLastError()判断错误原因,肯定会有帮助,这样试一下只有好处没有坏处。
sigesan 2016-04-29
  • 打赏
  • 举报
回复
引用 2 楼 oyljerry 的回复:
你每次发送的时候,都要设置好正确发送的数据大小等,然后要循环发送。
循环发送? 是对send这句循环么 我发送的只是小文件,同样大小的文本文档都能完整发送的 还有设置发送数据的大小怎么设置
sigesan 2016-04-29
  • 打赏
  • 举报
回复
确实是发送时没有读取到
引用 1 楼 piaobotudou 的回复:
确保把所有数据都读出来再发送

int readed = 0;
int curread = rFile.Read(&pBuf[readed], dw);
while(curread)
{
    readed += curread;
    dw-=curread;
    curread = rFile.Read(&pBuf[readed], dw);
}
确实是因为没有读取到所有数据 但是这样真的有用么?之前 我把改了后缀的A(从A.docx改成了A.txt)中乱码的数据复制到另一个新建文本文档.txt再传输 却能够完整传输 也没用循环读取啊
oyljerry 2016-04-29
  • 打赏
  • 举报
回复
你每次发送的时候,都要设置好正确发送的数据大小等,然后要循环发送。
微型蚂蚁 2016-04-29
  • 打赏
  • 举报
回复
确保把所有数据都读出来再发送

int readed = 0;
int curread = rFile.Read(&pBuf[readed], dw);
while(curread)
{
    readed += curread;
    dw-=curread;
    curread = rFile.Read(&pBuf[readed], dw);
}

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧