JINSON's Note

JINSON的计算机学习笔记

 
· 所有网志 (17) · DotNet (6) · ASP (1) · HTML (1) · IIS (1) · SQL Server (2) · Windows (2) · VPN (2) · 未分类 (2) ·
日历
最新的评论
站内搜索
友情链接
· 我的歪酷 非非共享界

订阅 RSS

0004815

歪酷博客

JINSON @ 2008-04-15 16:36

一、框架页的刷新
1.Response.Write( "<script>parent.frames('mainFrame').document.location.reload();</script>");

二、框架页的跳转
1.Response.Write( "<script>parent.frames('mainFrame').document.location.href('right.aspx');</script>");
2.Response.Write( "<script>parent.frames('mainFrame').document.location.assign('right.aspx');</script>");

三、其他页面跳转
1.Response.Write("<script>window.navigate('right.aspx');</script>");
2.Response.Write("<script>self.location='right.aspx';</script>");
3.Response.Write("<script>window.navigate('right.aspx');</script>");
4.Response.Redirect("main.aspx");



 
JINSON @ 2008-01-30 16:04

    Windows Server 2003 是在可靠的 Windows 2000 Server 系列的基础上生成的,它集成了功能强大的应用程序环境以开发全新的 XML Web 服务和改进的应用程序,这些程序将会显著提高进程效率。下面这些主要的新增功能和改进是为考虑从 Windows 2000 Server 升级到 Windows Server 2003 的单位提供的。

1、Active Directory 改进

  在 Windows 2000 引入的 Microsoft Active Directory®服务简化了复杂网络目录的管理,并使用户即使在最大的网络上也能够很容易地查找资源。此企业级目录服务是可扩展的,完全是基于 Internet 标准技术创建的,并与 Windows .NET Server 2003 标准版、Windows .NET Server 2003 企业版和 Windows .NET Server 2003 Datacenter 版中的操作系统完全集成。

  Windows Server 2003 为 Active Directory 提供许多简捷易用的改进和新增功能,包括跨森林信任、重命名域的功能以及使架构中的属性和类别禁用,以便能够更改其定义的功能。

2、组策略管理控制台

  管理员可以使用组策略定义设置以及允许用户和计算机执行的操作。与本地策略相比,企业用户可以使用组策略在 Active Directory 中设置应用于指定站点、域或组织单位的策略。基于策略的管理简化了系统更新操作、应用程序安装、用户配置文件和桌面系统锁定等任务。

  组策略管理控制台 (GPMC) 预计可作为 Windows Server 2003 的附加程序组件使用,它为管理组策略提供了新的框架。有了 GPMC,组策略使用起来将更简单,此优势将使更多的企业用户能够更好地使用 Active Directory 并利用其强大的管理功能。

3、策略结果集

  策略结果集 (RSoP) 工具允许管理员查看目标用户或计算机上的组策略效果。有了 RSoP,企业用户将具有强大灵活的基本工具来计划、监控组策略和解决组策略问题。

  RSoP 是以一组 Microsoft 管理控制台 (MMC) 管理单元的形式提供的结构。这些管理单元让管理员以两种模式确定并分析当前的策略集:登录模式和计划模式。在登录模式中,管理员可以访问已应用到特定目标的信息。在计划模式中,管理员可以看到策略将如何应用到目标,然后在部署组策略的更改之前进行检查其结果。

4、卷影子副本恢复

  作为卷影子副本服务的一部分,此功能使管理员能够在不中断服务的情况下配置关键数据卷的即时点副本。然后可使用这些副本进行服务还原或存档。用户可以检索他们文档的存档版本,服务器上保存的这些版本是不可见的。

5、Internet Information Services 6.0

  Internet Information Services (IIS) 6.0 是启用了 Web 应用程序和 XML Web 服务的全功能的 Web 服务器。IIS 6.0 是使用新的容错进程模型完全重新搭建的,此模型很大程度上提高了 Web 站点和应用程序的可靠性。

  现在,IIS 可以将单个的 Web 应用程序或多个站点分隔到一个独立的进程(称为应用程序池)中,该进程与操作系统内核直接通信。当在服务器上提供更多的活动空间时,此功能将增加吞吐量和应用程序的容量,从而有效地降低硬件需求。这些独立的应用程序池将阻止某个应用程序或站点破坏服务器上的 XML Web 服务或其他 Web 应用程序。

  IIS 还提供状态监视功能以发现、恢复和防止 Web 应用程序故障。在 Windows Server 2003 上,Microsoft ASP.NET 本地使用新的 IIS 进程模型。这些高级应用程序状态和检测功能也可用于现有的在 Internet Information Server 4.0 和 IIS 5.0 下运行的应用程序,其中大多数应用程序不需要任何修改。

6、集成的 .NET 框架

  Microsoft .NET 框架是用于生成、部署和运行 Web 应用程序、智能客户应用程序和 XML Web 服务的 Microsoft .NET 连接的软件和技术的编程模型,这些应用程序和服务使用标准协议(例如 SOAP、XML 和 HTTP)在网络上以编程的方式公开它们的功能。

  .NET 框架为将现有的投资与新一代应用程序和服务集成起来而提供了高效率的基于标准的环境。

  另外,它帮助企业用户解决部署和操作 Internet 范围的应用程序所遇到的问题。

  有了完全集成在 Windows Server 2003 操作系统内的 .NET 框架,开发人员可以从编写“管道”代码中解放出来,从而可以将他们的精力集中在实现真正的商业价值方面。.NET 框架兼顾了集成和管理细节,降低了编码复杂性并增加了一致性。


