我在做一个TCP/IP通信程序,在发出一个请求包后,希望收到一个应答包,或者什么也没有,等待一段时间后自动返回。
但是在试验时发现,如果连续发送两个请求包,可能两个应答包并在一起返回了(单包数据量比较小,不超过50字节)。
我想,windows是事件驱动的,操作系统在接收缓冲区准备好以后,再发个事件消息通知程序的。因此我想如果发现同时收到两个以上的数据包,取得第一个包后就模仿操作系统发一个消息给程序自身让它去处理,然后再取下一个包,再发消息,就像两个包是单独到达的一样。
现在的问题是,不知道操作系统发的这个消息是什么。用Spy++看过,还是不知道。哪位知道的请告诉我,或者如果有更好的方法,也请告知,253了

解决方案 »

  1.   

    应答包应该有开始标志、结束标志吧,判断一下结尾标志就行了,发送消息用postmessage就可以,其实你要的功能IndyServer组件都有实现。
      

  2.   

    应答包应该有开始标志、结束标志吧,判断一下结尾标志就行了,发送消息用postmessage就可以,其实你要的功能IndyServer组件都有实现。
      

  3.   

    定义一个数据格式,其中可以变长,以一个byte代表变长的长度
    还有包头和结束符号一定要有
    这样便于判断
      

  4.   

    TClientSocket/TServerSocket的OnRecieve就是消息驱动的
      

  5.   

    收到一个包就触发OnRecieve事件
      

  6.   

    谢谢参与。我用的就是 TServerSocket的OnRecieve。包头和包尾都有,而且也可以正确切分出一个完整的包。但是两个完整的包并在一起发过来,只触发一个OnRecieve,其中的一个就悄悄地扔掉了。如果用 postmessage,那么应该 post哪种消息呢?
    Indy还没用过,公司的工具太旧了,是在一个用 Delphi 5写的程序上再做修改,Indy得用 D7吧?
      

  7.   

    Indy有Delphi5版本
    http://www.indyproject.org/download/Files/Indy9.html
      

  8.   

    已经下载,正在试。不过可能这个是不可能解决的,主要在客户端。如果它收到第一个的时候就是不回,要到收到第二个的时候才一起回的话,服务端是没办法的。即使拆成两个,因为第一个的等待时间已过,已经不管它了,拆出来了也没用。
    就是客户端是一个嵌入式的TCP/IP模块,提供的几个库函数有限,没法对socket做更多控制