使用哪种select效率高? 最近写了一个简单的Proxy, 但觉得效率不好,我用的是select+thread.在windows中有select, WSAEventSelect, WSAAsyncSelect,到底哪种效率好一点?不是非要用完成端口吧?想提高转发数据的效率,老大们给点意见。谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 WSAEventSelect模型类似WSAAsynSelect模型,但最主要的区别是网络事件发生时会被发送到一个事件对象句柄,而不是发送到一个窗口。 我想这几种效率应该差不多吧,只不过适用于不同的环境而以。以下是个人选择的依据:1. select :在要求移植性的情况下优先适用2. WSAEventSelect:不需要移植且不使用窗口时3. WSAAsynSelect:不需要移植且适用窗口 重叠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.老大们帮忙想想还能怎样提高性能,我希望数据包在本机停留的时间越短越好,除了从底层网卡上直接劫包转发这招外,还有其他的吗?谢谢 WSAEvenSelectsetsockopt(s,IPPROTO_TCP,TCP_NODELAY,...); 你的select+thread是指开N个线程,每个线程一个select???我的个人认为,只要开一个线程+一select,对付上千个连接是小case。 当然MS的select有效率的确比不上UNIX的。 关于 ppt 的一些操作 推荐一个跨平台socket封装库? 在文档类中应如何调用视图类中的OnDraw()函数? 让出现的窗口不消失? 請问:做UI的前景如何呀??谢谢!! 如何禁止使用mfc的头文件和库 ----SDI程序图标现实问题---- 如何用低级音频api播放wav文件 ? VB中可以通过 refenerce ms word 9.0 object 来引入word对象库,在VC中如何引入? 请问BSTR类型跟_bstr_t有什么区别? 当动态文本内容超出编辑框的显示范围时,怎样让文本向上滚动,总是能看到最新的内容 能否从内存调用DLL?
送到一个事件对象句柄,而不是发送到一个窗口。
2. WSAEventSelect:不需要移植且不使用窗口时
3. WSAAsynSelect:不需要移植且适用窗口
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.老大们帮忙想想还能怎样提高性能,我希望数据包在本机停留的时间越短越好,除了从底层网卡上直接劫包转发这招外,还有其他的吗?
谢谢
setsockopt(s,IPPROTO_TCP,TCP_NODELAY,...);