7、命令行管理

  Windows Server 2003 系列的命令行结构得到了显著增强,使管理员无须使用图形用户界面就能执行绝大多数的管理任务。最重要的是通过使用 Windows 管理规范 (WMI) 启用的信息存储来执行大多数任务的功能。此 WMI 命令行 (WMIC) 功能提供简单的命令行界面,与现有的外壳程序和实用工具命令交互操作,并可以很容易地被脚本或其他面向管理的应用程序扩展。

  总之,Windows Server 2003 系列中更强大的命令行功能与现成的脚本相结合,可与其他通常具有更高所有权成本的操作系统的功能相抗衡。习惯使用命令行管理 UNIX 或 Linux 系统的管理员可以继续从 Windows Server 2003 系列中的命令行进行管理。

8、集群(8 节点支持)

  此服务仅用于 Windows Server 2003 企业版和 Windows Server 2003 Datacenter 版,它为任务关键型应用程序(例如数据库、消息系统以及文件和打印服务)提供高可用性和伸缩性。通过启用多服务器(节点)集中工作从而保持一致通讯。如果由于错误或维修使得集群中的某个节点不可用,另一个节点将立即开始提供服务,此过程称为故障转移。正在访问该服务的用户将继续他们的活动,而不会察觉到该服务现在是由另一台服务器(节点)提供。

  Windows Server 2003 企业版和 Windows Server 2003 Datacenter 版都支持多达 8 个节点的服务器集群配置。

9、安全的无线 LAN (802.1X)

  根据 Windows Server 2003 系列对 802.1X 的支持,公司可以寻求一种安全模型,该模型将确保所有物理访问都是已授权和加密的。使用基于 802.1X 的无线访问点或选项,公司可以确保只有受信任的系统才能与受保护的网络连接并交换数据包。因为是由 802.1X 决定动态密钥,因此通过解决与有线设备隐私 (WEP)(由 IEEE 802.11 网络使用)相关联的许多已知问题将会显著改善 802.1X 无线网络加密。

  此功能为无线局域网 (LAN) 提供了安全和性能方面的改进,如访问 LAN 之前的自动密钥管理、用户身份验证和授权。当有线以太网在公共场所使用时,它还提供对以太网络的访问控制。

10、紧急管理服务: 无外设服务器支持

  “无外设服务器”功能使 IT 管理员在没有监视器、VGA 显示适配器、键盘或鼠标的情况下也能安装和管理计算机。紧急管理服务是一种新增功能,它使 IT 管理员在无法使用服务器时通过网络或其他标准的远程管理工具和机制,执行远程管理和系统恢复任务。




 
JINSON @ 2008-01-30 09:45

Visual Studio 2003/Visual Studio 2005常用快捷键(快捷方式)

调试快捷键

F6: 生成解决方案
Ctrl+F6: 生成当前项目
F7: 查看代码
Shift+F7: 查看窗体设计器
F5: 启动调试
Ctrl+F5: 开始执行(不调试)
Shift+F5: 停止调试
Ctrl+Shift+F5: 重启调试
F9: 切换断点
Ctrl+F9: 启用/停止断点
Ctrl+Shift+F9: 删除全部断点
F10: 逐过程
Ctrl+F10: 运行到光标处
F11: 逐语句

编辑快捷键

Shift+Alt+Enter: 切换全屏编辑
Ctrl+B,T / Ctrl+K,K: 切换书签开关
Ctrl+B,N / Ctrl+K,N: 移动到下一书签
Ctrl+B,P: 移动到上一书签
Ctrl+B,C: 清除全部标签

Ctrl+I: 渐进式搜索
Ctrl+Shift+I: 反向渐进式搜索
Ctrl+F: 查找
Ctrl+Shift+F: 在文件中查找
F3: 查找下一个
Shift+F3: 查找上一个
Ctrl+H: 替换
Ctrl+Shift+H: 在文件中替换
Alt+F12: 查找符号(列出所有查找结果)
Ctrl+Shift+V: 剪贴板循环

Ctrl+左右箭头键: 一次可以移动一个单词
Ctrl+上下箭头键: 滚动代码屏幕,但不移动光标位置。
Ctrl+Shift+L: 删除当前行
Ctrl+M,M: 隐藏或展开当前嵌套的折叠状态
Ctrl+M,L: 将所有过程设置为相同的隐藏或展开状态
Ctrl+M,P: 停止大纲显示
Ctrl+E,S: 查看空白
Ctrl+E,W: 自动换行
Ctrl+G: 转到指定行
Shift+Alt+箭头键: 选择矩形文本
Alt+鼠标左按钮: 选择矩形文本
Ctrl+Shift+U: 全部变为大写
Ctrl+U: 全部变为小写

代码快捷键

Ctrl+J / Ctrl+K,L: 列出成员
Ctrl+Shift+空格键 / Ctrl+K,P: 参数信息
Ctrl+K,I: 快速信息
Ctrl+E,C / Ctrl+K,C: 注释选定内容
Ctrl+E,U / Ctrl+K,U: 取消选定注释内容

Ctrl+K,M: 生成方法存根
Ctrl+K,X: 插入代码段
Ctrl+K,S: 插入外侧代码

F12: 转到所调用过程或变量的定义

窗口快捷键

Ctrl+W,W: 浏览器窗口
Ctrl+W,S: 解决方案管理器
Ctrl+W,C: 类视图
Ctrl+W,E: 错误列表
Ctrl+W,O: 输出视图
Ctrl+W,P: 属性窗口
Ctrl+W,T: 任务列表
Ctrl+W,X: 工具箱
Ctrl+W,B: 书签窗口
Ctrl+W,U: 文档大纲

Ctrl+D,B: 断点窗口
Ctrl+D,I: 即时窗口
Ctrl+Tab: 活动窗体切换
Ctrl+Shift+N: 新建项目
Ctrl+Shift+O: 打开项目
Ctrl+Shift+S: 全部保存
Shift+Alt+C: 新建类
Ctrl+Shift+A: 新建项

 




 
JINSON @ 2008-01-30 09:42

Response.Redirect能够传递的数据最大为2KB,而Server.Transfer则没有这个限制。所以在页面之间传递大量复杂数据的时候,可以用Server.Transfer。

