network
final
坚强的走下去 辉煌的站起来
展开
-
建立私有的name service
前言: <br /> 提到dns, 让我们想起了 gethostbyname, gethostbyaddr 相关函数(线程安全的使用 getaddrinfo, getnameinfo), 不过他们都是阻塞函数, 在服务器端我们还需要额外构建一个异步环境来支撑这些阻塞函数运行.<br /> 需求:<br /> 这几天因为这些阻塞函数导致我想编写一个内部的name service, 开始想得是直接在引擎里开多个线程可以并发的处理大量的dns请求, 不过后来发现这样不但和引擎耦合起来, 还导致了引擎不必要的原创 2011-05-24 10:20:00 · 755 阅读 · 0 评论 -
私有name service 续
这几天折腾了一下~ , 把这个服务程序搭了出来, 总结来说结构上十分简单, 线程池, 搭配getaddrinfo就可以了, 不过一涉及到队列就会有容量限制, 现在来看满足自己的需求是足够了, 不过毕竟getaddrinfo也是阻塞接口, 开了32个线程每个线程1M的队列也总会出现队列满的情况, 仔细想了想, 要么告知客户程序服务繁忙稍后再试, 要么在网络层面上就要予以阻塞, 不过这回导致客户端原创 2011-06-08 11:29:00 · 991 阅读 · 2 评论 -
网络负载控制的一点经验
前言: 重构了几次的网络库基本上没什么问题了, 从单线程改为多线程, 又从多线程改为单线程... 反反复复, 细小的地方权衡了很多次, 从简洁到复杂看不顺眼, 又重构为简洁优雅~ , OK, 扯了一堆还没进入正题, 主要唠叨一下遇到的问题和经验吧: 我们使用诸如libevent之类的网络库, 典型的用法是接受到数据包之后要一次性将数据读取完整(不完整的协议内容除外), 不过这有个问题, 一原创 2011-06-10 23:15:00 · 859 阅读 · 1 评论 -
基于epoll异步connect实现
这几天写网络爬虫, 结果服务器长时间阻塞在connect上导致不可容忍的并发问题, 于是着手增加一个异步connect接口. 常规的实现手段为配合select进行检测, 不过其性能对于高并发时会有些问题, 如果想做到结构简单合理采用one per one thread的处理方式还会引发过多的线程上下文切换导致不必要的性能浪费, 故放弃使用select来实现. 由于服务器网络库采用epoll实现, 故此接口也基于epoll实现. 查阅了一些资料, 总结一下: 1. 设置socket为nonbloc原创 2011-05-06 17:45:00 · 11405 阅读 · 1 评论 -
判断TCP连接异常
这阵子突然重新接手做了下关于TCP连接异常中断的检测, 这里的异常中断指的是目标主机断电, 网线被拔等非正常因素. 这个问题已经被处理很多年了, 无非2种基本解决策略: 1. 应用层心跳 2. 开启协议栈提供的keepalive, 这个和操作系统有关 有些操作原创 2011-08-04 17:19:29 · 2683 阅读 · 1 评论 -
Event & Network 设计思考
我的站点: http://finaldie.com/wordpress/mail: hyzwowtools@gmail.com自己之前写了一个网络库, 最初仅仅是为了练手, 后来用着还算顺手, 就直接用在自己的小项目里了, 不过最近查看libev和redis的代码, 自己反思了下, 得到了一些总结一些经验 之前在写这部分的时候, 直接把epoll的代码耦合在网络库里了, 也原创 2011-11-11 17:00:02 · 637 阅读 · 0 评论