数据包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) 收藏 举报
浙公网安备 33010602011771号