这种方法是在代码隐藏类中声明属性和变量,然后在新网页中用Context.Handler对象获取这些属性或变量的值。

下面举个简单的例子。

源页面中包含以下代码:
public string P1
{get{return TextBox1.Text;}}
public string P2
{get{return TextBox2.Text;}}
然后调用Server.Transfer方法

Server.Transfer("object.aspx");
目标页面包含以下代码:
SourceForm1 f1;
f1=(SourceForm1)Context.Handler;
Label1.Text=f1.P1;
Label2.Text=f1.P2;




 
JINSON @ 2008-01-28 10:32

点对点即Peer-To-Peer,通常简写为P2P。所谓网络中的点对点,其实可以看成是一种对等的网络模型。P2P其实是实现网络上不同计算机之间,不经过中继设备直接交换数据或服务的一种技术。P2P由于允许网络中任一台计算机可以直接连接到网络中其他计算机,并与之进行数据交换,这样既消除了中间环节,也使得网络上的沟通变得更容易、更直接。

  P2P作为一种网络的模型,它有别于传统的客户/服务器模型。客户/服务器模型一般都有预定义的客户机和服务器。而在P2P模型转并没有明确的客户端和服务器,但其实在P2P模型中,每一台计算机既可以看成是服务器,也可以看成是客户机。在网络中,传统上的客户机/服务器通讯模型中,发送服务请求或者发送数据的计算机,一般称为客户机;而接收、处理服务或接收数据的计算机称为服务器。而在P2P网络模型中,计算机不仅接收数据,还有发送数据,不仅提出服务请求,还有接收对方的服务请求。

  在下面介绍的用Visual C#实现的局域网点对点通讯程序,就有如下特点,在网络利用此通讯程序进行通讯的任一计算机,在通讯之前,都需要侦听端口号,接受其他机器的连接申请,并在连接建立后,就可以接收对方发送来的数据;同时也可以向其他机器提出连接申请,并在对方计算机允许建立连接请求后,发送数据到对方。可见在网络中利用此软件进行P2P网络通讯的任一计算机既是客户机,同样也是服务器。

一.程序的设计、调试、运行的软件环境:

(1).微软公司视窗2000服务器版

(2).Visual Studio .Net正式版,.Net FrameWork SDK版本号3705

二.关键步骤及其解决方法: 关键步骤就是实现信息在网络中的发送和接收。数据接收使用的是Socket,数据发送使用的是NetworkStream。

1.利用Socket来接收信息:

  为了更清楚的说明问题,程序在处理数据发送和接收时采用了不通的端口号,发送数据程序在缺省状态设定的端口号为"8889"。下面代码是侦听端口号"8889",接受网络中对此端口号的连接请求,并在建立连接后,通过Socket接收远程计算机发送来的数据:

try
{
TcpListener tlListen1 = new TcpListener ( 8889 ) ;
//侦听端口号
tlListen1.Start ( ) ;
Socket skSocket = tlListen1.AcceptSocket ( );
//接受远程计算机的连接请求,并获得用以接收数据的Socket实例
EndPoint tempRemoteEP = skSocket.RemoteEndPoint;
//获得远程计算机对应的网络远程终结点
while (true)
{
Byte [] byStream = new Byte[80];
//定义从远程计算机接收到数据存放的数据缓冲区
int i = skSocket.ReceiveFrom(byStream,ref tempRemoteEP);
//接收数据,并存放到定义的缓冲区中
string sMessage = System.Text.Encoding.UTF8.GetString(byStream);
//以指定的编码,从缓冲区中解析出内容
MessageBox.Show ( sMessage );
//显示传送来的数据
}
}
catch ( System.Security.SecurityException )
{
MessageBox.Show ( "防火墙安全错误!","错误",
MessageBoxButtons.OK , MessageBoxIcon.Exclamation);
}

 

2.利用NetworkStream来传送信息:

  在使用StreamWriter处理NetworkStream传送数据时,数据传送的编码类型是"UTF8",下列代码是对IP地址为"10.138.198.213"的计算机的"8888"端口号提出连接申请,并在连接申请建立后,以UTF8编码发送字符串"您好,见到您很高兴"到对方,由于下列代码中的注释比较详细,这里就不具体介绍了,下列代码也是使用NetworkStream传送数据的典型代码:

try
{
TcpClient tcpc = new TcpClient ("10.138.198.213",8888);
//对IP地址为"10.138.198.213"的计算机的8888端口提出连接申请
NetworkStream tcpStream = tcpc.GetStream ( );
//如果连接申请建立,则获得用以传送数据的数据流
}
catch ( Exception )
{
MessageBox.Show ( "目标计算机拒绝连接请求!" ) ;
break ;
}
try
{
string sMsg = "您好,见到您很高兴" ;
StreamWriter reqStreamW = new StreamWriter (tcpStream);
//以特定的编码往向数据流中写入数据 ,默认为UTF8编码
reqStreamW.Write (sMsg);
//将字符串写入数据流中
reqStreamW.Flush ( );
//清理当前编写器的所有缓冲区,并使所有缓冲数据写入基础流
}
catch(Exception)
{
MessageBox.Show ("无法发送信息到目标计算机!") ;
}

 

  当然在具体用Visual C#实现网络点对点通讯程序时,还必须掌握很多其他方面的知识,如资源的回收。在用Visual C#编写网络应用程序的时候,很多朋友遇到这样的情况。当程序退出后,通过Windows的"资源管理器"看到的是进程数目并没有减少。这是因为程序中使用的线程可能并没有有效退出。虽然Thread类中提供了"Abort"方法用以中止进程,但并不能够保证成功退出。因为进程中使用的某些资源并没有回收。在某些情况下垃圾回收器也不能保证完全的回收资源,还是需要我们自己手动回收资源的。在本文介绍的程序中也涉及到资源手动回收的问题。实现方法可参阅下面具体实现步骤中的第十二步。

