`
daojin
  • 浏览: 694846 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

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

完毕。

分享到:
评论

相关推荐

    C++Socket编程详解

    用户可以从学习 OSI 七层网络模型、TCP/IP 协议和 C/S 编程模型开始,然后学习 Socket 编程和 Visual C++ 网络编程。同时,用户也需要学习 MFC 类库和 Windows API 函数的使用。 结论 C++ Socket 编程是一种非常...

    C++ select模型 异步SOCKET 聊天室服务服客户端

    本篇文章将深入探讨使用C++实现的基于`select`模型的异步SOCKET通信,特别关注如何构建一个简单的聊天室服务端和客户端。 首先,`select`模型是网络编程中处理多路复用I/O(Multiplexing I/O)的一种方式,允许程序...

    C++ SOCKET编程介绍

    C++ SOCKET编程是一种在C++中实现网络通信的技术,它基于Berkeley Sockets接口,允许开发者创建客户端和服务器应用程序,实现跨网络的数据传输。SOCKET是操作系统提供的一个接口,使得程序能够通过网络发送和接收...

    C++socket编程实例

    在IT领域,网络通信是不可或缺的一部分,而C++作为强大的编程语言,提供了丰富的库支持进行网络...压缩包中的"**C++Socket编程**"文件可能包含了详细的代码示例和步骤解析,对于学习和理解C++ socket编程非常有帮助。

    c++ socket 源代码

    C++ Socket编程是网络编程中的基础,用于在不同的设备或程序之间建立通信通道。源代码通常是程序员用C++编写的程序或库,用于实现特定功能,例如在这个案例中,是Socket通信。以下是对C++ Socket源代码的一些详细...

    linux-c++ socket编程

    在IT领域,Linux环境下的C++ Socket编程是网络通信的核心技术之一。Socket接口提供了一种在不同进程间通过网络进行通信的方法,无论这些进程是否在同一台机器上。本压缩包包含了一个简单的TCP服务器(TCPServer.zip...

    c++ socket编程实例(服务端及客户端)

    C++ Socket编程的关键在于理解网络通信的模型和协议。TCP/IP协议族提供了可靠的、面向连接的传输,而UDP则提供了无连接、不可靠的传输。在实际编程中,需要处理网络异常,如连接失败、数据传输错误等,因此错误处理...

    c++实现win socket 编程中的Select I/O模型

    本文将深入探讨如何使用C++在Windows环境下实现Socket编程中的Select I/O模型。Select模型是一种经典的多路复用I/O机制,它允许单个进程同时监控多个文件描述符(包括套接字)的状态,以检测何时可以进行读写操作。 ...

    C++ socket绝密编程资料.rar

    C++ Socket编程是一种在C++中实现网络通信的技术,它基于Berkeley Sockets API,用于构建客户端和服务器应用程序。在本资料中,我们将深入探讨C++ Socket编程的基础、原理以及高级应用,包括如何使用Ice进行分布式...

    C++ Socket

    C++ Socket编程是网络通信中的基础技术,它允许程序通过网络发送和接收数据。在C++中,Socket接口是基于伯克利套接字(Berkeley Sockets)API设计的,这是一种广泛使用的跨平台网络编程接口。下面我们将深入探讨C++ ...

    5种Socket模型实现源码

    本文将深入探讨5种常见的Socket模型,以及它们在VC++环境下的实现源码。 一、同步阻塞IO模型 这是最基础的Socket模型,也是最简单的实现方式。在这个模型中,读写操作会一直阻塞,直到数据传输完成。在VC++中,通常...

    C++ socket 基本功能跨平台封装(好用)

    真正可以使用的平台无关性的 C++ socket wrapper,没有做任何多余的事情,仅仅对 socket 的基本功能进行了平台无关性的封装,简洁原生。封装了:setoption, connect, close, send, recv, sendto, recvfrom, accept...

    C++ socket编程

    C++ Socket编程是网络编程中的一个重要领域,它允许C++程序通过网络进行通信,比如创建服务器来接收客户端的连接请求,或者构建客户端程序与远程服务器交互。以下是对C++ Socket编程的一些关键知识点的详细说明: 1...

    c++做的异步通信,使用socket的典型例子

    以下是一个简化的C++异步通信模型: 1. **创建Socket**:使用`socket()`函数创建一个socket,指定协议族(如PF_INET代表IPv4)、套接字类型(如SOCK_STREAM代表TCP)和协议(如IPPROTO_TCP)。 2. **绑定与监听**...

    C++ Socket编程简单源码

    在C++中,Socket编程常涉及TCP/IP模型的套接字层。 2. **创建Socket**:在C++中,使用`socket()`函数创建一个Socket句柄。这个函数需要指定协议族(如AF_INET代表IPv4)和通信类型(如SOCK_STREAM代表TCP)。 3. *...

    visual c++ Socket编程PDF带源码

    《Visual C++ Socket编程》是一本专注于利用Visual C++进行Socket网络编程的教程,其中包含了丰富的源代码供学习者实践。Socket编程是计算机网络通信的基础,尤其在开发跨平台、高性能的网络应用时,它是不可或缺的...

    C++Socket编程实例(服务端跟客户端通信).rar

    C++ Socket 编程是网络编程的一个重要领域,它允许程序通过网络进行通信。本实例主要涉及服务端和客户端的交互,是初学者理解和实践网络通信的绝佳起点。以下将详细解析这个实例中的关键知识点: 1. **Socket 基础*...

    C++聊天室Socket

    【C++聊天室Socket】是基于C++编程语言实现的网络通信系统,主要利用了Socket接口来构建一个简单的在线聊天平台。在计算机网络中,Socket是应用层与传输层之间的一个编程接口,允许应用程序通过它来进行网络通信。...

    C++自定义封装socket操作业务类完整实例

    在C++编程中,自定义封装socket操作是提高代码复用性和可维护性的重要方法,尤其是在网络编程领域。本实例提供了在Linux环境下实现C++自定义封装socket操作业务类的详细过程,允许开发者轻松地创建socket连接、设置...

    C++_Socket_Dev-C++5.11-source.rar

    在IT领域,网络编程是不可或缺的一部分,而C++ Socket编程则是实现网络通信的重要技术。本资源"**C++_Socket_Dev-C++5.11-source.rar**"提供了一个使用C++封装的Socket接口,特别适用于Dev-C++ 5.11版本的开发环境。...

Global site tag (gtag.js) - Google Analytics