首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

winsock DoEvents 有关问题求解

2012-03-18 
winsockDoEvents 问题求解我的服务器端用winsock的控件数组同时和N个客户端连接,服务器端会根据不同的需求

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才能完整接收一个协议指定的数据。
客户端用缓存

热点排行