三.具体步骤:

  在了解、掌握了上面的关键问题及其解决方法后,再实现用Visual C#实现网络点对点通讯程序相对就容易许多,下面是具体的实现步骤:

1.启动Visual Studio .Net,并新建一个Visual C#项目,名称为【Visual C#实现网络点对点通讯程序】。

2.在Visual Studio .Net集成开发环境中的【解决方案资源管理器】窗口中,双击Form1.cs文件,进入Form1.cs文件的编辑界面。

3.在Form1.cs文件的开头,用下列导入命名空间代码替代系统缺省的导入命名空间代码。

using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
using System.Net.Sockets ;
using System.Net ;
using System.IO ;
using System.Text ;
using System.Threading ;

 

4.再把Visual Studio.Net的当前窗口切换到【Form1.cs(设计)】窗口,并从【工具箱】中的【Windows窗体组件】选项卡中往窗体中拖入下列组件:

四个Button组件;二个ListBox组件;四个TextBox组件;一个StatusBar组件;五个Label组件。并在四个Button组件拖入窗体后,分别在窗体设计界面中双击它们,则系统会在Form1.cs文件中分别产生这四个组件的Click事件对应的处理代码。

5.在【解决方案资源管理器】窗口中,双击Form1.cs文件,进入Form1.cs文件的编辑界面。以下面代码替代系统产生的InitializeComponent过程。下面代码是对上面添加的组件进行初始化:

private void InitializeComponent ( )
{
this.listBox1 = new System.Windows.Forms.ListBox ( ) ;
this.textBox1 = new System.Windows.Forms.TextBox ( ) ;
this.label3 = new System.Windows.Forms.Label ( ) ;
this.label2 = new System.Windows.Forms.Label ( ) ;
this.textBox3 = new System.Windows.Forms.TextBox ( ) ;
this.button1 = new System.Windows.Forms.Button ( ) ;
this.textBox2 = new System.Windows.Forms.TextBox ( ) ;
this.label1 = new System.Windows.Forms.Label ( ) ;
this.label4 = new System.Windows.Forms.Label ( ) ;
this.label5 = new System.Windows.Forms.Label ( ) ;
this.button2 = new System.Windows.Forms.Button ( ) ;
this.button3 = new System.Windows.Forms.Button ( ) ;
this.button4 = new System.Windows.Forms.Button ( ) ;
this.textBox4 = new System.Windows.Forms.TextBox ( ) ;
this.statusBar1 = new System.Windows.Forms.StatusBar ( ) ;
this.statusBarPanel1 = new System.Windows.Forms.StatusBarPanel( );
this.statusBarPanel2 = new System.Windows.Forms.StatusBarPanel( );
this.label6 = new System.Windows.Forms.Label ( ) ;
this.listBox2 = new System.Windows.Forms.ListBox ( ) ;
( ( System.ComponentModel.ISupportInitialize )
( this.statusBarPanel1 ) ).BeginInit ( ) ;
( ( System.ComponentModel.ISupportInitialize )
( this.statusBarPanel2 ) ).BeginInit ( ) ;
this.SuspendLayout ( ) ;
this.listBox1.ItemHeight = 12 ;
this.listBox1.Location = new System.Drawing.Point ( 122 , 110 ) ;
this.listBox1.Name = "listBox1" ;
this.listBox1.Size = new System.Drawing.Size ( 212 , 88 ) ;
this.listBox1.TabIndex = 4 ;
this.textBox1.Location = new System.Drawing.Point ( 122 , 18 ) ;
this.textBox1.Name = "textBox1" ;
this.textBox1.Size = new System.Drawing.Size ( 210 , 21 ) ;
this.textBox1.TabIndex = 1 ;
this.textBox1.Text = "" ;
this.label3.Location = new System.Drawing.Point ( 220 , 52 ) ;
this.label3.Name = "label3" ;
this.label3.Size = new System.Drawing.Size ( 66 , 23 ) ;
this.label3.TabIndex = 7 ;
this.label3.Text = "本地端口:" ;
this.label2.Location = new System.Drawing.Point ( 38 , 54 ) ;
this.label2.Name = "label2" ;
this.label2.Size = new System.Drawing.Size ( 80 , 23 ) ;
this.label2.TabIndex = 20 ;
this.label2.Text = "远程端口号:" ;
this.textBox3.Location = new System.Drawing.Point ( 294 , 50 );
this.textBox3.Name = "textBox3" ;
this.textBox3.Size = new System.Drawing.Size ( 38 , 21 ) ;
this.textBox3.TabIndex = 3 ;
this.textBox3.Text = "8889" ;
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat ;
this.button1.Location = new System.Drawing.Point ( 348 , 16 );
this.button1.Name = "button1" ;
this.button1.Size = new System.Drawing.Size ( 92 , 40 );
this.button1.TabIndex = 6 ;
this.button1.Text = "连接远程机" ;
this.button1.Click += new System.EventHandler(this.button1_Click);
this.textBox2.Location = new System.Drawing.Point ( 122 , 50 ) ;
this.textBox2.Name = "textBox2" ;
this.textBox2.Size = new System.Drawing.Size ( 38 , 21 ) ;
this.textBox2.TabIndex = 2 ;
this.textBox2.Text = "8888" ;
this.label1.Location = new System.Drawing.Point (38,22);
this.label1.Name = "label1" ;
this.label1.Size = new System.Drawing.Size ( 80 , 23 ) ;
this.label1.TabIndex = 16 ;
this.label1.Text = "远程IP地址:" ;
this.label4.Location = new System.Drawing.Point ( 50 , 84 ) ;
this.label4.Name = "label4" ;
this.label4.Size = new System.Drawing.Size ( 66 , 23 ) ;
this.label4.TabIndex = 23 ;
this.label4.Text = "发送信息:" ;
this.label5.Location = new System.Drawing.Point ( 36 , 112 ) ;
this.label5.Name = "label5" ;
this.label5.Size = new System.Drawing.Size ( 80 , 23 ) ;
this.label5.TabIndex = 24 ;
this.label5.Text = "发送的信息:" ;
this.button2.Enabled = false ;
this.button2.FlatStyle = System.Windows.Forms.FlatStyle.Flat ;
this.button2.Location = new System.Drawing.Point ( 352 , 192 ) ;
this.button2.Name = "button2" ;
this.button2.Size = new System.Drawing.Size ( 92 , 40 ) ;
this.button2.TabIndex = 7 ;
this.button2.Text = "断开连接" ;
this.button2.Click += new System.EventHandler(this.button2_Click);
this.button3.FlatStyle = System.Windows.Forms.FlatStyle.Flat ;
this.button3.Location = new System.Drawing.Point ( 348 , 74 );
this.button3.Name = "button3" ;
this.button3.Size = new System.Drawing.Size ( 92 , 40 ) ;
this.button3.TabIndex = 8 ;
this.button3.Text = "侦听端口" ;
this.button3.Click += new System.EventHandler(this.button3_Click);
this.button4.Enabled = false ;
this.button4.FlatStyle = System.Windows.Forms.FlatStyle.Flat ;
this.button4.Location = new System.Drawing.Point ( 350 , 132 ) ;
this.button4.Name = "button4" ;
this.button4.Size = new System.Drawing.Size ( 92 , 40 );
this.button4.TabIndex = 9 ;
this.button4.Text = "发送信息" ;
this.button4.Click += new System.EventHandler(this.button4_Click);
this.textBox4.Location = new System.Drawing.Point ( 122 , 82 ) ;
this.textBox4.Name = "textBox4" ;
this.textBox4.Size = new System.Drawing.Size ( 212 , 21 ) ;
this.textBox4.TabIndex = 25 ;
this.textBox4.Text = "" ;
this.statusBar1.Location = new System.Drawing.Point ( 0 , 301 ) ;
this.statusBar1.Name = "statusBar1" ;
this.statusBar1.Panels.AddRange ( new System.Windows.Forms.
StatusBarPanel[] {
this.statusBarPanel1 ,this.statusBarPanel2} ) ;
this.statusBar1.ShowPanels = true ;
this.statusBar1.Size = new System.Drawing.Size ( 456 , 22 ) ;
this.statusBar1.TabIndex = 26 ;
this.statusBarPanel1.Width = 200 ;
this.statusBarPanel2.Width = 230 ;
this.label6.Location = new System.Drawing.Point ( 48 , 210 ) ;
this.label6.Name = "label6" ;
this.label6.Size = new System.Drawing.Size ( 66 , 23 ) ;
this.label6.TabIndex = 28 ;
this.label6.Text = "接收信息:" ;
this.listBox2.ItemHeight = 12 ;
this.listBox2.Location = new System.Drawing.Point (122,206);
this.listBox2.Name = "listBox2" ;
this.listBox2.Size = new System.Drawing.Size ( 214 , 88 ) ;
this.listBox2.TabIndex = 27 ;
this.AutoScaleBaseSize = new System.Drawing.Size ( 6 , 14 ) ;
this.ClientSize = new System.Drawing.Size ( 456 , 323 ) ;
this.Controls.AddRange ( new System.Windows.Forms.Control[] {
this.label6 ,
this.listBox2 ,
this.statusBar1 ,
this.textBox4 ,
this.button4 ,
this.button3 ,
this.button2 ,
this.label5 ,
this.label4 ,
this.label2 ,
this.textBox3 ,
this.button1 ,
this.textBox2 ,
this.label1 ,
this.label3 ,
this.textBox1 ,
this.listBox1} ) ;
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.
FixedSingle ;
this.MaximizeBox = false ;
this.Name = "Form1" ;
this.Text = "Visual C#实现网络点对点通讯程序" ;
this.Load += new System.EventHandler ( this.Form1_Load ) ;
( ( System.ComponentModel.ISupportInitialize )
( this.statusBarPanel1 ) ).EndInit ( ) ;
( ( System.ComponentModel.ISupportInitialize )
( this.statusBarPanel2 ) ).EndInit ( ) ;
this.ResumeLayout ( false ) ;
}

 

