C++建立和运用socket链接池


    采用CS方式的程序不可防止都要碰到socket连接的问题,很多时候,运用编程语言当中自带的socket库,运用起来多少有些不习惯,虽然系统自带的库在很多异常处理,稳定性上下了很多功夫,但是要去理解和运用那些库,比如做socket连接池不免要走很多弯路。在这里我和大家讨论下如何样建立和运用 socket链接池。
    一般socket链接有以下两种方式:长(常)链接和短链接。
    长链接:当数据发送完成后socket链接不断开。一直保留到异常或者是程序退出为止,这种方式的优点是不用每次去发起连接断开,在速度上可以比短连接要快一些,但是相对来说对服务器的资源压力也要大些。长链接用的范围很广,比如游戏系统,qq等等,长(常)链接一般还须要定时向服务器ping数据,以保证socket链接畅通。当ping不通服务器时,须要重新开启链接。
    短链接:当一次数据发送完毕后,主动断开链接,每次发送数据都要一次链接、断开操作,这种方式的优点是:对服务器的资源占用相对来说比较小,但是由于每次都要重新链接,速度开销上也比较大,这种方式对于那种不须要经常与服务器交互的情况下比较适用。
    上面两种要领在用户量非常大的情况下都存在着很大的不足,因此,我们考虑可以用一种折衷的办法,那就是运用 socket的连接池。
    程序一开始原始化建立若干数量的长链接。给他们配置一个标识位,这个标识位表示该链接能不能空闲的状态。当须要发送数据的时候,系统给它分配一个当前空闲的链接。同时,将得到的链接配置为“忙”,当数据发送完毕后,把链接标识位配置为“闲”,让系统可以分配给下个用户,这样使得两种方式的优点都充分的发挥出来了。杭州携购网络科技有限公司旗下的携购独立购物网(http://www.shopxg.com)系统采用的就是这种方式。用户数量足够多的时候,只须要动态添加链接池的数量即可。

 下面我们用具体的程序来讲解下:
    首先我们声明一个socket类:

public class XieGouSocket
 {
  public Socket m_socket;  //Socket对象
  public bool m_isFree;  //判断能不能空闲
  public int m_index;  //在链接缓存池中的索引值
 }
     下面的函数是建立 socket链接池,这里为了使代码更加清晰,我特地把异常处理部分全部取掉了。
 public XieGouSocket[] m_socket; //先定义个缓冲池
 public void  CreateSocketPool()
 {
  string ip= “127.0.0.1”; 
 string port= 2003;
  IPAddress serverIp=IPAddress.Parse(ip);
  int serverPort=Convert.ToInt32(port);
  IPEndPoint iep=new IPEndPoint(serverIp,serverPort);
  m_socket = new XieGouSocket[200];
  for(int i =0; i < 200 ; i ++)
  {
   m_socket[i] = new XieGouSocket();
   m_socket[i].m_index = i ;
   m_socket[i].m_isFree = true;
   m_socket[i].m_socket =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
   m_socket[i].m_socket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.SendTimeout,1000); 
   m_socket[i].m_socket.Connect(iep);
  }
 }

   下面的函数是获取当前空闲的socket链接:
    因为是多线程,所以我们须要加一个原子操作,定义一个原子变量,以防止 多个线程之间抢占资源问题的发生。
 private   static   Mutex   m_mutex=new   Mutex();
 public static  XieGouSocket GetFreeConnection()
 { 
  m_mutex.WaitOne(); //先阻塞
  for(int i =0; i < m_socket.Length ; i ++)
  {
   if(m_socket[i].m_isFree) //如果找到一个空闲的
   {
    m_socket[i].m_isFree = false;
    m_mutex.ReleaseMutex();//释放资源          
    return m_socket[i];

   }
  }
  //如果没有空闲的链接,要么等待,要么程序再动态建立一个链接。
  m_mutex.ReleaseMutex();//释放资源
     
  return null;
 }

 

    当数据发送完毕后,程序必须将m_isFree 配置为 False。否则只运用不释放,程序很快就溢出了。
    基本的思路就是这样的,大家可以在此基础上好好的改良下,这样运行的效率就比较高了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Hpsocket c 是一个基于 IOCP 的高性能网络库,适用于 Windows 系统。它提供了简单易用的 API 接口,使得开发者能够轻松地构建高性能的网络应用程序。 Hpsocket c 的设计理念是高效、稳定、易用和可扩展。它支持 TCP 和 UDP 协议,可以用于开发各种类型的网络应用,如服务器、客户端、代理等。 Hpsocket c 提供了一些常用的功能,如异步操作、数据加密、心跳检测等。它还支持服务器的负载均衡和集群,可以根据应用的需要进行灵活的配置和扩展。 Hpsocket c 的性能优势主要体现在以下几个方面。首先,它采用 IOCP 技术,能够有效地管理大量的并发连接,并保持低延迟和高吞吐量。其次,它采用了多种优化策略,如零拷贝、预分配内存等,进一步提高了性能。最后,它支持多线程和多进程模式,可以充分利用多核处理器的性能优势。 除了高性能之外,Hpsocket c 还具有良好的稳定性和可靠性。它经过了严格的测试和验证,在各种场景下表现出色,能够处理大规模的并发连接和高负载。同时,它还提供了丰富的错误处理机制和异常处理功能,确保应用程序的稳定运行。 在使用方面,Hpsocket c 提供了详细的文档和示例代码,方便开发者学习和使用。它还有一个活跃的社区,开发者可以在社区中获取支持和交流经验。 总而言之,Hpsocket c 是一个强大、高性能的网络库,适用于开发 Windows 平台上的高性能网络应用程序。无论是开发服务器还是客户端,它都能提供稳定、高效的网络通信功能,大大简化了开发过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值