C#基础知识 – 预处理指令

本文转自 http://www.yiibai.com/csharp/csharp_preprocessor_directives.html


预处理器指令编译预处理指令在给定的信息实际编译开始之前。

所有的预处理指令以#开头,只是用空白字符在同一行上的预处理器指令之前出现。预处理器指令都没有声明,所以他们不以分号(;)结束。

下表列出C#中可用的预处理指令:

预处理指令 描述
#define 它定义了字符序列,称为符号
#undef 它可以取消定义的符号
#if 它允许测试符号或符号来看看计算结果是否为true。
#else 它允许创建复合条件指令,使用#if
#elif 它允许创建复合条件指令
#endif 指定一个条件指令的末端
#line 它可以让修改编译器的行号和(可选)的文件名输出错误和警告
#error 它允许在代码生成从一个特定的位置的误差
#warning 它允许产生从一个特定的位置一级预警在代码中
#region 它可以让你指定使用Visual Studio代码编辑器的概述功能时展开或折叠代码块
#endregion 它标志着#region 块的结束
Advertisements

MongoDB安装与配置(Windows)

本文转自: http://jingyan.baidu.com/article/d5c4b52bef7268da560dc5f8.html


MongoDB是目前在IT行业非常流行的一种非关系型数据库(NoSql),其灵活的数据存储方式备受当前IT从业人员的青睐。在这里主要讲如何在Windows平台下安装MongoDB。

1、在官网下载安装包或者zip压缩包

登录MongoDB官方,找到下载页面。一般Windows下可以选择两种不同的文件zip包和msi安装包。zip直接解压就可以了,msi可以选择安装内容。请自行下载,不做赘述。

2、解压源文件或双击msi文件安装

将zip文件解压放到盘符的根目录(如 C:\ 或 D:\),为了方便建议文件夹命名尽量简短,并且路径最好全英文且不要有空格符号。例如安装路径为 (D:\mongodb),如下图

zip

3、配置数据文件路径

上面的路径是mongodb的文件路径,接下来要配置MongoDB数据库文件的存放位置。在启动MongoDB服务之前必须要配置数据库文件的存放路径,否则不会自动创建,而且不能启动成功。我们可以手动创建一个路径例如 (D:\mongodb\data\db)。

dbfile

打开cmd命令行,cd进入 D:\mongodb\bin 目录下。进入后输入如下命令启动Mongodb服务:

mongod --dbpath D:\mongodb\data\db

输入完命令之后可以看到下图,如何遇到错误请根据错误提示解决。
dbb.jpg

mongodb的默认端口为27017。如果验证是否安装成功,打开浏览器输入 http://localhost:27017/ 可看到显示信息为:
It looks like you are trying to access MongoDB over HTTP on the native driver port.

只要不关闭上图的窗口,MongoDB已经在运行的状态,你可以在该设备上对mongodb进行操作了。

4、将MongoDB安装为Windows服务

为了不需要手动输入命令行启动MongoDB,可以将MongoDB安装为Windows服务,每次开机MongoDB就自动启动。在此之前要对MongoDB进行一些配置。

  • 创建数据库log存放位置,路径为 D:\mongodb\data\log\mongodb.log
  • 创建mongodb配置文件,路径 D:\mongodb\mongo.config
  • 打开mongo.config文件,输入配置内容“dbpath=D:\mongodb\data\db logpath=D:\mongodb\data\log\mongodb.log”(记得要换行)

如下图:
config.jpg

config2.jpg

接下来安装Windows服务,以管理员身份打开cmd命令行,cd进入目录 D:\mongdb\bin,并且输入如下命令:

mongod --config D:\mongodb\mongo.config --install --serviceName "MongoDB"

执行完之后,查看日志文件有内容说明已经安装成功,如果失败请根据失败原因找出问题。此时windows服务已经安装成功,但是服务还未启动,请进去windows服务管理界面启动服务。

浅谈数字证书(Certificate)

概念

数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书中心的数字签名。数字证书还有一个重要的特征就是只在特定的时间段内有效。

数字证书是一种权威性的电子文档,可以由权威公正的第三方机构(CA)签发的证书,可可以由企业级CA系统进行签发。它以数字证书为核心的加密技术(加密传输、数字签名、数字信封等安全技术)可以对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的机密性、完整性及交易的不可抵赖性。使用了数字证书,即使您发送的信息在网上被他人截获,甚至您丢失了个人的账户、密码等信息,仍可以保证您的账户、资金安全。