至此,【Visual C#实现网络点对点通讯程序】项目的界面设计和功能实现的前期工作就完成了。

6.在【解决方案资源管理器】窗口中,双击Form1.cs文件,进入Form1.cs文件的编辑界面。并在定义Form类成员代码区中,加入下列代码,下列代码的作用是定义程序中使用的全局变量。

private Thread th ;
//创建线程,用以侦听端口号,接收信息
private TcpListener tlListen1 ;
//用以侦听端口号
private bool listenerRun = true ;
//设定标示位,判断侦听状态
private NetworkStream tcpStream ;
//创建传送/接收的基本数据流实例
private StreamWriter reqStreamW ;
//用以实现向远程主机传送信息
private TcpClient tcpc ;
//用以创建对远程主机的连接
private Socket skSocket ;
//用以接收远程主机传送来的数据

 

7.用下列代码替换Form1.cs中的button1组件的"Click"事件对应的代码,下列代码的作用是向远程计算机提出连接申请,如果连接建立,则获得传送数据的数据源:

private void button1_Click (object sender, System.EventArgs e)
{
try
{
tcpc = new TcpClient ( textBox1.Text ,
Int32.Parse ( textBox3.Text ) ) ;
//向远程计算机提出连接申请
tcpStream = tcpc.GetStream ( ) ;
//如果连接申请建立,则获得用以传送数据的数据流
statusBar1.Panels[0].Text="成功连接远程计算机!" ;
button2.Enabled = true ;
button1.Enabled = false ;
button4.Enabled = true ;
}
catch ( Exception )
{
statusBar1.Panels[0].Text = "目标计算机拒绝连接请求!" ;
}
}

 

8.在Form1.cs中的Main函数之后,添加下列代码,下面代码是定义一个名称为"Listen"的过程:

