我在TServerSocket与TClientSocket的OnRead事件中发生的怪事!!!!
现象:
发送文件,发送端循环读取一片组装成我自己定义的数据包(有包头,长度,压缩数据 等信息)发送出去。
接收端在OnRead事件中读取。
1.读取到大于一个我自己的数据包就去拆分数据包(可能接收到多个数据包粘连在一起的情况),可能是>=1个
2.拆分出来m个数据包后循环解压数据。
3.将解压出的真实数据传入一个外部回调函数,
4.外部回调函数将数据写到文件里。
-----
问题出现:
发送端,我在循环中每个数据包里加了个序号:
接收时,将序号显示出来时,是乱序的。比如:
------------------------
序号 本次数据包个数
1 4
2 4
5 1
6 1
3 4
4 4
------------------
数据包顺序不正确了。感觉是在接收到数据后,拆分、解压、响应回调相对比较慢,在此时又响应了一次OnRead事件,而在第一次OnRead事件中,收到了多个,还没来的急全部写到文件中,第二次只收到1个数据包,就写到文件中了。导致数据顺序不对。
我读了一下delphi的源码,使用的是WSAAsyncSelect(FSocket, Wnd, Msg, Longint(Byte(FAsyncStyles)))模式,也就是从Wnd窗口消息中获得有数据到来,而消息是异步的,相当于postmessage发出来的一样。
我之前的数据没处理完成,第二次消息又来了,第二次消息中收到的数据比第一次的少,先完成,导致数据顺序不正确。
不知道我的分析对不对?目前不知道如何解决这个问题,请大家多多帮助,指点,在此非常感谢!