如何将文件分包,一包一包发送,每包1K???求相关实例或者代码????

鲜人掌 2014-09-28 08:37:47
如何将文件分包,一包一包发送,每包1K???求相关实例或者代码????
...全文
1077 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
躺着睡的蜗牛 2014-09-29
  • 打赏
  • 举报
回复
是1K-XMODEM? 还是......
xiaohuh421 2014-09-29
  • 打赏
  • 举报
回复
如果单线程, 就按一般的循环发送即可. 因为是顺序的, 就不用管包号, 总包数是否相同的. 循环完, 包即发送完成. 如果是多线程同时发送. 那仅考虑包号与包数, 就不能判断完成了. 因为很可能发送最终包的线程已经完成, 而发送前面包的线程还未完成, 导致数据丢失.
赵4老师 2014-09-28
  • 打赏
  • 举报
回复
参考eMule源代码。
勤奋的小游侠 2014-09-28
  • 打赏
  • 举报
回复
引用 5 楼 yangnianxiao 的回复:
[quote=引用 1 楼 xiaohuh421 的回复:] BYTE *pFileData; //文件读取后保存在这个指针指向的缓冲区内. int len = 123456; //假设文件有这么大. while(len>0) { int sendLen = 1024; //一次发1K if(len < sendLen)//文件长度不足1K { sendLen = len; } send(sock, pFileData, len,0); pFileData += sendLen; //移动起始发送位置 len -= sendLen; //减去已经发送字节. } 当然, 你也可以边读取,边发送, 过程类似. 每次读取从文件读取1k, 然后发送, 再读取, 再发送.
我需要定义包的数量,然后再发送时,当总包数与当前包数相同时,即是发送完毕[/quote] 他的代码已经足够你实现发大文件的功能了。 你对socket发送了解清楚了吗?你定义了一个包是1k,但是send()函数不一定会一次性把这1k数据发送成功。你说的一个包,可能要send多次。这样你如何判断你的一个包发送完成没有? 低下的tcp才不管你上面怎么分包,它就按字节处理。 所以你的分包需求很特殊。 如果只是发大文件,上述代码已经足够了
鲜人掌 2014-09-28
  • 打赏
  • 举报
回复
引用 1 楼 xiaohuh421 的回复:
BYTE *pFileData; //文件读取后保存在这个指针指向的缓冲区内. int len = 123456; //假设文件有这么大. while(len>0) { int sendLen = 1024; //一次发1K if(len < sendLen)//文件长度不足1K { sendLen = len; } send(sock, pFileData, len,0); pFileData += sendLen; //移动起始发送位置 len -= sendLen; //减去已经发送字节. } 当然, 你也可以边读取,边发送, 过程类似. 每次读取从文件读取1k, 然后发送, 再读取, 再发送.
我需要定义包的数量,然后再发送时,当总包数与当前包数相同时,即是发送完毕
鲜人掌 2014-09-28
  • 打赏
  • 举报
回复
引用 2 楼 lovesmiles 的回复:
你的需求为什么这么特殊?你这样分包,在tcp层未必是这样分包发送。没什么意义
这是要自己定义包的大小,因为一个文件太大了,要分包发。。那边分包接收。。
赵4老师 2014-09-28
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
勤奋的小游侠 2014-09-28
  • 打赏
  • 举报
回复
你的需求为什么这么特殊?你这样分包,在tcp层未必是这样分包发送。没什么意义
xiaohuh421 2014-09-28
  • 打赏
  • 举报
回复
BYTE *pFileData; //文件读取后保存在这个指针指向的缓冲区内. int len = 123456; //假设文件有这么大. while(len>0) { int sendLen = 1024; //一次发1K if(len < sendLen)//文件长度不足1K { sendLen = len; } send(sock, pFileData, len,0); pFileData += sendLen; //移动起始发送位置 len -= sendLen; //减去已经发送字节. } 当然, 你也可以边读取,边发送, 过程类似. 每次读取从文件读取1k, 然后发送, 再读取, 再发送.
鲜人掌 2014-09-28
  • 打赏
  • 举报
回复
引用 8 楼 xiaohuh421 的回复:
我需要定义包的数量,然后再发送时,当总包数与当前包数相同时,即是发送完毕 完全理解不了啊. 这是什么需求?? 什么场景下会用到呢? 再发送时 ....... 意思是因定的数据包, 只发送一次? 多线程同时发送这个文件??
发送一个文件比较大,需要分包处理,每个包大小定义为1K,在数据帧格式是这样的,头,数据长度,总包数,当前包号,包数据,校验位,尾,,,当当前包号与总包数相同时,发送结束,,我是这个意思??
xiaohuh421 2014-09-28
  • 打赏
  • 举报
回复
我需要定义包的数量,然后再发送时,当总包数与当前包数相同时,即是发送完毕 完全理解不了啊. 这是什么需求?? 什么场景下会用到呢? 再发送时 ....... 意思是因定的数据包, 只发送一次? 多线程同时发送这个文件??

64,667

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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