说明
名称[长度,单位:字节]


包结构
Header[10]: 包头
Body[21+?]: 包体




Header[10]
协议头[1]:       1字节长度,如0x07
协议版本[1]: 1字节长度,如0x01
Body长度[4]: 4字节长度的数字,即Body长度最大支持4G
保留[4]:

Body[25+?]
包类型[1]:       1字节长度,如请求包、响应包、其他包等,支持255种类型
命令类型[1]: 1字节长度,如Add、Remove、Get等,支持255种类型
编号[8]:       顺序号,每次+1
优先级[1]:       缓存数据失效优先级,优先级低的优先删除
有效时间[4]: 缓存数据有效时间,单位秒,=0为永久有效
Key长度[2]: 2字节长度的数字,即Key长度最长支持65535
Value长度[4]: 4字节长度的数字,即Value长度最长支持4G - 25
保留[4]:
Key: key内容
Value: value内容

posted @ 2009-09-14 09:33 dannyr|一个都不能少! 阅读(155) 评论(0) 编辑
由来:
前几天看DNT3的代码,看里面已经集成了访问memcache的功能,想想的确现在少.net平台上的类似缓存服务器软件,MS的Velocity估计还有一段时间,就大致了解了一下memcache的功能结构,一看和去年自己设计的tcp通讯框架有点类似,由于框架并发tcp在2-3k,及大量处理数据库数据,因此也涉及到了一些cache的功能和策略设计。倒是现在想来设计一套完整的类似memcache的系统。

系统结构
先期采用memcache不互相通信的分布式模式,每个Cache服务器存放内容由应用系统决定,即应用端需要设计一套Cache的存取定位策略。



功能设计



Cahce:
实际存放应用系统的缓存数据
使用byte[]数组存储

TCP通信:
采用二进制通信协议
协议说明

缓存策略:
过期时间算法
LRU算法
LFU算法


内存管理:
内存存取功能
内存清理机制
内存池管理

系统监控:

管理客户端:


版本计划
v0.1 结构设计、通信协议设计。
v0.2 基本功能实现,Cache先采用.net内置集合类。
v0.3实现缓存策略模块、内存管理模块
v0.4tcp通信模型采用.net3.5版本的异步模型,异步上下文采用缓存池(以前使用2.0的,有内存碎片,在1.1下会OutOfMemory) 。
v0.5扩展内存管理功能,Cache采用缓存池技术,及碎片整理功能。
posted @ 2009-09-11 10:06 dannyr|一个都不能少! 阅读(444) 评论(2) 编辑
Net1.1没有专门封装好的WIN32管理类(2.0就方便多了),分享一下目录共享及权限的方法(网上找了许多都是文不对题的)



权限定义:
[Flags]
   public enum AccessPrivileges : uint{
   FILE_READ_DATA = 0x00000001,
   FILE_WRITE_DATA = 0x00000002,
   FILE_APPEND_DATA = 0x00000004,
   FILE_READ_EA = 0x00000008,
   FILE_WRITE_EA = 0x00000010,
   FILE_EXECUTE = 0x00000020,
   FILE_DELETE_CHILD = 0x00000040,
   FILE_READ_ATTRIBUTES = 0x00000080,
   FILE_WRITE_ATTRIBUTES  = 0x00000100,

   DELETE = 0x00010000,
   READ_CONTROL = 0x00020000,
   WRITE_DAC = 0x00040000,
   WRITE_OWNER = 0x00080000,
   SYNCHRONIZE = 0x00100000,

   ACCESS_SYSTEM_SECURITY = 0x01000000,
   MAXIMUM_ALLOWED = 0x02000000,
   
   GENERIC_ALL = 0x10000000,
   GENERIC_EXECUTE= 0x20000000,
   GENERIC_WRITE = 0x40000000,
   GENERIC_READ = 0x80000000
  }


  [Flags]
   enum AceFlags : uint{
   NonInheritAce = 0,
   ObjectInheritAce = 1,
   ContainerInheritAce = 2,
   NoPropagateInheritAce = 4,
   InheritOnlyAce = 8,
   InheritedAce = 16
  }

  [Flags]
   enum AceType : uint{
   AccessAllowed = 0,
   AccessDenied = 1,
   Audit = 2
  }


流程:

//设置Everyone用户,可以选择其他用户或新建用户
   ManagementClass trustee = new ManagementClass("Win32_Trustee");
   trustee.Properties["Name"].Value = "Everyone";
   trustee.Properties["Domain"].Value = null;
   trustee.Properties["SID"].Value = new byte[]{1,1,0,0,0,0,0,1,0,0,0,0};

//设置只读/运行权限
   ManagementClass ace = new ManagementClass("Win32_ACE");
   ace.Properties["AccessMask"].Value = AccessPrivileges.GENERIC_READ
    | AccessPrivileges.FILE_READ_DATA | AccessPrivileges.FILE_READ_ATTRIBUTES | AccessPrivileges.FILE_READ_EA
    | AccessPrivileges.READ_CONTROL | AccessPrivileges.FILE_EXECUTE;
   ace.Properties["AceFlags"].Value = 3;//AceFlags.ObjectInheritAce | AceFlags.ContainerInheritAce ;
   ace.Properties["AceType"].Value = 0;//AceType.AccessAllowed;
   ace.Properties["Trustee"].Value = trustee;

