自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(13)
  • 资源 (8)
  • 收藏
  • 关注

原创 VS2017编译jemalloc_win32_3.31

一、配置环境变量1.includeD:\Tools\Visual Studio 2017 Enterprise\VC\Tools\MSVC\14.10.25017\include;C:\Program Files (x86)\Windows Kits\10\Include\10.0.14393.0\ucrt\;D:\Tools\Microsoft Visual Studio 6\VC98\Incl...

2018-04-22 02:38:47 1217

原创 WSARecv在完成端口中的线程关联性

    发起WSARecv,WSASend,AcceptEx的线程在请求未完成前退出(也就是GetQueuedCompletionStatus还没返回的情况下退出),则请求取消,错误码995。    错误995很常见,请求未完成时,socket被关闭也是这个错误号,但由于请求发起线程退出而导致的995错误却很少见。一般server端都是在accept或acceptex返回之后投递第一个WSARec...

2018-04-11 19:50:46 1071

原创 IOCP应用中,有关内存释放的几个需要注意的地方

写文章最主要目的是备忘,以免一些好不容易想通的问题,被人体新陈代谢给清理出大脑,最后忘得一干二净,要是平常没个记录的好习惯会很心累。只不过再充分的准备,再自信满满,再运筹帷幄,也敌不过世事无常。昨天,我严格按照卸载的标准流程删除软件,没想到竟然把我D:\tools文件夹给整个端掉了,以前的记录文档,全没了。更苦的是,我并没有立即发现,而是又往D盘装了若干东西之后

2017-05-11 19:25:30 1716

原创 有关recv端数据流分割问题的一点思考

不管阻塞接收还是异步接收,总是绕不开数据流的分割问题。然而不知道什么原因,网上竟然很难找到现成、合用的代码,也许这种问题不值得付诸于代码,或者不太容易写出普遍通用的代码吧,但不论如何,轮到自己,个人觉得还是应该细致的做个总结。抛开一些复杂因素,有助于清晰思路,更容易找到解决问题的办法,所以决定从最简单、也相当富有代表性的阻塞套接字开始研究,省略掉一些对所涉问题关系不是很大的代码,保留关

2017-05-04 16:53:20 777

原创 IOCP5: shutdown,WSASendDisconnect,DisconnectEx

1.::shutdown(s,SD_SEND);表示禁止本地再发送数据到对端,并且,请求对方断开,如果对方不断开,本地套接字将处于FIN_WAIT_2状态,异步等待一段时间,时间到了之后,本地将主动断开连接,GetQueuedCompletionStatus将会返回,WSASend,WSARecv等函数的调用也都将失败,但socket资源并没有回收,仍需调用closesocket来释放套接字占

2013-02-01 07:02:14 2646 1

原创 保存一些下载地址

WindowsServer2003_SP1_SDK下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=15656

2013-01-31 21:31:50 603

原创 WSASend重叠post数据

开门见山,直接就事论事。 假如有这么一个基于IOCP模型的Server,这个Server提供的所有服务中有这么一种服务……文件下载,我们再假设Server端存有一个20G的文件,客户端这时发送一个请求到服务端来,客户端要求下载这个20G的文件,由此可能引发一系列让人头疼的问题(不谈TransmitFile,我们谈WSASend) 先给出一段伪代码,这段代码肯定是有问题的,如下:

2013-01-24 20:44:28 5171

原创 系统控制 屏蔽任务管理器