工作原理

数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥)并由本人公开,为一组用户所共享,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样信息就可以安全无误地到达目的地。通过数字的手段保证加密过程是不可逆过程,即只用私有密钥才能解密。

在公开密钥密码体制中,常用的一种是RSA体制。其数字原理是将大数分解成两个质数的乘积,加密和解密用的是两个不同的密钥。即使用已知明文、密文和加密密钥(公开密钥),想要推导出解密密钥(私密密钥),在计算上是不可能的。

数字签名

由于密钥仅为本人所有,这样就产生了别人无法生成的文件,也就形成了数字签名。采用数字签名能够确认以下两点:

  • 保证信息是由签名者自己签名发送的,签名者不能否认或者难以否认。
  • 保证信息自签发后到收到为止未曾做过任何修改,签发的文件是真实文件

将报文(数据内容)按双方约定的Hash算法计算得到一个固定位的报文摘要。在数学上保证:只要改动报文中任何一位,重新计算出的报文摘要值就会与原先的值不相符。这样就保证了报文的不可更改性。将该报文摘要值用发送者的私钥加密,然后连同原报文一起发给接收者,而“加密”后的报文即称为数字签名。

接收方收到数字签名后,用同样的Hash算法对原报文计算出报文摘要值,然后与用发送者的公开密钥对数字签名进行解密(原先已经把签名加密,在解密就能还原)得到的报文摘要值相比较。如相等则说明报文确实来自所称的发送者。

证书分类

基于数字证书的应用角度分类,数字证书可以分为以下几类:

  • 服务器证书。服务器证书被安装在服务器设备上,用来证明服务器的身份和进行通信加密。它可以用来防止欺诈钓鱼站点。
  • 电子邮件证书。电子邮件证书可以用来证明电子邮件发件人的真实性,它并不是证明数字证书所有者姓名的真实性,只是证明邮件地址的真实性。同时可以用来发送加密邮件和签名邮件。
  • 个人证书。客户端证书主要被用来进行身份验证和电子签名。

本文参考:

http://baike.baidu.com/item/%E6%95%B0%E5%AD%97%E8%AF%81%E4%B9%A6

http://www.youdzone.com/signature.html

浅谈SuperSocket

 

概述

SuperSocket是一个轻量级,跨平台而且可扩展的 .Net/Mono Socket服务器程序框架。使用该框架不需要知道如何使用Socket,如何维护Socket连接和Socket如何工作,能够比较容易的开发出一款Socket服务端软件。具体请参考SuperSocket官网。

P2P对等网络 – NAT类型

内容参考来自:《P2P技术全面解析》

什么是NAT?

Network Address Translation(网络地址转换),对外网有统一的IP,对内会给主机分配内网IP。当内网设备和外网进行通信的时候,对外的IP都是该NAT的IP,只是不同主机分配的端口号不同。常见的NAT设备如路由器。NAT负责将设备内网IP和外网IP进行转换。NAT是可以多层连接的,一般用户是主机连接外网时,多数都要经过多层NAT。比如自家路由器,运营商的NAT等。

NAT类型

NAT主要可以分为两类:基本NAT和NAPT(Network Address/Port Translation)。基本NAT一般用于NAT拥有多个公网IP的情形下,将公网IP地址与内网进行静态绑定。NAPT与基本的NAT技术不同,他将内部连接映射到外部网络中的一个单独的IP地址上,同时在该地址上加上一个由NAT设备选定的端口好,即NAPT技术是对基本NAT技术的一个扩展,它实施的是对的转换。

根据映射方式的不同,NAPT可以进一步分为两种类型:圆锥型NAT(Cone NAT)和对称型NAT(Symmetric NAT)。其中圆锥型NAT包括完全圆锥形NAT(Full Cone NAT)、受限圆锥型NAT(Restricted Cone NAT)和端口受限圆锥型NAT(Port Restricted Cone NAT)。在P2P通信中一般要穿越的是NAPT。

完全圆锥型(Full Cone NAT):NAT把所有来自相同内部IP地址和端口的请求映射到相投的外部IP地址和端口。任何一个外部主机均可通过该映射发送数据到该内部主机。

受限圆锥型(Restricted Cone NAT):NAT把所有来自相同内部IP地址和端口的请求映射到相同的外部IP地址和端口。但是只有当内部主机先给外部主机的IP地址发送数据包,该外部主机才能向该内部主机发送数据包。

端口受限圆锥型(Port Restricted Cone NAT):端口受限圆锥型和受限圆锥型类似,只是多了端口号的限制,即只有内部主机向IP为[ip_address:port]的外部主机发送一个数据包,该外部主机才能够把源端口号为[port]的数据包发送给北部主机。

对称型(Symmetric NAT):这种类型的NAT与上述3种类型不同,当同一内部主机使用相同的端口与不同地址的外部主机进行通信时,NAT对该内部主机的映射会有所不同。对称型NAT不能保证所有会话的私有地址和公开IP之间绑定的一致性。相反,它为每个新的会话分配一个新的端口号。

P2P网络中NAT应该具备的特性

在P2P网络中,为了保证相关P2P应用可以成功穿越NAT,NAT设备应该具备以下特性。

1、端口映射的一致性

UDP打洞技术要求NAT设备对端口映射必须一致,即要求从同一内网地址和端口建立的连接映射为相同的公网地址和端口。所以对称型NAT不支持UDP打洞。

2、支持内网不同的主机之间使用外网IP通信

为了实现UDP打洞,需要NAT支持内部的主机能够和内部其他主机进行会话。目前很多NAT并不支持该功能。如果两设备在同一NAT后,可以直接用内网地址进行通信。但是如果最外层的NAT相同,内部又连接了不同的子NAT,设备在不同子NAT后。此时设备不能用内网IP通信,同时外网IP通信又被限制。也会导致NAT穿透失败。

NAT设备的检测方法

1、检测所在NAT是圆锥型还是对称型

首先需要准备两台外网服务器,NAT内一个设备使用同一端口向两个服务器发送数据(使用UDP发送),两台服务器都可以得到该设备的外网地址和端口。之后设备从服务器获取这两个外网和端口进行对比。如果两个外网地址和端口不相同,则NAT为对称型的。反之,NAT为圆锥型。

2、检测所在NAT是否支持内网不同主机使用外网IP通信

只需要在同一个设备打开两个端口,和服务器通信后,分别获取这两个端口的外网IP和端口。如果设备能使用这两个端口的外网IP通信,则说明NAT支持内网不同主机之间通信。

Windows Service发布和配置

Windows服务是指在windows会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这种服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务。

创建Windows Service项目

使用Visual Studio创建新项目,选择“Windows 服务”即可。

发布Windows Service

完成Windows服务项目之后,想要将程序发布到计算机上。可以按照以下步骤,假设程序路径为:F://WinService.exe

  • 以管理员身份打开cmd
  • 输入命令  cd c:\Windows\Microsoft.NET\Framework\v4.0.30319
  • 进入目录后,输入命令 InstallUtil F:\WinService.exe。安装服务
  • 启动服务,出入命令 net start WinService。或者运行中输入 services.msc,手动启动服务

调试Windows Service

发布后可以使用Visual Studio 调试,以管理员身份打开服务项目,“调试” -》 “附加到进程”,选择服务的进程即可。

删除Windows Service

以管理员身份到开cmd,输入 sc delete 服务名称。如“sc delete WinService”。即可

Visual Studio 单元测试

单元测试(unit testing),是指软件中的最小可测试单元进行检查和验证。对于单元测试中的单元的含义,一般来说,要根据实际情况去判断其具体含义,如C语言中单元指一个函数,C#里单元指一个类等。总得来说,单元就是认为规定的最小的被测功能模块。单元测试是软甲开发过程中要进行的最低级别的测试活动,软件独立单元将在与程序的其他部分相隔离的情况下进行测试。

以下介绍如何使用Visual Studio 2015进行单元测试。

1、创建简单的项目
具体方法就不多说了。

2、在项目中创建一个类
如创建类名为MathOperate,包含方法Add和Minus。如下图。
1

3、创建单元测试
在该类区域右击鼠标打开上下文菜单,选择“创建单元测试”。如下图。
2

选择后,Visual Studio自动创建一个单元测试项目,并且在项目中自动生成一个测试MathOperate类的测试类MathOperateTests。如下图。
3

在MathOperateTests中测试方法AddTest和MinusTest分别测试MathOperate的方法Add和Minus。在测试方法中写测试逻辑即可。如下图。
4

4、启动测试
完成测试逻辑的填写之后,点击菜单栏中的测试,启动单元测试。如下图
5

下图是运行结果。
6

PS:这里只介绍如何创建单元测试,具体代码自己搞定。这里只能测试类中的public方法