我在实际运用IOCP中发现一个这样的问题:client和server 当client 接收SERVER的WSASEND的(我用的512byte)数据时,当SERVER发送数据频率在150MS以上接收正常,但在150MS以下时,CLIENT 接收时间间隔发生了变化,接收到数据包(512BYTE)时间不固定,也就是说当SERVER发送数据包的频率为150MS 时CLIENT接收到包的时间有长有短,可能是200多MS才接收到第一个包,下一个包接收时间为2MS.当时觉得应该是粘包现象.做了以下设置:BOOL nodelay = 1;setsockopt (p->sock , IPPROTO_TCP , TCP_NODELAY , (char *)&nodelay , sizeof(nodelay));int sndBuf = 0;setsockopt (p->sock , SOL_SOCKET , SO_SNDBUF , (char *)&sndBuf , sizeof(sndBuf)); 同样存在这个现象;但是以下实验就令人不解了:在CLIENT 投递WSARECV时,同时client 以频率小于150MS向SERVER连续发送数据,这时client 接收数据正常了,也就是SERVER 投递WSARECV间隔150MS发送那么CLIENT也是间隔150MS能接收到,这是怎么回事呢?请高手指点;

解决方案 »

  1.   

    to supercow 按你的说法如果SERVER 每隔150MS发送一个数据包(投递一个WSASEND), 人为无法控制CLIENT 的接收时间(投递WSARECV),可以同时投递2个WSARECV是不是能够准时接受到SERVER的包
      

  2.   

    你客户端不可能用完成端口吧?
    客户端用一个普通的阻塞recv(...)就足够了,没必要搞那么复杂。
      

  3.   

    to  djfu 客户端和服务端都有频繁数据收发,为什么不用IOCP 呢
      

  4.   

    不要什么都用IOCP,IOCP用在服务器端才是真正的派上用场。
    用在客户端,可能会把本来简单的问题搞复杂。即使再频繁的数据收发,
    对于客户端来说,
    它面向的只是一个服务器来进行收发。而服务器端则不同,
    它面向成千上万的客户端连接,
    所以需要高性能的IOCP。对于客户端来说,用IOCP有如“杀鸡用牛刀”。
      

  5.   

     to djfu  服务器和客户端是相对的而言的.问题我已经解决了,其中根本原因与IOCP无关,是TCP传输控制协议中的停止等待协议所导致:SERVER频繁发包(实验每间隔50MS发512byte ),在发下一包之前必须要收到客户端ACK,客户端回应延时导致SERVER不能把下一包发出去;那为什么客户端以高于服务器端的发送频率发送给SERVER ,客户端接收数据时间间隔正常了,原因是(client)TCP数据发送数据的同时及时的把ACK捎带给了了SERVER,server就能发下一包了,这就是TCP数据传输捎带技术.谢谢各位