如下问题是在c++编的服务器端,vb编的客户端交互时发生,不知都用vb编是否有这种问题,请赐教
1.在DataArrival方法中超过4000的字节会发生丢包
解决方法:每次收4000个字节,最后如小于4000字节说明收完,把所有收到的字节和起来。2.在DataArrival方法中如下代码
Private Sub wck_DataArrival(ByVal bytesTotal As Long)
Call wck.GetData(arrData, vbArray + vbByte, bytesTotal)
If bytesTotal - 1 <> UBound(arrData) Then
Exit Sub
End If
...
bytesTotal - 1 和 UBound(arrData)会不相等(UBound(arrData)=-1),这时要跳出此方法3.在DataArrival方法中在调用winsocket之前如Call wck.GetData(arrData, vbArray + vbByte, bytesTotal),必须先做几个DoEvents,否则报连接状态不可用。4.调用了
If wck.State = sckClosed Then
wck.close
End If
后仍会有DataArrival事件触发,
解决方法:在该事件中加入(之前仍要doevents几次)
If wck.State = sckClosed Then
Exit Sub
End If虽然都找到了解决办法,但是对其中的问题还是不甚了解,希望大家能分析一下,特别是DataArrival之前的DoEvents方法,总决不大稳妥。
1.在DataArrival方法中超过4000的字节会发生丢包
解决方法:每次收4000个字节,最后如小于4000字节说明收完,把所有收到的字节和起来。2.在DataArrival方法中如下代码
Private Sub wck_DataArrival(ByVal bytesTotal As Long)
Call wck.GetData(arrData, vbArray + vbByte, bytesTotal)
If bytesTotal - 1 <> UBound(arrData) Then
Exit Sub
End If
...
bytesTotal - 1 和 UBound(arrData)会不相等(UBound(arrData)=-1),这时要跳出此方法3.在DataArrival方法中在调用winsocket之前如Call wck.GetData(arrData, vbArray + vbByte, bytesTotal),必须先做几个DoEvents,否则报连接状态不可用。4.调用了
If wck.State = sckClosed Then
wck.close
End If
后仍会有DataArrival事件触发,
解决方法:在该事件中加入(之前仍要doevents几次)
If wck.State = sckClosed Then
Exit Sub
End If虽然都找到了解决办法,但是对其中的问题还是不甚了解,希望大家能分析一下,特别是DataArrival之前的DoEvents方法,总决不大稳妥。
解决方案 »
- timer的问题
- 如何将DOS下执行命令的结果信息保存到一个文件?
- WINSOCK可以设置代理吗?
- ado+datagrid数据更新的问题
- 用VB 写三角函数变换的函数
- 唉,快疯掉了,同一问题问了N次还没解决,头痛,可以帮帮我吗?
- 请问如何在VB下新建word文档,盼复,在线等待。谢谢!!
- *********************请各位大侠,帮忙给我的一段小程序找个小错.快来抢分噢!!!****************************谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!谢谢!
- 把datagrid 中选中记录的位置显示在label上,,
- 如何获取带java程序的网站上的内容
- 输入页面有一个checkbox数组,在保存一条记录后,不退出页面,重新添加一条记录时,如何清空上一条checkbox的选项值。
- 过程调用
其实你直接Winsock.GetData(Data)即可如果发送包过大
会有连续几次DataArrival事件连续触发
建议你在发送时给数据加结尾标记
接收时再判断是否完整,不完整,继续接收,直到接到结尾标记
你用api问题更多
你确定吗?
这个问题我还没遇到过
你vb6打了sp6补丁没有?
就是在Private Sub wck_DataArrival(ByVal bytesTotal As Long)
这个事件中必须doevents几次,否则会报连接不可用.其他的就是丢包问题,如getdata收到的字符串长度和bytesTotal 不相同,遇到的情况是等于-1.但在后几次还是能收到完整的包,所以加个结束字符串就行了.
还有虽然服务器端一次发给客户端4000字节但是客户端收的时候在dataarrival事件中不一定每次收到4000,但总的是对的.这些可能是我没经验,网络本来就有这些问题,但是第一个问题实在是搞不定,虽然设了5次doevents后还没遇到过错误,但是不设doevents错误几率颇高.
Call wck.GetData(arrData, vbArray + vbByte, bytesTotal)改成
Call wck.GetData(arrData, vbArray + vbByte, 4000)
或
Call wck.GetData(arrData, vbArray + vbByte)还有,你的主要问题是接收同步问题。刚刚接收到一个新字节,DataArrival 就会触发。
比较好的方法是,数据打包,在包头中说明长度。
数据到达后,用 BytesReceived 循环检查是否有足够的字节包含包头。然后接收包头,再根据数据长度接收数据等。