请教recv为何收到异常数据

heikefangxian9 2010-04-22 09:52:04
问题描述:
在client端不断readfile一个txt文件,每次读512字节,并将读到的数据发送给server;

在server端recv(clientsocket, buf, buflen,0);
出现的问题是:在client端发送的文件大小大于512字节时,也就是发送的次数大于1时,server端接收到的第一个buf完全是乱码。但recv的第二个包是正确的。

请教这是不是由于recv本身的机理造成的??
...全文
338 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
heikefangxian9 2010-05-02
  • 打赏
  • 举报
回复
谢谢各位,结贴给分
Un1 2010-04-26
  • 打赏
  • 举报
回复
tcp是保证顺序的,问题可能在发送时,贴代码上来看
尹成 2010-04-25
  • 打赏
  • 举报
回复
recv(clientsocket, buf, buflen,0);接收数据采用循环接收,接收数据判断一下recv的返回值,不一定和你指定的buflen长度一样的。
heikefangxian9 2010-04-23
  • 打赏
  • 举报
回复
自己再顶一下
激情的头发 2010-04-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 heikefangxian9 的回复:]
请教这是不是由于recv本身的机理造成的??
[/Quote]

你可以使用recv的标识参数flag,并设为MSG_WAITALL。
用法为:
recv( fd, buffer, bytes, MSG_WAITALL );
这样的话,recv函数在接收到bytes字节的数据前不会返回;而如果flag使用0的话,也就是recv采用默认的措施,当套接口有数据到达,将读取至多读取bytes个字节的数据。

如果网络质量不是太好的话,send函数发送的数据不能保证一次性到达,可能一开始只有几个字节,其他的数据到达得较晚。这样的话,使用recv( fd, buffer, bytes, 0 )就会读取一开始到达的那几个字节,然后返回。而如果buffer在使用之前又没有被清空的话,那么就会出现LZ的乱码问题。
heikefangxian9 2010-04-22
  • 打赏
  • 举报
回复
楼上的,recv采用循环接收是什么意思啊,能解释一下吗?
我有点笨,没听明白
Eleven 2010-04-22
  • 打赏
  • 举报
回复
recv(clientsocket, buf, buflen,0);接收数据采用循环接收,接收数据判断一下recv的返回值,不一定和你指定的buflen长度一样的。
soswaidao 2010-04-22
  • 打赏
  • 举报
回复
友情帮顶,友情帮顶
soswaidao 2010-04-22
  • 打赏
  • 举报
回复
友情帮顶,友情帮顶
heikefangxian9 2010-04-22
  • 打赏
  • 举报
回复
我自己顶。。。。。。。。。。。。

18,356

社区成员

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

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