能用UDP尽量用UDP,能不用TCP就不用。TCP要维护连接,错包重发,确认,错序调整等。
消耗比较大。UDP只需要再一个端口上进行IO操作,而TCP则需要再不同的端口上进行IO操作。
假设说用TCP:
案例1:
建立一个同时维持1000个链接的服务器。
先说缺点
1。阻塞模型:
1000个链接需要建立2000个线程去receive和send数据。开销相当大。
2。select模型:
一个线程搞定所有的事情。不过1000个线程,建立FD_SET集的内存开销不说,最重要的是,Select函数本身可能就比较慢,因为要访问所有的socket.其次,select即使返回了,对于1000个socket来说,就要有3000次判断!而此时有可能只有一个socket的某一个FD事件发生!
3。WSAAynSelect模型:
这个WSAAynSelect是异步的,最大的优势是在开销不是很大的情况下可以同时处理多个链接。比select模型节省3000*4字节的内存开销。但是如果同时维护1000个链接,其消息队列的处理速度有可能成为其性能瓶颈。
4。WSAEventSelect模型:
这个模型不进消息队列,处理速度比WSAAsnSelect好。也能同时维护很多链接。但是最多也就是Waifor只能64个,如果要多个的话,需要建立额外的线程。如果1000个链接,那么Waifor将至少建立15个线程。这将是很大的一笔开销。同时由于event与socket进行了绑定,1000个链接必须要求有1000个event。
5。Overlapped模型。
但是也是64个的缺点。
因为它和这4种模型不同的是,使用重叠模型的应用程序通知缓冲区收发系统直接使用数据,也就是说,如果应用程序投递了一个10KB大小的缓冲区来接收数据,且数据已经到达套接字,则该数据将直接被拷贝到投递的缓冲区。
而这4种模型种,数据到达并拷贝到单套接字接收缓冲区中,此时应用程序会被告知可以读入的容量。当应用程序调用接收函数之后,数据才从单套接字缓冲区拷贝到应用程序的缓冲区,差别就体现出来了。效率之高是惊人的。
6。
完成端口模型:
这个模型在处理高并发的应用程序时效果特别明显。通过限制工作线程的数目来控制其效率。不然工作线程在1000个以上,线程的切换代价是很高的。
下面讨论一下UDP在以上6个模型中的情况:
1。阻塞模型。需要建立一个Send,一个Receive线程。然后再建立工作线程若干。
2。Select模型。只需要建立一个线程。比较适合做UDP服务器。不过,如果服务器是多核的,这个就必须被淘汰。
3。WSAEventSelect跟重叠模型一样。优先用重叠模型。需要建立一个主线程,外加若干工作线程。
4。完成端口。需要建立工作线程池。和一个主线程。
综上所述。
就目前情况,UDP服务器最好用重叠模型,因为不需要维护连接,所以几个线程可以处理所有的链接。所以没必要开销很大地去建立完成端口,从而降低效率。
综合以上考虑:连接数目少,或者UDP就用重叠模型。
连接数目多,而且是TCP就用完成端口模型。
如果是windows客户端开发用WSAAysnSelect模型。
连接数目为一的情况下,考虑一下阻塞模型和select模型。不过性能很差!
完毕。