51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 4074|回复: 3
打印 上一主题 下一主题

WinSocket_C/S_tcp的数据包recv问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2005-4-11 15:02:02 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
LR编写winsocket脚本时,遇到一个郁闷的问题

lrs_receive()默认 EndMarker_None .也就是一直接收到server端数据包发空了为止.
但是实际使用时,这个函数就是祸端,99% 会被
Action.c(16): lrs_receive(socket5, buf4)
Action.c(16): Error : socket1 - Connection reset by peer. Error code : 10054.
接收超时,偶尔不出错,接到的数据包size=0
(估计为内部Mismatch操作的问题)

不得已改用lrs_receive_ex() 或者lrs_length_receive(),自己加c语言处理判断结尾来接收. 可以用了,但是缺点不少.

我的目的: server端的信息必须接收(不然模拟通信少了一半,server的负载就少了),但是数据我不要,一个字节都不要.

不知道大家有什么处理的方法不.
这个问题只要大家用LRS肯定会遇到的,比如send一个文件请求,server发回一个几百K甚至几百M的文件回来.

本来很简单的,可以:
do{
lrs_receive_ex(sock,buf, "len = 1000", LrsLastArg);
}
while((lr_get_lastreceive_size(sock) >= 1000)

可是lrs_receive_ex()和 lrs_length_receive()
或者设置lrs_set_receive_option()后用lrs_receive()

这3种方法都没法读取少于额定长度的数据,报错中断。

大家有什么好的处理方法?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏

该用户从未签到

4#
发表于 2005-4-21 16:41:56 | 只看该作者
我曾自写socket循环接收一个大数据包,后来报出错误。后来,我把receive的buffer长度设为指定值,就OK了
你的问题也许不是lr的问题,而是socket本身的问题。
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2005-4-18 18:10:19 | 只看该作者
旷工一周哈
谢谢版主了,答的都是关键的地方,都是可能解决的办法.
可惜我也都试过了,不通.
因为某些包确是有格式而无size标示,
两端通过格式来确定结尾的(或者很多包挤在一起)

我开始对LR的怀疑了
1, lrs_receive() 接收不到数据,如上所示
2,对函数的支持不好, 我还没有调用复杂的函数呢,只是把常用的几个send 和 recv放到一个函数里来调用就出问题.

不过这个工具确实是很好~
回复 支持 反对

使用道具 举报

该用户从未签到

2#
发表于 2005-4-12 10:28:58 | 只看该作者
server返回的数据包里有没有头或字段标明这个包的大小?如果有,把这个值剥离出来,用它作为length去receive它的包体就可以了。
如果没有这个字段的话,client端的socket怎会知道何时才算接收完全?靠接收0长度的数据包来判断是否完全是有风险的。尤其是处理大字节量的数据包的时候。
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-27 05:45 , Processed in 0.066416 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表