Y
yevon
Unregistered / Unconfirmed
GUEST, unregistred user!
[red]我现在做的服务端全部使用UDP协议,以前用INDY控件中的UDPSERVER控件做了一个测试程序。后来考虑到该控件中使用的是WSASELECT I/O机制、效率不是很高。所以改用WINSOCK来写了。经过一段时间的学习,发现在TCP协议下的IOCP(完成端口)能够发挥极好的性能。
所以我想在UDP方面使用IOCP来完成服务端。而客户端中采用 Overlapped I/O中的完成例程来写。现在主要难点在于UDP使用IOCP时,听朋友说要一次投递多个请求才能发挥性能。对于UDP与TCP的区别我清楚。但我不明白为什么在IOCP上分别实现他们时,为什么会有这么大的差异。
很多资料上说的都是TCP使用IOCP的例子,为什么对于UDP就没出有说明呢,就算有,也是SELECT这种I/O。难道UDP就不能使用IOCP吗?
关于UDP服务端设计,一般采用的都是并发服务器:服务器等待起始请求报文;当有客户端请求到来时,创建一个新的SOCKET;将该SOCKET的端口号做为服务器的第一个应答,要求客户端随后与该SOCKET交互。借鉴TCP服务器,把服务器的接受请求的SOCKET称为监听SOCKET,而把创建的新SOCKET称为服务SOCKET,这样就实现了UDP并发服务器。
我是这样考虑的,即然能够在服务端实现多个服务SOCKET(对应于不同的客户端),这样应该同TCP使用IOCP的原理差不多(TCP是用一个线程不停的调用ACCEPT得到新的服务SOCKET,然后将这个新的服务SOCKET绑定到完成端口中。。。其它的就不用说了),正因为这个原因。所以我想让这些服务SOCKET与TCP一样,也利用完成端口。绑定到完成端口中。当有新的完成信息来临时,使用GetQueuedCompletionStatus函数可以得到与相应的SOCKET相关的完成信息并进行处理。
以上是本人自己的想法,不知道UDP服务器怎么设计好。有些使用过TCP下IOCP的朋友,听我说在UDP下用IOCP实现,都觉得不可能,或说没有必要。我想知道CSDN中的高手们的想法。
IOCP我自己觉得是与网络无关的。因为他对于WIN中其它设备都适用,是个通用的标准,他只是让我们使用非阻塞的方式不断的接受消息,在这个过程中不需要等待,当有消息完成时,会在完成端口中得到相应的信息。所以我觉得UDP下使用IOCP的方式是可行的。
希望大家能发表下自己的见解,也希望高手能来我的贴中灌灌水。请高手留下自己的足迹。急待中。。。。。。。。。。。。。。。。。。。。。。。。。。。。[blue][/blue][/red]
所以我想在UDP方面使用IOCP来完成服务端。而客户端中采用 Overlapped I/O中的完成例程来写。现在主要难点在于UDP使用IOCP时,听朋友说要一次投递多个请求才能发挥性能。对于UDP与TCP的区别我清楚。但我不明白为什么在IOCP上分别实现他们时,为什么会有这么大的差异。
很多资料上说的都是TCP使用IOCP的例子,为什么对于UDP就没出有说明呢,就算有,也是SELECT这种I/O。难道UDP就不能使用IOCP吗?
关于UDP服务端设计,一般采用的都是并发服务器:服务器等待起始请求报文;当有客户端请求到来时,创建一个新的SOCKET;将该SOCKET的端口号做为服务器的第一个应答,要求客户端随后与该SOCKET交互。借鉴TCP服务器,把服务器的接受请求的SOCKET称为监听SOCKET,而把创建的新SOCKET称为服务SOCKET,这样就实现了UDP并发服务器。
我是这样考虑的,即然能够在服务端实现多个服务SOCKET(对应于不同的客户端),这样应该同TCP使用IOCP的原理差不多(TCP是用一个线程不停的调用ACCEPT得到新的服务SOCKET,然后将这个新的服务SOCKET绑定到完成端口中。。。其它的就不用说了),正因为这个原因。所以我想让这些服务SOCKET与TCP一样,也利用完成端口。绑定到完成端口中。当有新的完成信息来临时,使用GetQueuedCompletionStatus函数可以得到与相应的SOCKET相关的完成信息并进行处理。
以上是本人自己的想法,不知道UDP服务器怎么设计好。有些使用过TCP下IOCP的朋友,听我说在UDP下用IOCP实现,都觉得不可能,或说没有必要。我想知道CSDN中的高手们的想法。
IOCP我自己觉得是与网络无关的。因为他对于WIN中其它设备都适用,是个通用的标准,他只是让我们使用非阻塞的方式不断的接受消息,在这个过程中不需要等待,当有消息完成时,会在完成端口中得到相应的信息。所以我觉得UDP下使用IOCP的方式是可行的。
希望大家能发表下自己的见解,也希望高手能来我的贴中灌灌水。请高手留下自己的足迹。急待中。。。。。。。。。。。。。。。。。。。。。。。。。。。。[blue][/blue][/red]