Posted by & filed under Uncategorized.

      微软在1997年正式推出Browser Helper Object (BHO), 使程序员能够更好的对IE进行二次开发和操作. 在通过编写BHO程序数月后, 我希望把我的一些经验告诉才开始的同志, 避免走一些弯路。 最近公司程序需要嵌入各个浏览器的插件。 首先需要支持的是IE的插件。又称为BHO(Browser Helper Object浏览器辅助对象).比起在C++中开发BHO,c#确实是更加简单,我的BHO主要为了实现通过点击浏览器有效下载链接,然后调用我们自己的程序(和迅雷差不多)BHO主体程序时UrlTrack类。而这个类我们需要从接口IObjectWithSite继承。 IObjectWithSite的源码比较简单     上述的GUID可以自己手动生成一个 另外主体程序UrlTrack类 Getsite Setsite---按自己需求给webBrowser添加各种事件来监控IE的事件,并触发   RegisterBHO---BHO加入到注册表的方法     UnregisterBHO--- Read more [...]

Posted by & filed under Uncategorized.

单播、组播、广播是计算机网络上三种基本的通信方式。     单播是相互感兴趣的主机双方进行通信的方式,主机不能接收对其不感兴趣的其它主机发送的信息,属于点对点通信。     广播是主机向子网内所有主机发送信息,子网内所有主机都能收到来自某台主机的广播信息,属于点对所有点的通信。     组播则介于两者之间,是主机向一组主机发送信息,存在于某个组的所有主机都可以接收到信息,属于点对多点通信。 下边用张图表示这三种方式的数据传输: 这张图可以简单看出来这三种方式的传输方式,下边来具体细分下。 首先说下单播与组播的区别: 单播即点对点的方式进行数据传输,组播类似与一个qq群,大家上线了别人都知道,另外一个人发送消息,该群里的人都能收到(抛开隐身、离线消息)。这里只是举例子,具体实现不是这样的,这里只是让大家更容易理解一些。下边看图理解: 图中如果要用单播实现多个发送则需要同时发送三条消息,而组播只需发送一条就可以完成了,所以说组播比较节省带宽。 接下来再说下组播与广播的区别吧: 组播跟广播类似,广播可以认为是组范围最大化的组播,广播是发送给所有人,而组播是发送给一个组中的人。当然,二者还是存在显著区别的:首先,广播被限制在子网内, 不会被路由器转发。其次,主机被默认为是接收者,组播方式则需要主机主动加入。另外广播的方式容易造成网络阻塞,几年前的广播风暴相信大家到现在都没有忘记。这里没找着合适的图,大家慢慢理解吧。 组播及广播由什么设备进行转发的? 组播及广播是由交换机进行转发的,如果是没有组播功能的交换机,则组播将会视为广播发送。路由器为具有路由功能的交换机,比交换机功能更强大些,所有说路由同样支持组播方式。现在的交换机都具备组播转发的功能,所以不用担心组播方式设备不支持的情况。下边上张组播交换机转发原理图: Read more [...]

Posted by & filed under Uncategorized.

      结构体的转换其实和基础类型数组转换差不多,只是结构体不能通过Marshal.Copy的方式直接转换到内存。 结构体痛byte数组的互转直接用于网络通信中还是非常方便的。 1、定义结构体 1 2 3 4 5 6 7 8 9 10 11 12 13 14 /// <summary>    /// 测试结构体的Copy    /// </summary>    public struct TestStruct    {        public string Number;        public int[] IntMember;        public byte ByteMember;        public short ShortMember;        public override  string ToString()        {            return string.Format("Number:" + Number + " ByteMember:" + ByteMember + " ShortMember:" + ShortMember Read more [...]

Posted by & filed under Uncategorized.

1、简介  C#专门提供了非托管内存操作的功能类System.Runtime.InteropServices.Marshal。做过C/C++互操作的朋友应该对这个类有所了解吧!   非托管内存使用的好处是方便,能够快速操作内存,在一些类型数据转换的时候能够减少运算量,提升运算速度;缺点就是会花费更多的内存,而且操作非托管内存很容易引起内存泄漏,所以使用的时候需要万分小心,在给程序员带来方便的同时,也会挖下一些隐藏的坑!  2、利用非托管内存转换基本类型数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 /// <summary> /// short数组转换成byte数组 /// </summary> /// <param name="source"></param> /// Read more [...]

Posted by & filed under Uncategorized.

