最近写了一个简单的Proxy, 但觉得效率不好,我用的是select+thread.在windows中有select, WSAEventSelect, WSAAsyncSelect,到底哪种效率好一点?不是非要用完成端口吧?想提高转发数据的效率,老大们给点意见。谢谢!

解决方案 »

  1.   

    WSAEventSelect模型类似WSAAsynSelect模型,但最主要的区别是网络事件发生时会被发
    送到一个事件对象句柄,而不是发送到一个窗口。
      

  2.   

    我想这几种效率应该差不多吧,只不过适用于不同的环境而以。以下是个人选择的依据:1. select :在要求移植性的情况下优先适用
    2. WSAEventSelect:不需要移植且不使用窗口时
    3. WSAAsynSelect:不需要移植且适用窗口
      

  3.   

    重叠io如何做?给个简单的模型,这个比用基本的性能能提高多少?我也就是跑在单CPU上,应用的场合也比较窄的。我现在的模型是(暂时只proxy UDP报文):
    1。主线程负责界面,配置,定时清理不用的socket等。
    2。一个thread负责监听来自内网的数据,如果有则根据数据源IP查找是否存在相应的proxy socket,没有则创建一个,然后直接用proxy socket将数据发送到目的地。
    3。一个thread负责监听外网的数据,根据数据目的查找对应的内网地址(proxy ip+udp对应一个内网ip+port),然后直接用负责内网监听的socket将报文发送给内网。数据转发基本没有多余的内存copy的动作,buf从recv读出,直接send出去,这部分的时间消耗应该比较小了,查找proxy等也基本做到最小了,我选择的std::map。就是select部分不知道是不是消耗的时间比较大一些,我设置每次等待10ms,关键是select每次都需要重新设置,我是保存了一份最初的,然后每次都内存copy.老大们帮忙想想还能怎样提高性能,我希望数据包在本机停留的时间越短越好,除了从底层网卡上直接劫包转发这招外,还有其他的吗?
    谢谢
      

  4.   

    WSAEvenSelect
    setsockopt(s,IPPROTO_TCP,TCP_NODELAY,...);
      

  5.   

    你的select+thread是指开N个线程,每个线程一个select???我的个人认为,只要开一个线程+一select,对付上千个连接是小case。 当然MS的select有效率的确比不上UNIX的。