其实很简单,找到任务管理在系统目录的位置,调用CreateFile函数独占打开。 BOOL TaskManager_Hide(char *pszPath){ g_hTaskManager=::CreateFile(pszPath,GENERIC_READ,0,0,OPEN_EXISTING,0,NULL); if(g_hTaskManager==INVALID_HANDLE_V

2013-01-13 17:30:53 1007

原创 将 tcc 载入工程 编译脚本

tiny cc 编译器tcc是一个支持windows和linux环境的C语言编译器。它也可以将代码编译之后直接嵌入到进程中,这就具有脚本的相关特性了,但它却不是解释执行的。 tcc将C源码编译称机器码,然后分配一块内存,将机器码写在这块内存中,宿主进程可以调用源码中所定义的函数,源码也可以调用宿主进程提供的函数,交互还是相当灵活的。 我们可以将tcc源码编译称DLL(就直接

2013-01-13 17:19:59 5535

原创 class中封装回调函数 显式传递this指针

本文是用来凑数而已。因为本人实在讨厌某个数字,巧的是,本人在CSDN博客上发表的文章数量正好是某个数字,于是加一篇。 1.最简单的就是CreateThread#if !defined(AFX_TTHREAD_H__7222F1CA_7289_41A3_98A3_431B6044B3AE__INCLUDED_)#define AFX_TTHREAD_H__7222F1CA_7289_

2013-01-13 16:44:19 2432 2

原创 windows内存池 一线程分配 一线程释放 无锁 安全?

lock-free这种东西,我只要想想就能感到其复杂程度超出我的想象,但是呢,它又的的确确是好东西,于是就起了收集一套源码的念头(估计多数伸手党也就是这么产生的),还算幸运,找到一个库,简单测试一下,各种lock-free,各种高效。 好吧,打住,今天主打内存池。 写内存池的想法来自CSDN的一位博主,他的一篇文章:一度一写情况下,无锁队列如何实现,直接贴上链接:http://bl

2013-01-12 19:12:34 1540

原创 日志,IOCP中一些应该注意的小细节

1.OVERLAPPED结构需要在绑定时初始化一次,填充为02.在工作线程中调用printf会出现打印两次的情况,这个不算问题,主要是因为工程的C运行时库不是多线程版本,将工程设置为支持Multithreaded就行了。3.套接字资源回收的问题。对方如果断开了连接,也关闭了套接字,本地也检测到对方关闭了连接,但这并不意味着套接字资源已经释放掉了,还必须调用closesocket才能释放连接

2012-05-04 02:33:05 1203

转载 24,16,8,4位位图之间相互转换

//24,16,8,4位位图之间相互转换//lpDest:颜色数据,目标图//lpSrc:颜色数据,源图//dbits:目标颜色数//sbits:源颜色数//w:宽度//h:高度void ConvBitCount(BYTE *lpDest, BYTE *lpSrc, UINT dbits, UINT sbits, UINT w, UINT h){    BITM

2011-06-22 10:08:00 3158

服务器测试小工具

一个基于完成端口的测试工具。主要功能是发发数据包,测试服务器反应。数据包格式可以通过C语言脚本自行定义。 脚本最主要的工作就是组合数据,然后调用tcc_send函数发送,发送之后将发送的字节数返回即可

2018-04-20

VS2010绿色精简

无需设置环境变量

2017-06-05

服务器压力测试小工具

脚本使用简介: /******************************************************************************** void tcc_tell_user(long len,const char *fmt,...) void tcc_init_stochastic() int tcc_produce_stochastic(int a,int b) tcc_sscanf tcc_sprintf tcc_strcpy tcc_strcmp tcc_strstr tcc_strcat tcc_memcpy tcc_memcmp tcc_memset tcc_strlen tcc_malloc tcc_free *********************************************************************************/ void get_hex_string(unsigned char *in_dat,int in_len,char *ou_hex) { int i; char *t=(char*)tcc_malloc(8); ou_hex[0]=0; for(i=0;i<in_len;i++) { if(i%0x04==0 && i!=0) tcc_strcat(ou_hex," "); if(i%0x10==0 && i!=0) tcc_strcat(ou_hex,"\n"); tcc_sprintf(t,"X ",in_dat[i]); tcc_strcat(ou_hex,t); } tcc_free(t); } void msg_init() { // tcc_init_stochastic(); } void *msg_short_connect_form_data(long t,long s,long c,long *len) { char *data=(char*)tcc_malloc(128); *len=128; *(long*)(data+0x00)=128; *(long*)(data+0x04)=1; *(long*)(data+0x08)=0; *(long*)(data+0x0C)=0; int n=tcc_produce_stochastic(100,50000); tcc_sprintf(data+0x10,"hello%d",n); tcc_strcpy(data+0x20,"123456"); return data; } int msg_short_connect_recv_data(long s,long c,void *dat,long len) { unsigned char *ou_dat=(unsigned char*)tcc_malloc(5120); get_hex_string(dat,len,ou_dat); tcc_tell_user(5120,"s:%d c:%d len:%d\n%s\n\n",s,c,len,ou_dat); tcc_free(ou_dat); return 1; } void *msg_long_connect_form_data(long op,long s,long c,long *len) { char *data=(char*)tcc_malloc(128); *len=128; *(long*)(data+0x00)=128; *(long*)(data+0x04)=1; *(long*)(data+0x08)=0; *(long*)(data+0x0C)=0; int n=tcc_produce_stochastic(100,50000); tcc_sprintf(data+0x10,"hello%d",n); tcc_strcpy(data+0x20,"123456"); return data; } int msg_long_connect_recv_data(long s,long c,void *dat,long len) { unsigned char *ou_dat=(unsigned char*)tcc_malloc(5120); get_hex_string(dat,len,ou_dat); tcc_tell_user(5120,"s:%d c:%d len:%d\n%s\n\n",s,c,len,ou_dat); tcc_free(ou_dat); return 1; } void msg_free_data(void *arg) { tcc_free(arg); }

2013-02-08

iocp服务器客户端混合框架

//一个简单的使用例子 //连接远程服务器成功 或 接收到一个远程连接时,本函数将会被ioc.dll回调.在本函数中,应该向客户端列表中添加节点,记得加锁 // //2.s :套接字句柄,标志着一个新的连接 //3.u_addr:对端的IP地址,网络字节序 //4.u_port:对端的端口号,网络字节序 //5.flag :如果是本地连接上了一个远程服务器,flag值为0,或者,是接收到一个远程客户端的连接,这时,flag值为1 //6.返回值:返回一个自定义的值,这个值将在其他回调函数中作为参数传递(注意:就如套接字句柄一样,这个值也最 //好能标志一个连接,比如,客户端列表的某个节点的指针,假设用STL中的MAP来维护客户端列表,那么用KEY作为返回值也不错。) long _stdcall ioc_call_connect(HIOC hIoc,HINT s,long u_addr,long u_port,long flag) { long res=0; printf("socket(%d) connected\n",s); return res; } //断开与远程服务器的连接 或 远程客户端断开,本函数将会被ioc.dll回调.在本函数中,你可以删除客户节点,记得加锁 //s :套接字句柄,标志着哪个连接断开了(在本回调函数返回之前,套接字句柄s不可能被重新利用,所以,用s作为关键字构建客户端列表也是没有问题的) //res:ioc_call_connect回调函数返回的那个值,如果它是客户端列表的某个节点的话,那么可以删除了。 void _stdcall ioc_call_disconnect(HIOC hIoc,HINT s,long res,long flag) { printf("socket(%d) disconnected\n",s); } //当ioc内部一收到数据就会回调本函数,所谓数据有可能是多个数据包,也有可能是一个不完整的数据包 //hIoc,s,flag都不再多做解释 //res :ioc_call_oprate_dat和ioc_call_disconnect一定是被线性回调的,不可能存在同时执行的情况,所以,res如果指向某个节点的话,在本函数中可以不加锁地尽情访问,在本函数返回之前,res不会被释放掉 //hArg:数据调度句柄 //data:数据 //len :数据大小 //返回值:返回剩余未处理完的字节数 long _stdcall ioc_call_oprate_dat(HIOC hIoc,HARG hArg,HINT s,long res,long flag,char *data,long len) { //假如数据包格式是这样: //struct DATAPACK //{ // long size; long cmd; ...... //}; //如果是这样的话,那么典型的处理方法如下: char *p=data; long size_res=len;//收到数据的总字节数 long size_per;//其中某一个数据包的字节数 while(1) { if(size_res<4) return size_res;// size_per=*(long*)(p+0x00);//取数据包的实际长度 if(size_per<0 || size_per>某个最大值) { ::iocCommon_CloseSocket(hIoc,s); return 0; } if(size_res<size_per) return size_res;//剩余数据不够一个完整的数据包,返回 //得到一个完整的数据包,可以就地处理,但如果处理这个数据包将会很耗时,那么为了不阻塞工作线程, //只好将其调度给数据处理线程,这里其实可以定义一个结构,除了将数据包调度出去,还可以附带一些其他信息 if(数据包处理起来比较简单) { //处理 } else//调度给数据处理线程 { char *msg=(char*)::malloc(len); ::memcpy(msg,p,size_per); ::iocCommon_DispatchMessage(hIoc,hArg,msg);//hArg就只有这么一个作用 } p+=size_per; size_res-=size_per; } } //阻塞数据处理线程回调函数 void _stdcall ioc_call_oprate_msg(HIOC hIoc,void *msg) { //处理数据包 ::free(msg);//根据谁分配谁释放的原则,释放msg } int main() { ::iocCommon_Startup(); long addr_con=(long)ioc_call_connect; long addr_dis=(long)ioc_call_disconnect; long addr_dat=(long)ioc_call_oprate_dat; long addr_msg=(long)ioc_call_oprate_msg;//这个参数是可选的,可以不要专门的阻塞数据处理线程 HIOC hIoc=::iocCommon_Create(3072,128,addr_con,0,addr_dis,0,addr_dat,0,addr_msg,0);//创建IOC ::iocCommon_SetOprateThread(hIoc);//增加一个工作线程 ::iocCommon_SetOprateThread(hIoc);//增加一个工作线程 //启动服务器,内部循环调用阻塞的accept函数,ioc不考虑客户端连接服务器有多困难,而只考虑如何高效地进行数据传输 //可以再创建几个线程,多调用几个iocServer_Start,各个iocServer_Start绑定不同端口也可以 ::iocServer_Start(hIoc,NULL,6800); ::iocCommon_Cleanup(); return 0; }

2013-01-18

iocp 附例子 轻量

源码还在完善调整,暂时只上传dll,

2013-01-11

ngc游戏引擎 2D

ngc游戏引擎,支持中文,button,edit,list,tab... TILE地图,内含动画编辑器,地图编辑器,纹理打包

2011-07-12

ngc_d3d8动画编辑器源码

动画编辑器,测试ngc的gui.C语言版,源文件很少,很容易看懂

2011-06-19

ngc(hge修改版)

hge的C语言修改版.抛弃hge原有的gui,改gui为消息机制.

2011-06-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除