在TCP的协议下,完成端口的模型基本上是以下这种模式:        主线程                                                            
          |                                                             
 CreateIoCompletionPort                                          
          |                                  
     CreateThread     —————————  完成端口线程
          |                                   |
 |---- While(TRUE)                       While(TRUE)----------|
 |        |                                   |               |
 |     Accept              |------GetQueuedCompletionStatus() |
 |        |                |                  |               | 
 | CreateIoCompletionPort  |             WsaRev/WsaSend-------|
 |        |                |                  |
 |----WsaRev/WsaSend       |------------ Windows系统
          |                | 
      Windows系统  ---------主线程主要负责接受客户端的连接,在侦听到客户端的连接以后,将异步接受数据,由操作系统通知 GetQueuedCompletionStatus函数获取操作。在这里Accpet和GetQueuedCompletionStatus函数都是处于阻塞模式。这种TCP模式的完成端口比较容易理解,但是在UDP协议下的实现就比较难于考虑,他没有Accept的阻塞,主线程比较难于处理。如果没有这个主线程,WsaRecfrom函数又不知道放在哪里才能够通知GetQueuedCompletionStatus得到相应的操作方式。因此,希望大家能够帮我考虑一下,这种UDP下的完成端口该怎么安排他的结构?

解决方案 »

  1.   

    while accept里这个线程应该不是主线程而是监听线程吧。
    收发数据UDP和TCP一样的作法,WsaRev/WsaSend后都会在GetQueuedCompletionStatus() 等得到操作的完成。
      

  2.   

    是啊,上面说的很对,但是,由于没有ACCPET函数,我们必须要有一个函数不听的从缓冲区里面取的数据,但这个函数不能是WsaRevFrom函数,因为他是异步函数,做循环肯定不行,因此,这个结构对UDP肯定是需要改造的,不知道该做怎么样的改造才可以将UDP的完成端口改成合理的,各位各抒己见啊!
      

  3.   

    可以这样:       主线程                                                            
              |                                                             
     CreateIoCompletionPort                                          
              |                                  
         CreateSocket    
              |
     CreateIoCompletionPort
              |
        WSARecvFrom/WSASendTo
              |
         While(TRUE)
              |
    GetQueuedCompletionStatus
              |
            HandleIO
              |
      WSARecvFrom/WSASendTo
              |
          Windows系统由于UDP服务器并不需要在很多个套接字上处理IO,所以用完成端口模型处理意义不大。
      

  4.   

    freeshoot(巴蒂刘) 
    的说法是对的,我对TCP进行了修改,变成了UDP,思路和你说的一样,感谢你的帮助。