转载于http://qianduanblog.com/post/jquery-getscript-1.html 目前做的主题,含有大量的js,以前是全部压缩到2个文件里的,两个文件都很大,在现代浏览器中运行毫无压力。但是,对于残疾的ie来说,那简直就是受罪。会随机出现以下状况: 1、js加载无任何错误,但就是没有特效。 2、js加载总是失败。 3、js加载过慢,导致用户失去耐心。 4、js加载过多,导致浏览器性能下降不少。 目前这款主题,是越做越杂了,超过了当时简洁的想法,几乎涵盖了所有能想到的内容。所以,在对待所有浏览器相同的待遇时,ie的表现让人蛋疼不已。所以有了以下几个方法: 1、屏蔽ie的部分特效。 2、异步加载js文件,用到该文件再加载,并且不重复加载。 目前已修改完毕,等待测试。 当然,这里主要讲的就是getScript方法,这个方法是$.ajax的高级方法,就像$.post,$.get一样是封装好的ajax特殊用法。getScript可以这么用: if($.fn.cookie)//这里以jquery-cookie.js插件为例 { Read more [...]

Posted by & filed under Uncategorized.

转载于http://qianduanblog.com/post/jquery-getscript-2.html 1、getScript方法介绍  Load a JavaScript file from the server using a GET HTTP request, then execute it. ——官方如是说 有两个特征,一是能够使用get的http请求服务器资源下载到本地,二是能够在加载完毕之后并执行这个脚本。它的深层次的写法是这样的: $.ajax({ url: url, dataType:"script", success: success }); getScript是它的高级用法,如get、post、getJSON差不多,都是基于ajax的运用和延伸。可以这么用: $.getScript("ajax/test.js",function(data, textStatus, jqxhr){ console.log(data);//data returned console.log(textStatus);//success console.log(jqxhr.status);//200 console.log('Load was performed.'); }); 完整使用方法是这样的: $.getScript("ajax/test.js") .done(function(script, Read more [...]

Posted by & filed under Uncategorized.

转载于http://qianduanblog.com/post/wordpress-simple-progress-bar.html 谷歌一下进度条,99%的内容都是这么说的,在页面头部写一个进度条移动到10%,然后在页面中部使进度条移动到50%,然后在页面尾部使进度条移动到100%,这么做看起来很完美很符合常理,但这么做有个弊端,因为图片的加载是异步加载的,有时候图片什么的没有加载完毕,进度条就已经100%了。所以判断进度条到100%就必须在页面所有元素全部载入之后才可以。 下面是我写的方法,只需要添加一处js就可以了,并且是在页面全部加载完毕之后才跳到100%的。许多朋友要我写进度条,不是我不想写,是因为之前有些错误,现在是已经修正了,所以就贴出来了。代码很少,部分地方已经注释了。 最后更新:2013年3月28日 Read more [...]

Posted by & filed under Uncategorized.

转载于http://qianduanblog.com/post/jquery-click-to-scroll-to-top.html 1、思路 DOM的每个标签以及浏览器本身都有一个scrollTop属性,这不是CSS可以控制的(目前),这个值指的是在一个指定的容器内当前可视顶部距离内容顶部的距离,如果这个容器是浏览器的话,那么滚动条的上边距就是这个值。 那么,如果想要回到顶部的话,设置scrollTop的值为0即可,滚动到指定位置也可以设置这个值为指定的数值。 设置scrollTop为0: $(window).scrollTop(0); 设置scrollTop为指定数值: var T=200;//这个是number类型,不需要带px $(window).scrollTop(T);  2、方法 如1设置的话,浏览器会在瞬间改变滚动条的位置,没有滚动的效果。如果要滚动的话,我们就需要慢慢的改变scrollTop的值就好。那么如何来做呢? 依照上面的经验,我们可能这么写: var Read more [...]

Posted by & filed under Uncategorized.

  转自:http://www.cnblogs.com/lamian/p/3971195.html 昨天笔试考了一道关于linux系统启动的过程,当时没答上来,现在整理出来(其实并不复杂)。 按下电源按钮的直到欢迎页出来之后,linux总共做的事可以分为五步来完成。 1、  BIOS加电自检: 加电自检,检测硬件设备。然后按照cmos上面的顺序来搜索处在活动状态下的可以引导的设备。可以是光驱、软盘、USB等。 2、  加载主引导加载程序(MBR): 主引导程序是一个512字节的映像。包含一点机器码还有一个小的分区。 主引导程序的任务就是查找并且加载处在硬盘分区上的次引导程序。通过分区表查找活动分区,并将处在活动分区的次引导加载程序读取到内存里面运行。 3、  Read more [...]

Posted by & filed under Uncategorized.

  转自:http://www.cppblog.com/killsound/archive/2009/01/16/72138.html 1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL)); 2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历 TIME_WAIT的过程: BOOL bDontLinger = FALSE; setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL)); 3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限: int nNetTimeout=1000;//1秒 //发送时限 setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int)); //接收时限 setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char Read more [...]