private void Listen ( )
{
try
{
tlListen1 = new TcpListener ( Int32.Parse(textBox2.Text));
tlListen1.Start ( ) ;
//侦听指定端口号
statusBar1.Panels[1].Text = "正在监听..." ;
//接受远程计算机的连接请求,并获得用以接收数据的Socket实例
skSocket = tlListen1.AcceptSocket ( ) ;
//获得远程计算机对应的网络远程终结点
EndPoint tempRemoteEP = skSocket.RemoteEndPoint ;
IPEndPoint tempRemoteIP = ( IPEndPoint )tempRemoteEP ;
IPHostEntry host = Dns.GetHostByAddress
( tempRemoteIP.Address ) ;
string HostName = host.HostName ;
//根据获得的远程计算机对应的网络远程终结点获得远程计算机的名称
statusBar1.Panels[1].Text = "''" + HostName +"'' " +
"远程计算机正确连接!" ;
//循环侦听
while ( listenerRun )
{
Byte[] stream = new Byte[80] ;
//定义从远程计算机接收到数据存放的数据缓冲区
string time = DateTime.Now.ToString ( ) ;
//获得当前的时间
int i = skSocket.ReceiveFrom ( stream,
ref tempRemoteEP ) ;
//接收数据,并存放到定义的缓冲区中
string sMessage = System.Text.Encoding.UTF8.
GetString ( stream ) ;
//以指定的编码,从缓冲区中解析出内容
listBox2.Items.Add(time+""+HostName+":");
listBox2.Items.Add ( sMessage ) ;
//显示接收到的数据
}
}
catch ( System.Security.SecurityException )
{
MessageBox.Show ( "防火墙安全错误!" ,"错误" ,
MessageBoxButtons.OK , MessageBoxIcon.Exclamation) ;
}
}

 

9.用下列代码替换Form1.cs中的button2组件的Click事件对应的处理代码,下列代码的作用是断开当前的连接:

private void button2_Click ( object sender, System.EventArgs e)
{
 listenerRun = false ;
 tcpc.Close ( ) ;
 statusBar1.Panels[0].Text = "断开连接!" ;
 button1.Enabled = true ;
 button2.Enabled = false ;
 button4.Enabled = false ;
}


10.用下列代码替换Form1.cs中的button3组件的Click事件对应的处理代码,下列代码的作用是以上面定义的Listen过程来初始化线程实例,并启动线程,达到侦听端口的目的:

private void button3_Click (object sender , System.EventArgs e)
{
 th = new Thread ( new ThreadStart ( Listen ) ) ;
 //以Listen过程来初始化线程实例
 th.Start ( ) ;
 //启动此线程
}

 

11.用下列代码替换Form1.cs中的button4组件的Click事件对应的处理代码,下列代码的作用是向远程计算机的指定端口号发送信息。

private void button4_Click ( object sender,System.EventArgs e)
{
 try
 {
  string sMsg = textBox4.Text ;
  string MyName = Dns.GetHostName ( ) ;
  //以特定的编码往向数据流中写入数据,
  //默认为UTF8Encoding 的实例
  reqStreamW = new StreamWriter ( tcpStream ) ;
  //将字符串写入数据流中
  reqStreamW.Write ( sMsg ) ;
  //清理当前编写器的所有缓冲区,并使所有缓冲数据写入基础流
  reqStreamW.Flush ( ) ;
  string time = DateTime.Now.ToString ( ) ;
  //显示传送的数据和时间
  listBox1.Items.Add ( time +" " + MyName +":" ) ;
  listBox1.Items.Add (sMsg ) ;
  textBox4.Clear ( ) ;
 }
 //异常处理
 catch ( Exception )
 {
  statusBar1.Panels[0].Text = "无法发送信息到目标计算机!";
 }
}

 

12.用下列代码替换Form1.cs中的"Dispose"过程对应的处理代码,下列代码的作用是在程序退出后,清除没有回收的资源:

protected override void Dispose ( bool disposing )
{
 try
 {
  listenerRun = false ;
  th.Abort ( ) ;
  th = null ;
  tlListen1.Stop ( ) ;
  skSocket.Close ( ) ;
  tcpc.Close ( ) ;
 }
 catch { }
 if ( disposing )
 {
  if ( components != null )
  {
   components.Dispose ( ) ;
  }
 }
 base.Dispose ( disposing ) ;
}

 

13.运行程序,实现网络点对点通讯:

  单击快捷键F5编译成功后,把此程序分发到网络中的二台计算机中。在正确输入侦听端口号、远程计算机IP地址、远程端口号输入正确后,单击【侦听端口】和【连接远程机】按钮建立聊天的连接。就通过【发送信息】按钮进行聊天了。

五.总结:

  网络点对点通讯程序并不像客户端/服务器端模型程序那样,分成客户端程序和服务器端程序。它是集客户端程序和服务器端程序与一身,所以在具体的程序设计中就相对麻烦一点。上面介绍的在用Visual C#实现网络点对点通讯的示例虽然结构并不复杂,但涉及的知识面却比较广泛。如示例中涉及到许多很多网络功能的实现,如:侦听端口号、建立连接、发送数据和接收数据等,还涉及到线程的处理、资源的回收等。了解、掌握这些问题的处理方法对编写更复杂的网络应用程序是十分必要的。




 
JINSON @ 2007-07-11 18:00

