免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 79hy
打印 上一主题 下一主题

[技术动态] 讨论:怎样在epoll中实现全工TCP??? [复制链接]

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
21 [报告]
发表于 2013-09-24 14:33 |只看该作者
李营长 发表于 2013-09-24 14:25
回复 19# hellioncu


咱epoll也是两个的,不是两个线程共用一个。

论坛徽章:
7
摩羯座
日期:2013-12-05 10:42:57辰龙
日期:2013-12-27 13:40:49亥猪
日期:2014-01-15 09:10:37天秤座
日期:2014-01-20 11:22:20辰龙
日期:2014-01-26 17:02:25午马
日期:2014-01-27 14:22:34水瓶座
日期:2014-02-19 09:36:40
22 [报告]
发表于 2013-09-24 15:35 |只看该作者
如果一直关心写,但是没有数据写的话,那么肯定会造成CPU浪费。回复 15# 79hy


   

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
23 [报告]
发表于 2013-09-25 09:16 |只看该作者
要异步读写的话只能多线程了啊,linux没有完善的网络异步IO的接口的。  但是多线程带来的消耗也不小的。

论坛徽章:
0
24 [报告]
发表于 2013-09-25 16:26 |只看该作者
回复 22# kdkgod


    也不是一直关心写。有数据写的时候就写。没数据就阻塞休息。 主要是要同一个socket实现同时读写。

论坛徽章:
0
25 [报告]
发表于 2013-09-25 16:28 |只看该作者
李营长 发表于 2013-09-24 14:17
回复 17# hellioncu


如果在一个线程池里读写,怎么做到同步? 如果对一个fd进行多线程读、写, 怎么保证读出错,写怎么处理???

论坛徽章:
7
摩羯座
日期:2013-12-05 10:42:57辰龙
日期:2013-12-27 13:40:49亥猪
日期:2014-01-15 09:10:37天秤座
日期:2014-01-20 11:22:20辰龙
日期:2014-01-26 17:02:25午马
日期:2014-01-27 14:22:34水瓶座
日期:2014-02-19 09:36:40
26 [报告]
发表于 2013-09-25 16:29 |只看该作者
哦,以前同样做过这样的事。但是发现效率并不高,真实环境很少读与写同时,并且量特别大的情况。回复 24# 79hy


   

论坛徽章:
0
27 [报告]
发表于 2013-09-25 16:34 |只看该作者
本帖最后由 79hy 于 2013-09-25 16:34 编辑

回复 26# kdkgod


    谢谢。就是我就是妄想症发了。

其实我现在的处理方式是用ET模式,把IN,OUT都放到epoll里监听。

每个fd上都挂一个sendlist,和recvbuf, 1个SendEnable(SocketMap)

如果有OUT事件,就把SendEnable设置 1. 发送阻塞时设置成0.

每次epoll都0.5s超时出来都遍历一下 SocketMap. 把SendEnable 为1的 sendlist不为空的数据发出去。


我想有没有可能避免掉遍历呢???????

论坛徽章:
7
摩羯座
日期:2013-12-05 10:42:57辰龙
日期:2013-12-27 13:40:49亥猪
日期:2014-01-15 09:10:37天秤座
日期:2014-01-20 11:22:20辰龙
日期:2014-01-26 17:02:25午马
日期:2014-01-27 14:22:34水瓶座
日期:2014-02-19 09:36:40
28 [报告]
发表于 2013-09-25 16:52 |只看该作者
sendlist和recvbuff你是怎么实现的?
我当是也是这么干的,sendlist是每一次应用层在调send接口的时候push到sendlist中,而recvbuff的呢就是一块固定内存,收到数据的时候就调一下协议解析,是一个完整包的时候就回调给应用层。


回复 27# 79hy


   

论坛徽章:
0
29 [报告]
发表于 2013-09-25 16:53 |只看该作者
79hy 发表于 2013-09-25 16:28
如果在一个线程池里读写,怎么做到同步? 如果对一个fd进行多线程读、写, 怎么保证读出错,写怎么处理 ...


recv, send本身是线程安全的。你没弄清楚自己想要用什么服务器模式,弄明白了这个以后你就不会焦虑于epoll了。

论坛徽章:
0
30 [报告]
发表于 2013-09-25 16:57 |只看该作者
kdkgod 发表于 2013-09-25 16:52
sendlist和recvbuff你是怎么实现的?
我当是也是这么干的,sendlist是每一次应用层在调send接口的时候push ...



握爪。  哈哈。


我的recvbuff相当于2块内存,1个固定大小的头,然后一个指针,根据头里的数据大小分配一个内存块。收完后push到业务层去。

sendlist就更简单了,就是个结构体+List,里面存了个已发送字节数和一个要发送的数据块。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP