gil's pkm2

数据包recv问题

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种方法都没法读取少于额定长度的数据,报错中断。

大家有什么好的处理方法? 

server返回的数据包里有没有头或字段标明这个包的大小?如果有,把这个值剥离出来,用它作为length去receive它的包体就可以了。
如果没有这个字段的话,client端的socket怎会知道何时才算接收完全?靠接收0长度的数据包来判断是否完全是有风险的。尤其是处理大字节量的数据包的时候。

 

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

不过这个工具确实是很好~ 

 

我曾自写socket循环接收一个大数据包,后来报出错误。后来,我把receive的buffer长度设为指定值,就OK了
你的问题也许不是lr的问题,而是socket本身的问题。

posted on 2009-07-29 21:44  gil's pkm2  阅读(644)  评论(0)    收藏  举报

导航