c++socket模型之我见

能用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模型。不过性能很差!

完毕。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值