免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 6519 | 回复: 30
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-22 12:36 |只看该作者 |正序浏览
问题描述: 怎样在epoll中实现全工TCP???

场景:

epoll一直在用,但是都是在半双工模式。

一般我只把读放进epoll中,我们的应用写很少(大部分都是这种情况吧)就放在队列中等epoll timeout出来转一圈,把该写的数据写出去。

tcp是全双工的,epoll怎么来实现全双工?

思考很久,没有写例子,希望大家帮忙推导一下可能出现的问题,以及解决方案。


思路如下:

1. 启动2线程,一个读(R_EPOLL),一个写(信号量通知,建立一个key是fd的hash表-W_HASH)

2. 每accept一个socket加入R_EPOLL 和 W_HASH

3. 当没错误的时候,一切正常不表。 如果当read出错,或write出错,会发生什么情况?

3-1:read/write出错,write/read也会出错吗?
3-2:当本地或对端shutdown_read,shutdown_write 会导致对方什么情况?
3-3:会发生断开一半,而另外一半正常的情况吗?


各位CUer, 喷我吧~~~

论坛徽章:
0
31 [报告]
发表于 2013-09-25 16:59 |只看该作者
李营长 发表于 2013-09-25 16:53
recv, send本身是线程安全的。你没弄清楚自己想要用什么服务器模式,弄明白了这个以后你就不会焦虑于ep ...



recv, send本身是线程安全的。 能详细解释下不?

如果recv的时候,send出错了(多线程并行), 那怎么处理这个fd呢?直接close,应该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,里面存了个已发送字节数和一个要发送的数据块。

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


recv, send本身是线程安全的。你没弄清楚自己想要用什么服务器模式,弄明白了这个以后你就不会焦虑于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
28 [报告]
发表于 2013-09-25 16:52 |只看该作者
sendlist和recvbuff你是怎么实现的?
我当是也是这么干的,sendlist是每一次应用层在调send接口的时候push到sendlist中,而recvbuff的呢就是一块固定内存,收到数据的时候就调一下协议解析,是一个完整包的时候就回调给应用层。


回复 27# 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
26 [报告]
发表于 2013-09-25 16:29 |只看该作者
哦,以前同样做过这样的事。但是发现效率并不高,真实环境很少读与写同时,并且量特别大的情况。回复 24# 79hy


   

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


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

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


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

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

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP