写了个TCP server程序,使用完成端口,多个client连接server,server会同时向多个client发送数据,问题是:如果某个client连接的网络延时较大,发送比较耗时,是否会阻塞server向其他client发送数据?socket都是阻塞的我测试发现,即使为每个client建立一个发送线程,只要一个发送阻塞了,其他发送一直会等待。想确认一下,是这样的吗?因为从同一个server端口发出的缘故?

解决方案 »

  1.   


    unsigned long ul = 0;
    ret = ioctlsocket(sClient, FIONBIO, (unsigned long*)&ul); //设置为阻塞方式这么设的啊,我怎么查到的是完成端口就是阻塞的
      

  2.   

    看不出你这是什么完成端口,iocp是异步IO,与阻塞与否没有关系,反正就是把数据交给系统,等待结果即可,系统会屏蔽掉你的套接字是阻塞还是非阻塞所带来的不同的。换句话说,用上异步IO,在你的层面,就与阻塞与否无关了(至少你不必关心了)。
      

  3.   

    我确实用的完成端口,但发送用的send函数,没用WSASend,是否这就失去了完成端口的意义?
      

  4.   

    你这与完成端口没有关系了。所谓异步IO,必须是要带一个重叠结构才有可能是异步IO。
      

  5.   

    接收用的WSARecv,看来得好好看看完成端口
      

  6.   

    发送数据改为WSASend,目前server运行正常,不过有些疑惑:
    1、调用WSASend的第四个参数lpNumberOfBytesSent,返回发送的字节数,有没有可能返回小于申请发送的字节数并不返回错误?
    2、GetQueuedCompletionStatus获取到的WSASend的完成消息,没有错误的情况下,第三个参数dwBytesTransfered是否有可能小于申请发送的字节数?
      

  7.   

    http://www.51rad.info
      

  8.   

    感觉贴主还不了解异步机制,io完成端口与用select实现的i\o多路复用不应该等起来!