51Testing软件测试论坛

标题: WinSocket_C/S_tcp的数据包recv问题 [打印本页]

作者: fanlix    时间: 2005-4-11 15:02
标题: WinSocket_C/S_tcp的数据包recv问题
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种方法都没法读取少于额定长度的数据,报错中断。

大家有什么好的处理方法?
作者: sunshinelius    时间: 2005-4-12 10:28
server返回的数据包里有没有头或字段标明这个包的大小?如果有,把这个值剥离出来,用它作为length去receive它的包体就可以了。
如果没有这个字段的话,client端的socket怎会知道何时才算接收完全?靠接收0长度的数据包来判断是否完全是有风险的。尤其是处理大字节量的数据包的时候。
作者: fanlix    时间: 2005-4-18 18:10
旷工一周哈
谢谢版主了,答的都是关键的地方,都是可能解决的办法.
可惜我也都试过了,不通.
因为某些包确是有格式而无size标示,
两端通过格式来确定结尾的(或者很多包挤在一起)

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

不过这个工具确实是很好~
作者: sunshinelius    时间: 2005-4-21 16:41
我曾自写socket循环接收一个大数据包,后来报出错误。后来,我把receive的buffer长度设为指定值,就OK了
你的问题也许不是lr的问题,而是socket本身的问题。




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2