UDP协议下服务端设计问题,请教 ( 积分: 200 )

  • 主题发起人 主题发起人 yevon
  • 开始时间 开始时间
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]
 
[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]
 
TCP用完成端口我认为最主要的好处是能够很好的管理多个套接字.因为TCP是一个套接字对应一个客户端.而UDP不需要用IOCP的原因我想也是因为UDP不需要管理多个套接字.因为UDP是可以一个套接字对应多个客户端的!
 
楼上的兄弟,我说过会对每一个新客户端的初始请求生成一个服务SOCKET,这样相当于在客户端与服务端之间SOCKET也是一对一的关系。
 
每一个客户端与服务端端最初都有一个请求。对于这个请求我会生成一个服务SOCKET,而对于该客户的非初始请求,我会通过刚生成的服务SOCKET与客户端之间进行交互。这样,在服务端中对于每一个客户端都有一个SOCKET与之相对应。这样应该算是一对一了。[blue][/blue]
 
我不一定要用IOCP,我想知道,对于UDP而言。是否只有SELECT这种I/O是唯一的。其它的I/O是否可行。其它的WINSOCK I/O对于UDP而言,有什么侧重点。如果能用IOCP我想是最好的。
 
我做过用UDP的服务器端,其实你应该更多考虑下选择UDP的情况下,其它方面“多出来的负荷”如何解决。回到你的问题,使用UDP的话如果只考虑网络负荷,一台服务器,原来用TCP你能支持5千用户的话,UDP差不多能支持5万了,如果一台服务器支持5万你还不满足,还想继续压榨,这就太虐待人家服务器了不是:p
 
雪人snowman.请加我QQ跟我联系好不?我QQ:331656,验证时说明:雪人就OK
 
大家有关于UDP协议下完成例程的例子没有啊。有的请发到我的邮箱:yevons@163.com
谢谢,收到后散分
 
udp没有完成端口吧
我晕
哈哈
 
感谢可爱小猪的帮助。现在分送上
 
多人接受答案了。
 
后退
顶部