WinSock文件发送和接收的问题

soarsoar77 2010-07-09 10:37:03
我用WinSock发送文件,在同一个函数中,先发送了文件的名称

sockServer.SendData FileName
FileName=20100709103036.bmp

再打开该文件,并循环发送
sockServer.SendData myFile

myFile是个Bmp图片

问题就是我接收端收到的却是
20100709103036.bmpBM*! 6 ( K % ? 亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻 亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻 亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻 亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻 亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻熵殪亻
熵殪亻熵殪亻熵

也就是说收到的是FileName+myFile的内容,而不是分别收到,这是怎么回事?
我设置断点也说明这个问题,在sockServer.SendData FileName运行后,我不运行下面的程序,在接收端没有收到任何内容,一直要运行了sockServer.SendData myFile 后,接收端才收到这2个包叠加的数据

这是怎么回事啊?
...全文
212 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
soarsoar77 2010-08-23
  • 打赏
  • 举报
回复
需要的就是这样的,谢谢了
嗷嗷叫的老马 2010-08-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 katar1024 的回复:]
本人经过不少时间总结的,Winsock传输二进制的数据永远不能按包读取,而是按流来分离。你必须设置一个缓冲区,发现数据接收完成标志后,就立刻组装并清空相应的缓冲数据

就应该按照一个长长的数据流来,如何找到一包数据的起点和终点是最重要的课题
建议你去学习HTTP协议,我试过,这种方法很成功,我都能用winsock写出http服务器
[/Quote]
顶.

简单来说就是要有一个协议,而不是靠着这种直接收发来保证数据的正确性.

参考:

尝试做了一个利用WINSOCK控件的自动分包发送机制的东东(VB6.0)

我这个代码里只是做实验,并未完善,比如网络断开后的续传之类还没有处理,但原理是能说清楚了.
C++实习生 2010-08-20
  • 打赏
  • 举报
回复
真是好贴啊。我就是看不懂,但是 我知道这是一个好贴,所以我顶一下。
不要让这个贴从墙上掉下来了。
soarsoar77 2010-08-15
  • 打赏
  • 举报
回复
我需要实际的代码,有简单明了的请贴一下,谢谢
katar1024 2010-08-13
  • 打赏
  • 举报
回复
本人经过不少时间总结的,Winsock传输二进制的数据永远不能按包读取,而是按流来分离。你必须设置一个缓冲区,发现数据接收完成标志后,就立刻组装并清空相应的缓冲数据

就应该按照一个长长的数据流来,如何找到一包数据的起点和终点是最重要的课题
建议你去学习HTTP协议,我试过,这种方法很成功,我都能用winsock写出http服务器
soarsoar77 2010-08-09
  • 打赏
  • 举报
回复
我需要实际的例子,谁提供下,谢谢
yimins 2010-07-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 soarsoar77 的回复:]
应该怎么避免这个陷阱呢?我该如何做?
[/Quote]

可以这样:
send(2,人多)send(2,病少)send(2,财富)

recv(2,人多2,病)recv(少2,财富)

然后自己将其组合起来,变成“2,人多2,病少2,财富”,之后再分割。
soarsoar77 2010-07-20
  • 打赏
  • 举报
回复
应该怎么避免这个陷阱呢?我该如何做?
hjker007 2010-07-20
  • 打赏
  • 举报
回复
我也遇到多这个问题,自己弄了半天老出错,后来搜了一个例子,就是winsock发送文件的,如果需要传给你:qq63512184,自己改改就能用。比较好理解。
赵4老师 2010-07-20
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
soarsoar77 2010-07-09
  • 打赏
  • 举报
回复
好像你这个解释还有一点不对

我在循环发送sockServer.SendData myFile
时候,myFile的定义是myFile(1024) as byte

也就是第一次发送时,最多就是1024+len(FileName)的长度

怎么接收端就收到了呢?

照你的说法,应该是循环7次发送后客户端才收到
yimins 2010-07-09
  • 打赏
  • 举报
回复
你也可以规定一个协议,比如先发送文件名长度,然后发送文件名。之后再发送文件内容。这样接收方就能轻松区分开文件名和数据了。

比如像下面这样:

sockServer.SendData len(FileName)
sockServer.SendData FileName
sockServer.SendData myFile

接收方首先检查一下文件名有多长,之后按照长度截取出文件名,后面的就是文件内容了。
soarsoar77 2010-07-09
  • 打赏
  • 举报
回复
原来是这样,也就是说,我如果想分2次发送,文件名称就要定义8K字节,这样就可以发送一次

我去试下
yimins 2010-07-09
  • 打赏
  • 举报
回复
sockServer.SendData 方法只是将数据放在发送缓冲区里面,当缓冲区满了之后系统才会自动将数据发送出网络。默认的缓冲区大小为8K
yimins 2010-07-09
  • 打赏
  • 举报
回复
恩,修正一下我的解释。应该这样说:

sockServer.SendData 方法只是将数据放在发送缓冲区里面,缓冲区满之前,由系统决定什么时候将数据发送出网络,如果缓冲区满了之后,系统还没有将数据发送出网络,SendData会出错。默认的缓冲区大小为8K
soarsoar77 2010-07-09
  • 打赏
  • 举报
回复
谁熟悉WinSock啊,解答下,谢谢

1,502

社区成员

发帖
与我相关
我的任务
社区描述
VB 网络编程
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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