在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下的完成端口该怎么安排他的结构?
|
CreateIoCompletionPort
|
CreateThread ————————— 完成端口线程
| |
|---- While(TRUE) While(TRUE)----------|
| | | |
| Accept |------GetQueuedCompletionStatus() |
| | | | |
| CreateIoCompletionPort | WsaRev/WsaSend-------|
| | | |
|----WsaRev/WsaSend |------------ Windows系统
| |
Windows系统 ---------主线程主要负责接受客户端的连接,在侦听到客户端的连接以后,将异步接受数据,由操作系统通知 GetQueuedCompletionStatus函数获取操作。在这里Accpet和GetQueuedCompletionStatus函数都是处于阻塞模式。这种TCP模式的完成端口比较容易理解,但是在UDP协议下的实现就比较难于考虑,他没有Accept的阻塞,主线程比较难于处理。如果没有这个主线程,WsaRecfrom函数又不知道放在哪里才能够通知GetQueuedCompletionStatus得到相应的操作方式。因此,希望大家能够帮我考虑一下,这种UDP下的完成端口该怎么安排他的结构?
收发数据UDP和TCP一样的作法,WsaRev/WsaSend后都会在GetQueuedCompletionStatus() 等得到操作的完成。
|
CreateIoCompletionPort
|
CreateSocket
|
CreateIoCompletionPort
|
WSARecvFrom/WSASendTo
|
While(TRUE)
|
GetQueuedCompletionStatus
|
HandleIO
|
WSARecvFrom/WSASendTo
|
Windows系统由于UDP服务器并不需要在很多个套接字上处理IO,所以用完成端口模型处理意义不大。
的说法是对的,我对TCP进行了修改,变成了UDP,思路和你说的一样,感谢你的帮助。