//修改ACL设置
   ManagementObject secDescriptor = new ManagementClass("Win32_SecurityDescriptor");
   secDescriptor["ControlFlags"] = 4;
   secDescriptor["DACL"] = new ManagementObject[] { ace };


   //设置添加共享
   ManagementClass mc = new ManagementClass("win32_share");
   ManagementBaseObject inParams = mc.GetMethodParameters("Create");
   inParams["Path"] = "f:\\dannyr";
   inParams["Name"] = "share of dannyr";
   inParams["Type"] = 0x0;
   inParams["MaximumAllowed"] = null;      //=null 则用户数连接无限制
   inParams["Description"] = null;
   inParams["Password"] = null;
   inParams["Access"] = secDescriptor;  //=null 则使Everyone拥有完全控制权限

   ManagementBaseObject outParams = mc.InvokeMethod("Create", inParams, null);
   uint returnValue = (uint)outParams.Properties["ReturnValue"].Value;
   string ErrorMessage = null;
   switch (returnValue)
   {
    case 0: //Success
     break;
    case 2: //Access denied
     ErrorMessage = "无权访问";
     break;
    case 8: //Unknown failure
     ErrorMessage = "未知错误";
     break;
    case 9: //Invalid name
     ErrorMessage = "非法的共享名";
     break;
    case 10: //Invalid level
     ErrorMessage = "非法的层次";
     break;
    case 21: //Invalid parameter
     ErrorMessage = "非法的参数";
     break;
    case 22: //Duplicate share
     ErrorMessage = "重复共享";
     break;
    case 23: //Redirected path
     ErrorMessage = "重定向路径";
     break;
    case 24: //Unknown device or directory
     ErrorMessage = "未知的目录";
     break;
    case 25: //Net name not found
     ErrorMessage = "网络名不存在";
     break;
    default:
     break;
   }

posted @ 2008-06-20 17:03 dannyr|一个都不能少! 阅读(1864) 评论(1) 编辑
Access数据库对于文本和备注类型的数据类型定义(DATA_TYPE)都是为130,无法直接区分,找了N多网页,包括MSDN都没有描述有关COLUMN_FLAGS的说明,还是自己分析一下:

    COLUMN_FLAGS为64位(8字节)的十六进制的值,组合了数据类型和必填字段等信息

其中最后2个字节有效,最后一个字节一直为0x0A,有变化的是最后第二个字节,即:
    对于文本类型的为0x00;备注类型为0x80;
    对于非必填字段为0x40;必填字段为0x60

组合后:
   文本必填:  0x6A
   文本非必填:0x4A
   备注必填:  0xEA
   备注非必填:0xCA
   
最后可以得到COLUMN_FLAGS右移7位后可以区分文本类型和备注类型


DataTable dt = m_OLEDBCon.GetOleDbSchemaTable(
    OleDbSchemaGuid.Columns,
    new object[] {null, null, "表名称", null});

DataRow[] drs = dt.Select("COLUMN_NAME='字段名称'");
if(drs.Length > 0 && Convert.ToInt32(drs[0]["DATA_TYPE"]) == 130) {
    //文本类型
    if ( (Convert.ToInt64(drs[0]["COLUMN_FLAGS"]) >> 7) == 1){
        //=1为备注字段       
    }else{
        //=0为文本字段
    }
}
posted @ 2008-05-22 10:10 dannyr|一个都不能少! 阅读(2277) 评论(4) 编辑

灰色
posted @ 2008-05-19 09:34 dannyr|一个都不能少! 阅读(283) 评论(0) 编辑
摘要: 下面的代码是可以执行,大家都来说说为什么这个程序不会自动退出?也就是说mian函数执行完毕后,为什么.net不会释放ThreadEx对象?usingSystem;usingSystem.Threading;publicclassThreadEx:IDisposable{privateThreadthread;privatevolatileboolbExit;publicThreadEx(){Con...阅读全文
posted @ 2007-09-28 16:42 dannyr|一个都不能少! 阅读(3411) 评论(16) 编辑
摘要: As is known,in many advanced programming languages(esp. object oriented ones) like c/c++,c#,Java,etc., the function is only one of the programming syntax constructs,unlike that in some pure interprete...阅读全文
posted @ 2007-09-15 08:03 dannyr|一个都不能少! 阅读(419) 评论(0) 编辑
摘要: //GridView属性设置:GridView.OptionsView.GroupDrawMode=GroupDrawMode.Office2003;GridView.OptionsView.ShowVertLines=true;//GridColumn分组列属性设置:GridColumn.GroupIndex=0;GridColumn.GroupInterval=ColumnGroupInter...阅读全文
posted @ 2007-08-06 13:27 dannyr|一个都不能少! 阅读(1261) 评论(5) 编辑
摘要: frm.MdiParent=this;//frm.WindowState=FormWindowState.Maximized;frm.Dock=DockStyle.Fill;//设置为ChildForm和MainForm一起拉伸frm.FormBorderStyle=FormBorderStyle.None;this.Client_Event+=newMessage_Event(frm.OnCli...阅读全文
posted @ 2007-07-27 15:06 dannyr|一个都不能少! 阅读(1118) 评论(0) 编辑
摘要: DevExpress.XtraEditors.ComboBoxEdit下拉框是否允许输入Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor阅读全文
posted @ 2007-07-24 11:43 dannyr|一个都不能少! 阅读(386) 评论(0) 编辑