资源简介
这个工程是基于TCP长连接的包模式的网络通讯框架。
在TCP连接中,按照一个一个的包方式进行数据传输,
框架实现了可以同时侦听多个端口,
每个数据包既可以不压缩传输,也能支持zlib压缩和blowfish加密传输。
服务端提供三种线程池来进行tcp连接处理,
一类是接收线程池,接收线程池获取每个socket传输来的数据包,
同时保证每个socket的包按照到来的顺序进行处理,
二类是工作线程池,由接收线程池把接收到的数据包投递到工作线程池,
工作线程池专门处理这些接收到的数据包。
三类是发送线程池,当工作线程池处理完这些数据包,确定需要发送处理结果数据包到客户端,
或者其他线程需要发送数据包到客户端,他们首先把数据包投递到发送线程池,
发送线程池专门负责数据包的发送。
框架同时提供了每个客户端的定时器功能,在服务端内部各个socket之间数据通信等。
框架来源于一个没做完的手游服务端,至于没有使用现成的游戏通讯框架而自己实现,
主要是因为习惯了自己造轮子。
因为项目没做完,所有没进行严格的测试,无法保证代码无BUG。
您若要使用到自己的项目中,请完全熟悉了之后再用,这样出现BUG也好自己修改。
框架支持 Linux和windows平台。
相关BLOG请看如下连接:
http://blog.csdn.net/fanxiushu/article/details/50631626
代码片段和文件信息
///// By Fanxiushu 2015-10-15 用于服务端接管内存分配释放
#include “common.h“
#include “base_buffer.h“
int base_buffer::header_length = (int)(int64_t)(&((base_buffer*)0)->buffer[0]);
///////
struct BUF_SOLT
{
int alloc_size; /// 分配的大小 64128 256 512 1K 4K 8K 16K 32K 64K
LIST_ENTRY head; ///
spin_lock_t lock; ///
long buf_count; ///
////////
BUF_SOLT( int alloc_size ){
/////
InitializeListHead(&head);
spin_lock_init(lock);
this->alloc_size = alloc_size;
this->buf_count = 0;
////////
// printf(“ALLOC_SIZE=%d\n“ alloc_size ); /////
}
//////////////
~BUF_SOLT(){
spin_lock_deinit(lock); ////
/////
}
/////////////////
};
static struct BUF_SOLT buf_solt[] =
{
BUF_SOLT(32)
BUF_SOLT(64)
BUF_SOLT(128)
BUF_SOLT(256)
BUF_SOLT(512)
BUF_SOLT(1024)
BUF_SOLT(4096)
BUF_SOLT(8192)
BUF_SOLT(16*1024)
BUF_SOLT(32*1024)
BUF_SOLT(64*1024)
BUF_SOLT(128*1024)
};
/////
#define BUF_SOLT_COUNT ( sizeof(buf_solt) / sizeof(buf_solt[0]) )
base_buffer* alloc_buffer(int size)
{
if (size <= 0) return NULL;
////
int alloc_size = 0;
int left_size = 0;
BUF_SOLT* solt = NULL;
base_buffer* base_buf = NULL; ////
for ( int i = 0; i < BUF_SOLT_COUNT; ++i ){
BUF_SOLT* s = &buf_solt[i];
if ( size > left_size && size <= s->alloc_size ){
solt = s;
break;
}
left_size = s->alloc_size; /// ///
////
}
if (solt){
////
alloc_size = solt->alloc_size;
spin_lock( solt->lock );
if (!IsListEmpty(&solt->head)){
PLIST_ENTRY entry = RemoveHeadList(&solt->head); /////
--solt->buf_count;
base_buf = CONTAINING_RECORD(entry base_buffer list); /////
}
spin_unlock( solt->lock );
}
else{
alloc_size = ((size + 7) / 8) * 8; /// 8 的倍数
}
if (base_buf){
// printf(“** ALLOC Buffer from POOL. raw_size=%d alloc_size=%d\n“ size base_buf->alloc_size );
base_buf->data_size = 0;
return base_buf;
}
int sz = base_buffer::header_length + alloc_size;
base_buffer* buf = (base_buffer*)malloc(sz);
InitializeListHead(&buf->list);
buf->alloc_size = alloc_size;
buf->data_size = 0;
return buf;
}
void free_buffer(base_buffer* buf)
{
if (!buf) return;
for (int i = 0; i < BUF_SOLT_COUNT; ++i){
BUF_SOLT* s = &buf_solt[i];
if (s->alloc_size == buf->alloc_size){
// printf(“*** free buffer to POOL.\n“); ///
spin_lock( s->lock);
InsertTailList(&s->head &buf->list); /////
++s->buf_count;
spin_unlock( s->lock );
return;
}
///////
}
//////
printf(“*** Direct FREE BUFFER.\n“);
free(buf); ////
}
/////////////////
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 967 2016-01-31 21:58 ba
..A..H. 44544 2016-01-31 22:22 ba
文件 5499 2015-10-19 17:48 ba
文件 3343 2015-10-19 17:48 ba
文件 2762 2015-10-20 16:20 ba
文件 477 2015-10-19 17:22 ba
文件 17596 2015-10-23 17:20 ba
文件 3822 2016-01-31 22:00 ba
文件 9633 2015-10-19 17:42 ba
文件 7653 2015-10-20 16:16 ba
文件 6417 2015-12-31 00:30 ba
文件 1264 2015-10-21 13:59 ba
文件 2377 2015-10-20 16:22 ba
文件 1321 2016-01-31 21:55 ba
..A..H. 89088 2015-12-31 03:08 ba
..A..H. 71680 2016-02-03 23:46 ba
文件 9594 2016-01-31 21:51 ba
文件 4164 2015-10-20 14:21 ba
文件 165 2015-10-12 15:36 ba
文件 764 2015-10-20 16:47 ba
文件 2439 2016-02-03 22:50 ba
文件 2837 2015-11-22 01:00 ba
文件 477 2015-10-19 17:22 ba
文件 29329 2016-01-31 22:48 ba
文件 10539 2016-02-03 22:55 ba
文件 17503 2015-10-20 16:56 ba
文件 28433 2015-11-03 11:22 ba
文件 7526 2015-02-13 18:53 ba
文件 9633 2015-10-19 17:42 ba
文件 7672 2015-10-23 13:51 ba
............此处省略44个文件信息
- 上一篇:应用迁移到中标麒麟系统详解
- 下一篇:windows平台抓屏源代码
评论
共有 条评论