Microsoft Active Server Pages(ASP)是服务器端脚本编写环境,使用它可以创建和运行动态、交互的 Web 服务器应用程序。使用 ASP 可以组合 HTML 页 、脚本命令和 ActiveX 组件以创建交互的 Web 页和基于 Web 的功能强大的应用程序。
现在很多网站特别是电子商务方面的网站,在前台上大都用ASP来实现。以至于现在ASP在网站应用上很普遍。
ASP是开发网站应用的快速工具,但是有些网站管理员只看到ASP的快速开发能力,却忽视了ASP安全问题。ASP从一开始就一直受到众多漏洞,后门的困扰,包括%81的噩梦,密码验证问题,IIS漏洞等等都一直使ASP网站开发人员心惊胆跳。
本文试图从开放了ASP服务的操作系统漏洞和ASP程序本身漏洞,阐述ASP安全问题,并给出解决方法或者建议。

  ASP工作机理

  Active Server Page技术为应用开发商提供了基于脚本的直观、快速、高效的应用开发手段,极大地提高了开发的效果。在讨论ASP的安全性问题之前,让我们来看看ASP是怎么工作的。ASP脚本是采用明文(plain text)方式来编写的。

  ASP脚本是一系列按特定语法(目前支持vbscript和jscript两种脚本语言)编写的,与标准HTML页面混合在一起的脚本所构成的文本格式的文件。当客户端的最终用户用WEB浏览器通过INTERNET来访问基于ASP脚本的应用时,WEB浏览器将向WEB服务器发出HTTP请求。WEB服务器分析、判断出该请求是ASP脚本的应用后,自动通过ISAPI接口调用ASP脚本的解释运行引擎(ASP.DLL)。ASP.DLL将从文件系统或内部缓冲区获取指定的ASP脚本文件,接着就进行语法分析并解释执行。最终的处理结果将形成HTML格式的内容,通过WEB服务器"原路"返回给WEB浏览器,由WEB浏览器在客户端形成最终的结果呈现。这样就完成了一次完整的ASP脚本调用。若干个有机的ASP脚本调用就组成了一个完整的ASP脚本应用。
让我们来看看运行ASP所需的环境:
Microsoft Internet Information Server 3.0/4.0/5.0 on NT Server
Microsoft Internet Information Server 3.0/4.0/5.0 on Win2000
Microsoft Personal Web Server on Windows 95/98
WINDOWS NT Option Pack所带的Microsoft IIS提供了强大的功能,但是IIS在网络安全方面却是比较危险的。因为很少有人会用Windows 95/98当服务器,因此本文我更多的从NT中的IIS安全问题来探讨。

  
微软自称的ASP的安全优点

  虽然我们本文的重点是探讨ASP漏洞和后门,但是有必要谈谈ASP在网络安全方面的"优点",之所以加个"",是因为有时这些微软宣称的"优点"恰恰是其安全隐犯。微软称ASP在网络安全方面一大优点就是用户不能看到ASP的源程序,
从ASP的原理上看,ASP在服务端执行并解释成标准的HTML语句,再传送给客户端浏览器。"屏蔽"源程序能很好的维护ASP开发人员的版权,试想你辛辛苦苦做了一个很优秀的程序,给人任意COPY,你会怎么想?而且黑客还能分析你的ASP程序,挑出漏洞。更重要的是有些ASP开发者喜欢把密码,有特权的用户名和路径直接写在程序中,这样别人通过猜密码,猜路径,很容易找到攻击系统的"入口"。但是目前已经发现了很多能查看ASP源程序的漏洞,后面我们还要讨论。
IIS支持虚拟目录,通过在"服务器属性"对话框中的"目录"标签可以管理虚拟目录。建立虚拟目录对于管理WEB站点具有非常重要的意义。虚拟目录隐藏了有关站点目录结构的重要信息。因为在浏览器中,客户通过选择"查看源代码",很容易就能获取页面的文件路径信息,如果在WEB页中使用物理路径,将暴露有关站点目录的重要信息,这容易导致系统受到攻击。其次,只要两台机器具有相同的虚拟目录,你就可以在不对页面代码做任何改动的情况下,将WEB页面从一台机器上移到另一台机器。还有就是,当你将WEB页面放置于虚拟目录下后,你可以对目录设置不同的属性,如:Read、Excute、Script。读访问表示将目录内容从IIS传递到浏览器。而执行访问则可以使在该目录内执行可执行的文件。当你需要使用ASP时,就必须将你存放.asp文件的目录设置为"Excute(执行)"。建议大家在设置WEB站点时,将HTML文件同ASP文件分开放置在不同的目录下,然后将HTML子目录设置为"读",将ASP子目录设置为"执行",这不仅方便了对WEB的管理,而且最重要的提高了ASP程序的安全性,防止了程序内容被客户所访问。

  
ASP漏洞分析和解决方法

  有人说一台不和外面联系的电脑是最安全的电脑,一个关闭所有端口,不提供任何服务的电脑也是最安全的。黑客经常利用我们所开放的端口实施攻击,这些攻击最常见的是DDOS(拒绝服务攻击).下面我会列出ASP的二十几个漏洞,每个漏洞都会有漏洞描述和解决方法。

  1 在ASP程序后加个特殊符号,能看到ASP源程序

  受影响的版本:
win95+pws
IIS3.0
98+pws4 不存在这个漏洞。
IIS4.0以上的版本也不存在这个漏洞。
问题描述:
这些特殊符号包括小数点,%81, ::
http://someurl/somepage.asp.
http:// someurl/somepage.asp%81
http:// someurl/somepage.asp::
http:// someurl/somepage.asp %2e
http:// someurl/somepage %2e%41sp
http:// someurl/somepage%2e%asp
http:// someurl/somepage.asp %2e
http://someurl/msadc/samples/selector/showcode.asp?source=/msadc/samples/../../../../../../boot.ini (可以看到boot.ini的文件内容)
那么在安装有IIS3.0和win95+PWS的浏览中就很容易看到somepage.asp的源程序。究竟是什么原因造成了这种可怕的漏洞呢?究其根源其实是 Windows NT 特有的文件系统在做怪。有一点常识的人都知道在 NT 提供了一种完全不同于 FAT 的文件系统:NTFS,这种被称之为新技术文件系统的技术使得 NT 具有了较高的安全机制,但也正是因为它而产生了不少令人头痛的隐患。大家可能不知道, NTFS 支持包含在一个文件中 的多数据流,而这个包含了所有内容的主数据流被称之为"DATA",因此使得在浏览器 里直接访问 NTFS 系统的这个特性而轻易的捕获在文件中的脚本程序成为了可能。然而 直接导致 :: 的原因是由于 IIS 在解析文件名的时候出了问题,它没有很好地规范文件名。

  解决方法和建议:

  如果是Winodws NT用户,安装IIS4.0或者IIS5.0,Windows2000不存在这个问题。如果是win95用户,安装WIN98和PWS4.0。

  2 ACCESS mdb 数据库有可能被下载的漏洞

  问题描述:
