通向码农的道路(enet开源翻译计划 二)
QQ 324186207群 enet交流技术,主要是为了研究tcp内部执行机制。欢迎大家增加探讨。小弟水平有限,翻译难免有误。
。
http://enet.bespin.org 解析enet 双向链表(无placement new) enet本身就已经局限了4095 在线人数 假设有10000人同一时候在线。enet使用list来维护每次收发,不断的销毁,释放内存,性能实在太低。
enent写的根本不严谨,无论什么结构都存储双向链表,收一个包,我也须要去遍历,究竟获取某peer。
enet_host_service 每次事件抛出机制,实在太粗糙。说明enet 很多其它偏向就是一个学习项目,假设大量数据传输,高并发,高负载,无法满足需求顺便提下。为何server好多地方不使用stl
问题一:不能确定STL怎样管理内存。如果就依照STL默认的方法来管理内容。则server在长时间的分配和释放内存后,easy导致内存碎片。对server的稳定有影响。然而,如果没有阅读过STL的源代码。谁又能确切地得知STL是怎样管理内存的呢?尽管可以在STL中使用自己的分配器,又可以确认STL的某些部分不会在分配器之外进行内存分配呢?
当然,内存管理问题不是STL带来的问题,不论什么server程序本身都要考虑这个问题。原因在极少有人去阅读STL的源代码。去了解STL的内部实现机理。由于不了解,所以怀疑。由于怀疑,所以不轻易使用。
问题二:不能确定STL在海量数据下的表现。
server一般都是海量的内存,为了提高性能大量数据保存在内存中。
在很大的规模的数据下。STL一定可以满足稳定性和效率的需求吗?
问题三:不能确定STL在多线程环境下的表现。
以上的内存和规模的问题能够通过加深对STL的了解和測试来解决,可是多线程下的并发问题就不是那么easy攻克了。
STL不是线程安全的。在多线程环境下。对STL容器的操作都要加锁来确保正确。然后。部分高性能的场合,须要对“读-读”条件下并发进行优化,以及某些锁无关的特殊条件能够不加锁,甚至是採用流行的RCU机制…………在这个倡导多核和并发的时代,STL显得有些落后了。
传统的双向链表 普通情况我们套上 T *data
/*双链表结构*/ template<class T> typedef struct node { T *data; struct node *prior; struct node *next; }DNode;
下面enet双向链表结构,发现结构体内无T *data ,奇怪吧?那么我们数据存储到哪里?
#list.h
typedef struct _ENetListNode{ struct _ENetListNode * next; struct _ENetListNode * previous; } ENetListNode;
typedef ENetListNode * ENetListIterator;
typedef struct _ENetList{ ENetListNode sentinel; //标记当前处于某个节点位置} ENetList;
extern void enet_list_clear( ENetList * );
extern ENetListIterator enet_list_insert( ENetListIterator , void * ); extern void * enet_list_remove( ENetListIterator ); extern ENetListIterator enet_list_move( ENetListIterator, void *, void * );
extern size_t enet_list_size( ENetList * );
#define enet_list_begin(list) ((list) -> sentinel.next) #define enet_list_end(list) (& (list) -> sentinel)
#define enet_list_empty(list) (enet_list_begin (list) == enet_list_end (list))
#define enet_list_next(iterator) ((iterator) -> next)#define enet_list_previous(iterator) ((iterator) -> previous)
#define enet_list_front(list) ((void *) (list) -> sentinel.next) #define enet_list_back(list) ((void *) (list) -> sentinel.previous)
#main.cpp
#define ENET_CALLBACK __cdecltypedef struct _ENetCallbacks{ void * ( ENET_CALLBACK * malloc ) ( size_t size ); void ( ENET_CALLBACK * free ) ( void * memory ); void ( ENET_CALLBACK * no_memory ) ( void );} ENetCallbacks;
static ENetCallbacks callbacks = { malloc, free, abort };
void * enet_malloc( size_t size ){ void * memory = callbacks.malloc( size ); if( memory == NULL ) callbacks.no_memory(); return memory;}void enet_free( void * memory ){ callbacks.free( memory );}
struct ENetOutgoingCommand{ ENetListNode list; int a;};
int main()
ENetOutgoingCommand *enet_outgoing;
ENetList enet_test;
enet_list_clear(&enet_test); //重置双向链表,将头指针和尾指针指向第一个空节点enet_outgoing = (ENetOutgoingCommand *)enet_malloc( sizeof( ENetOutgoingCommand ) );enet_outgoint->a = 100;enet_list_insert( enet_list_end( &enet_test ), enet_outgoing ); //malloc 数据插入到双向链表的尾部ENetListIterator currentCommand;currentCommand = enet_list_begin(&enet_test ); //这里取出双向链表头节点
while( currentCommand != enet_list_end( &enet_test ) ) //遍历链表{ ENetOutgoingCommand * t1 = (ENetOutgoingCommand *)currentCommand; //通过强转来获取数据 cout << t1->a << endl; currentCommand = enet_list_next( currentCommand ); //获取下个节点 enet_list_remove( &t1->list ); //删除当前节点 enet_free( t1 );//删除内存,避免内存泄漏 } while( Exit ){ 開始server循环机制,这个循环设计非常的糟糕,每次一但server触发事件,会调用不同类型事件。 解决的方法,每个while 我用队列收一把全部数据。然后在逐个遍历,这样添加了非常小延迟,可是提高了吞吐量。 每次收到数据后。又从新 enet_protocol_send_outgoing_commands 開始检查第一个玩家,应该做个全局变量,存储当前遍历 位置
ENetEvent event; if( enet_host_service( server, &event, 1 ) ) { switch( event.type ) { case ENET_EVENT_TYPE_CONNECT: { Conneted( event.peer->connectID, event.peer->address.host, event.peer->address.port ); peersConn.Insert( event.peer->connectID, event.peer ); break; } case ENET_EVENT_TYPE_RECEIVE: { //bIdle = false; //Recived( event.peer->connectID, event.packet->data, event.packet->dataLength ); break; } case ENET_EVENT_TYPE_DISCONNECT: { cout << "close client_fd" << endl; //Disconneted( event.connectID ); break; }
case ENET_EVENT_TYPE_PING: { cout << "enter reconnect:" << time( 0 ) << endl; //ReConnection(event.peer->connectID); break; } }
}
}
/** Waits for events on the host specified and shuttles packets between the host and its peers.
@param host host to service @param event an event structure where event details will be placed if one occurs if event == NULL then no events will be delivered
转载于:https://www.cnblogs.com/lytwajue/p/7345050.html
通向码农的道路(enet开源翻译计划 二)相关推荐
- 15岁就踏上了码农的道路
初中毕业以后因为不想上学而选择了码农这一行业! 毕业以后刚好家里面要装修房子就给父亲打打下手收拾房子,每天睡觉吃饭收拾房子就这样一直在循环,过了差不多半个月我就厌倦了这样的生活觉得如果以后都这样的话我 ...
- 码农必备?清华大学开源了一款写代码神器。。。
程序员宝藏库:https://gitee.com/sharetech_lee/CS-Books-Store 提升程序员编码效率,是一个经久不衰的话题,从最初用纯文本编辑器到后来代码自动补全,再到后来基 ...
- 开源程序员愤怒控诉!Github的「AI码农」Copilot就是寄生虫
视学算法报道 编辑:David [导读]以方便程序员写代码为名,吸血开源社区为实,Github的「AI码农」Copilot其实就是个寄生虫? Github去年推出的「AI程序员」Copilot ...
- 既然报个培训班就可以成为码农,那学计算机专业有什么用?
阅读本文大概需要6分钟. 前两天逛知乎发现一个很火热的问题,阅读量高达55万: 既然报个培训班就可以成为码农,那学计算机专业有什么用? 洋哥是科班出身,但读书期间的确也没好好学,大部分都是靠自学,所以 ...
- 码农翻身讲计算机基础:补码,程序编译与递归
从1加到100:一道简单的数学题挑战下你的大脑 原创: 刘欣 码农翻身 2017-01-03 2017年的第一篇, 写给刚刚踏入计算机编程领域的小白吧. 所谓编程,就是把自然语言的需求翻译成计算机语言 ...
- 每3位新码农中就有2个是单身?来自31000人的调查报告显示……
选自Medium 作者:Quincy Larson 机器之心编译 参与:刘晓坤.王淑婷 freeCodeCamp 做了一个名为「2018 New Coder Survey」的调研,以了解成年人学写代码 ...
- 来自31000人的调查报告显示:每3位新码农中就有2个是单身……
选自Medium,作者:Quincy Larson,机器之心编译,参与:刘晓坤.王淑婷. freeCodeCamp 做了一个名为「2018 New Coder Survey」的调研,以了解成年人学写代 ...
- 从抄书到开源之巅:章亦春的程序人生(转载自微信公众号 -- 码农翻身)
2018-04-08 章亦春 码农翻身 国人主导的开源软件能建立世界级影响力的不多,章奕春的OpenResty是其中之一. 让人没有想到的是,他的程序人生是从抄书开始的...... 本文转载自公众号& ...
- 大厂白嫖拖垮开源!开源届码农:用户脾气大需求多还不给钱
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨新智元 编辑丨极市平台 导读 现在,开源软件界或即将到达必须变 ...
最新文章
- 自整理IE6,IE7,IE8,Firefox兼容方案。。。
- iOS自定义的UISwitch按钮
- 为什么建议学生积极参与开源项目?
- kafka connect_Kafka Connect在MapR上
- hapi常用插件(持续更新)
- 贾跃亭向全体债权人道歉!个人资产曝光:总额14亿美元,国内三套房
- 保险的现金价值是什么意思?
- 湖南工程学院毕业论文计算机,bbs毕业设计
- hibernate11--Criteria查询
- Shell脚本 – 查看网络接口信息
- php用手机摇一摇,H5做出手机摇一摇功能的实现步骤
- 《英雄联盟》设计师NORMAN的游戏设计之路
- python3 词频统计代码_Python词频统计代码,python
- 众数问题c语言编程,众数问题
- java中try-catch-finally的使用
- 动态爬取链家二手房成交记录并保存至Excel
- 对话知名视觉艺术设计师走尺:只要用心 人人是插画师
- Selenium学习 - 简介
- 多线程使用场景及总结
- 基于UBAT工具的试验性应用
热门文章
- mysql查询每个用户第一条数据_MySQL数据库订单表按用户邮箱字段分组查询每个用户的第一条记录...
- 初入C++(二)类和对象,构造函数,析构函数
- html下拉嵌套只读,html组件不可输入(只读)同时任何组件都有效
- 【Flink】Flink 1.12.2 TaskSlotTable
- 【Elasticsearch】解决Elasticsearch HTTP方式查询报SocketTimeoutException的问题 Connection reset by peer
- 【Flink】Flink 1.9 升级 到 flink 1.12.4 报错 flink.client.cli.AbstractCustomCommandLine <init>
- 【java】java 扩展可回调的Future
- 【kafka】kafka rebalance generation
- ListView的性能优化之convertView和viewHolder
- 别乱用,这样打日志定位 Bug 又快又准!