winsock DoEvents 问题求解
我的服务器端用winsock的控件数组同时和N个客户端连接,服务器端会根据不同的需求发送不同的数据给客户端处理,但由于有时需要发送大于8K的数据,这是我就只能分包发送,我把byte数组的数据分成6K左右用循环发送,而且为了能让客户端知道发来数据是属于哪种类型的,所以我在每个数据前都会加几个特定的字符串进去,现在的问题是由于服务器端发送分包数据时很快,客户端处理数据的速度赶不上服务器端发送的速度,所以会导致客户端接收到的数据总是有误,俺在网上搜了一通有人说用DoEvents可以释放控制权,我在服务器端的Winsock1.SendData的前后都加了DoEvents都没用,如果我用调试模式一次一次慢慢的执行服务器端的发送部分的代码,这时客户端就可以正常接收,但如果编译好以后任其自己发送就会出问题,请问各位高手这个问题该如何解决?代码如下:
服务器端
- VB code
For i = 1 To DataSendCount arrHead = (i - 1) * 6000 arrTail = IIf(i <> DataSendCount, i * 6000 - 1, DataSendLength - 1) arrLen = arrTail - arrHead + 1 ReDim arrByteMiddle(arrLen - 1) RtlMoveMemory ByVal VarPtr(arrByteMiddle(0)), ByVal VarPtr(arrHistory(arrHead)), arrLen 'str = arrByte 'str = RegSetData(SER_SEND_HISTORY, str) 'Debug.Print str '将数组头、中间、尾部相结合 ReDim Preserve arrByte(UBound(arrByteMiddle, 1) + 34) arrByteHead = "<T>" & SER_SEND_HISTORY & "</T><D>" arrByteTail = "</D>" arrLen = UBound(arrByteHead, 1) + 1 RtlMoveMemory ByVal VarPtr(arrByte(0)), ByVal VarPtr(arrByteHead(0)), arrLen '头 arrLen = UBound(arrByteMiddle, 1) + 1 ub = arrLen RtlMoveMemory ByVal VarPtr(arrByte(26)), ByVal VarPtr(arrByteMiddle(0)), arrLen '中间 arrLen = UBound(arrByteTail, 1) + 1 RtlMoveMemory ByVal VarPtr(arrByte(26 + ub)), ByVal VarPtr(arrByteTail(0)), arrLen '尾 str = arrByte 'Debug.Print str DoEvents frmMain.Sock(Index).SendData arrByte DoEvents Next i
客户端代码就不贴了把,反正就是那个Winsock1_DataArrival事件和几个select而已了。
谢谢各位高手,小弟不胜感激
[解决办法]
问题就在客户端,你应该把所有数据接收完毕后再进行处理。
[解决办法]
整个通讯流程应该有一个协议来处理.
从协议上保证没有丢包的可能.
另外,所谓的分包啥的都不是这一层的问题,这一层只需要扔数据过去就行了.
参考:
http://www.m5home.com/blog/article.asp?id=169
[解决办法]
这个doevents只是针对服务器端机器本身释放控制权,跟你发送的速度基本没什么联系,当然没有用.
正如3F所说,最好自定义一个协议,客户端收到消息返回一个信息给服务端,服务端根据收到的信息继续处理(是结束发送还是继续)
[解决办法]
客户端有可能要分多次dataArrival才能完整接收一个协议指定的数据。
客户端用缓存