在用ACCESS做后台数据库时,如果有人通过各种方法知道或者猜到了服务器的ACCESS数据库的路径和数据库名称,那么他能够下载这个ACCESS数据库文件,这是非常危险的。比如:如果你的ACCESS数据库book.mdb放在虚拟目录下的database目录下,那么有人在浏览器中打入:
http:// someurl/database/book.mdb
如果你的book.mdb数据库没有事先加密的话,那book.mdb中所有重要的数据都掌握在别人的手中。

  解决方法:

  (1) 为你的数据库文件名称起个复杂的非常规的名字,并把他放在几目录下。所谓"非常规",打个比方:比如有个数据库要保存的是有关书籍的信息,可不要把他起个"book.mdb"的名字,起个怪怪的名称,比如d34ksfslf.mdb,再把他放在如./kdslf/i44/studi/ 的几层目录下,这样黑客要想通过猜的方式得到你的ACCESS数据库文件就难上加难了。

  (2)不要把数据库名写在程序中。有些人喜欢把DSN写在程序中,比如:
DBPath = Server.MapPath("cmddb.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
假如万一给人拿到了源程序,你的ACCESS数据库的名字就一览无余。因此建议你在ODBC里设置数据源,再在程序中这样写:conn.open "shujiyuan"

  (3)使用ACCESS来为数据库文件编码及加密。首先在选取"工具->安全->加密/解密数据库,选取数据库(如:employer.mdb),然后接确定,接着会出现"数据库加密后另存为"的窗口,存为:employer1.mdb。接着employer.mdb就会被编码,然后存为employer1.mdb..要注意的是,以上的动作并不是对数据库设置密码,而只是对数据库文件加以编码,目的是为了防止他人使用别的工具来查看数据库文件的内容。
接下来我们为数据库加密,首先以打开经过编码了的employer1.mdb,在打开时,选择"独占"方式。然后选取功能表的"工具->安全->设置数据库密码",接着输入密码即可。为employer1.mdb设置密码之后,接下来如果再使用ACCEES数据库文件时,则ACCESS会先要求输入密码,验证正确后才能够启动数据库。不过要在ASP程序中的connection对象的open方法中增加PWD的参数即可,例如:
param="driver={Microsoft Access Driver (*.mdb)};Pwd=yfdsfs"
param=param&";dbq="&server.mappath("employer1.mdb")
conn.open param
这样即使他人得到了employer1.mdb文件,没有密码他是无法看到employer1.mdb的。

  3 code.asp文件会泄漏ASP代码

  问题描述:
举个很简单的例子,在微软提供的 ASP1.0 的例程里有一个 .asp 文件 ,专门用来查看其它 .asp 文件的源代码,该文件为 ASPSamp/Samples/code.asp。如果有人把这个程序上传到服务器,而服务器端没有任何防范措施的话,他就可以很容易地查看他人的程序。例如 :
  code.asp?source=/directory/file.asp
不过这是个比较旧的漏洞了,相信现在很少会出现这种漏洞。
下面这命令是比较新的:
http://someurl/iissamples/exair/howitworks/code.asp?/lunwen/soushuo.asp=xxx.asp
最大的危害莫过于asa文件可以被上述方式读出;数据库密码以明文形式暴露在黑客眼前;

  问题解决或建议:

  对于IIS自带的show asp code的asp程序文件,删除该文件或者禁止访问该目录即可

  4、filesystemobject 组件篡改下载 fat 分区上的任何文件的漏洞

  问题描述:
  IIS3、 IIS4 的 ASP 的文件操作都可以通过 filesystemobject 实现,包括文本文件的读写目录操作、文件的拷贝改名删除等,但是这个强大的功能也留下了非常危险的 "后门"。利用 filesystemobjet 可以篡改下载 fat 分区上的任何文件。即使是 ntfs 分区,如果权限没有设定好的话,同样也能破坏,一不小心你就可能遭受"灭顶之灾 "。遗憾的是很多 webmaster 只知道让 web 服务器运行起来,很少对 ntfs 进行权限 设置,而 NT 目录权限的默认设置偏偏安全性又低得可怕。因此,如果你是 Webmaster ,建议你密切关注服务器的设置,尽量将 web 目录建在 ntfs 分区上,目录不要设定 everyone full control,即使是是管理员组的成员一般也没什么必要 full control,只要有读取、更改权限就足够了。 也可以把filesystemobject的组件删除或者改名。

  5、输入标准的HTML语句或者javascript语句会改变输出结果

  问题描述:
  在输入框中打入标准的HTML语句会得到什么相的结果呢?
比如一个留言本,我们留言内容中打入:
<font size=10>你好!</font>
  如果你的ASP程序中没有屏蔽html语句,那么就会改变"你好"字体的大小。在留言本中改变字体大小和贴图有时并不是什么坏事,反而可以使留言本生动。但是如果在输入框中写个 javascript 的死循环,比如:<a herf="http://someurl" onMouseover="while(1){window.close('/')}">特大新闻</a>
那么其他查看该留言的客人只要移动鼠标到"特大新闻",上就会使用户的浏览器因死循环而死掉。

  解决方法和建议:

  编写类似程序时应该做好对此类操作的防范,譬如可以写一段程序判断客户端的输入,并屏蔽掉所有的 HTML、 Javascrip