博文
转帖NAT详解-犯罪团伙版(2009-02-03 14:02:00)
摘要:nat翻译成中文就是网络地址转换,顾名思义也就是把一个IP地址转换成另一个IP地址,有人问为什么转换,我们就来看看。
数据包中的IP头部包含源IP地址,也就是发出这个包的源节点的IP地址,和目的IP地址,也就是这个包最终会被谁收到。
举个例子,有一伙犯罪团伙,有三名成员,毒蛇,老虎,老狼,为了作案方便,他们都办了假身份证,毒蛇成了毛虫,老虎成了小白,老狼则办了一张绵羊的身份证。他们在窝点内部,直接用各自的真名来通话,作案的时候,他们对其他人来说,就是毛虫,小白和绵羊,别人称呼他们也是这三个名字。
实际中,如果想隐藏自己的真实身份,那么可以人为的把源IP地址改成一个其他的IP地址,对方接受到之后,以为消息就是从这个IP发了的,那么他回应的时候也使用这个地址作为回应消息的目的地址。目的地址处的nat设备,一旦收到这个消息,就把消息中的目的地址替换成发信人的真实ip地址,然后转交给发信人。
nat的出现其实最初是为了解决IP地址不够用的问题的,我们知道,IP地址中有一类私有地址,也就是大家谁都可以用的地址,就类似比如冬冬,娜娜这种名字,大家谁都可以用,但是你如果去办身份证,就不会让你用这个名字。IP地址就2的32次方那么多个,如果再有多余的节点要分配地址,就不够用了。那么就提出用nat类解决。也就是,如果犯罪团伙中有10名匪徒,但是匪头只成功地办了5张假身份证,那么每次只能有5个人拿着假身份证出去作案。剩下5个人只能在窝里呆着。如果剩下的5个人想作案,那么只能等到出去的5个人回来交班。一旦有外界要和匪帮联系,统统用假名字,匪头根据身份证假名字和真名字的对应,然后点匪(点名),让对应的匪徒出去和外界交涉。但是有一天匪头一想,这样太浪费了,得找个机制,让所有人都出动,他冥思苦想之后,出来一种办法:让多个人都用同一个身份证,但是给他们再区分一下,比如绵羊:80和绵羊:8000就不是一个人,找绵羊80的,匪头就告诉A匪,找绵羊8000的,匪头就告诉B匪。这样,终于全部出动了。这样匪头就可以只用一个假身份证,让全体成员出动,呵呵。
咱们还是别在这匪徒作案了,一会警察来抓我了呵呵。我们回到现实。目前企业申请一个IP,需要付钱给网通电信这样的垄断霸王,因为负担不起给企业中每个办公室的每台pc都配一个公网IP,也就是internet......
【转】S0/0 S0/1口的作用(2009-01-21 09:06:00)
摘要:S0/0 S0/1口是用来接64K-2M专线的,它的接口是60针的,需要加一台协议转换器来接到运营商的光端机上;
F0/0是外网以太网口 F0/1是内网以太网口;
AUX口是用来从远程modem登录管理的,它需要接一个外置的modem,并且还要有一个电话线(能被打进电话)。......
[原]VC串口API超时的详细介绍(2009-01-04 11:23:00)
摘要:
_BAT_姜维 发表于2009年01月04日 11:09 阅读(0) 评论(0) 分类: 串口API 权限: 公开
昨天调了一下API结果发现同步ReadFile居然没堵塞就返回,那同步和异步岂不是一个样了,太阳!
线程没错,都没错,所以又拿资料出来看,发现有个超时设置,应该就是他了,嘿嘿。
我原本程序:
COMMTIMEOUTS TimeOuts;
//设定读超时
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//在读一次输入缓冲区的内容后读操作就立即返回,
//而不管是否读入了要求的字符。
//设定写超时
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(hCom,&TimeOuts); //设置超时
我留意了一下,它所说的超时是指串口读写操作超时
而总超时就是函数返回的标准,如果操作在总超时之前没完成,那么就结束了本次操作,如果在总超时之前完成了,那马上返回,官方资料:
COMMTIMEOUTS结构的成员都以毫秒为单位。总超时的计算公式是:
总超时=时间系数×要求读/写的字符数+时间常量
例如,要读入10个字符,那么读操作的总超时的计算公式为:
读总超时=ReadTotalTimeoutMultiplier×10+ReadTotalTimeoutConstant
要注意到无论读或者写,都有个要求的数目和实际读到的数目引用
ReadFile(hCom,str,wCount,&wCount,NULL);
wCount要求读入的数目,&wCount读到的数目引用
总超时=WriteTotalTimeoutMultiplier×wCount+ReadTotalTimeout......
vc 程序打包(2008-12-24 09:19:00)
摘要:installshield
wise isntall
setupfactory
nsis
都可以满足你......
转C# SerialPort运行方式(2008-09-11 21:53:00)
摘要:C# SerialPort运行方式 SerialPort中串口数据的读取与写入有较大的不同。由于串口不知道数据何时到达,因此有两种方法可以实现串口数据的读取。一、线程实时读串口;二、事件触发方式实现。
由于线程实时读串口的效率不是十分高效,因此比较好的方法是事件触发的方式。在SerialPort类中有DataReceived事件,当串口的读缓存有数据到达时则触发DataReceived事件,其中SerialPort.ReceivedBytesThreshold属性决定了当串口读缓存中数据多少个时才触发DataReceived事件,默认为1。
另外,SerialPort.DataReceived事件运行比较特殊,其运行在辅线程,不能与主线程中的显示数据控件直接进行数据传输,必须用间接的方式实现。如下:
SerialPort spSend; //spSend,spReceive用虚拟串口连接,它们之间可以相互传输数据。spSend发送数据
SerialPort spReceive; //spReceive接受数据
TextBox txtSend; //发送区
TextBox txtReceive; //接受区
Button btnSend; //数据发送按钮
delegate void HandleInterfaceUpdateDelegate(string text); //委托,此为重点
HandleInterfaceUpdateDelegate interfaceUpdateHandle;
public void InitClient() //窗体控件已在初始化
{
interfaceUpdateHandle = new HandleInterfaceUpdateDelegate(UpdateTextBox); //实例化委托对象
&nb......
[转载]C#中串口通信编程(2008-09-11 20:59:00)
摘要:原文及源代码位置:http://bbs.msproject.cn/default.aspx?g=posts&t=333
原文作者:ivanx
转载自:http://bbs.msproject.cn/
[翻译]
Tapan Dantre.著Serial Communication using C# and Whidbey
[简介]
本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名
空间是System.IO.Ports。这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信。
我们将使用标准的RS 232 C 在PC间通信。它工作在全双工模式下,而且我们不打算使用任何的握手
或流控制器,而是使用无modem连接。
命名空间
System.IO.Ports命名空间中最重用的是SerialPort 类。
创建SerialPort 对象
通过创建SerialPort 对象,我们可以在程序中控制串口通信的全过程。
我们将要用到的SerialPort 类的方法:
ReadLine():从输入缓冲区读一新行的值,如果没有,会返回NULL
WriteLine(string):写入输出缓冲
Open():打开一个新的串口连接
Close():关闭
Code:
//create a Serial Port object
SerialPort sp = new SerialPort ();
默认情况下,DataBits 值是8,StopBits 是1,通信端口是COM1。这些都可以在下面的属性中重新设置
:
BaudRate:串口的波特率
StopBits:每个字节的停止位数量
ReadTimeout:当读操作没有完成时的停止时间。单位,毫秒
还有不少其它公共属性,自己查阅MSDN。
串口的硬件知识
在数据传输的时候,每个字节的数据通过单个的电缆线传输。包包括开始位,数据,结束为。一旦
......
转socket非阻塞模型(2008-08-24 11:09:00)
摘要:1、select 模型
int select(
int nfds, //忽略,兼容Berkeley套接字
fd_set* readfds, //可读套接字集合
fd_set* writefds, //可写套接字集合
fd_set* exceptfds, //指向套接字集合,检查错误
const struct timeval* timeout //超时时间,NULL为无限等待
);
typedef struct fd_set {
u_int fd_count; //数组大小
SOCKET fd_array[FD_SETSIZE]; //socket数组
}
预定义的4个操作fd_set的常用宏:
FD_ZERO(*set) 初始化set为空,清空集合
FD_CLR(s,*set) 从set移除s
FD_ISSET(s,*set)检查s是否在set中,true-存在
FD_SET(s,*set) 添加s到set中
评价:
单线程可以处理多个socket,但是需要不断进行对select返回的结果进行检查,性能不高
2、WSAAsyncSelect 模型
异步Windows消息通知模型
非阻塞同步模型,先产生windows消息,然后进行操作,操作不完成不返回
int WSAAsyncselect(
SOCKET s, //socket句柄
HWND hWnd, //指定接受消息的窗口句柄
u_int wMsg, //指定网络事件来到时接受到的消息ID
long lEvent //指定哪些网络事件需要通知
);
lEvent可以取以下值的组合:
FD_READ 缓冲区有数据,可读
FD_WRITE 缓冲区变空,可写
FD_ACCEPT 有连接接入
FD_CONNECT 连接完成
......
转socket编程——技术实现(2008-08-23 21:20:00)
摘要:socket 实现
这几天都在玩socket了,有一点心得,贴出来与大家共赏,若有不妥或错误的地方,还请各位看官指点一二。
什么是socket?socket就是...,我在这里就不抄书了,有兴趣的同仁去查查书吧。
不过还要说一句,socket就是不同进程之间的一种通信方式。就象打电话是朋友之间的一种通信方式是一样。个人理解:所谓“通信”,就是相互之间发送数据。有人理解socket是不同计算机之间的一种通信方
式,这是不确切的。两个进程,不管是运行在同一台计算机上,还是运行在不同计算机上,都可通过
socket技术进行通信。
socket套接字的使用需要有网卡的支持,所以socket一般都被用来在不同机器之间通信,而如果在同一台计算机上的两个进程进行通信,通常采用效率更高的共享内存技术来实现。
两个进程之间进行通讯,就需要两个进程同时都在运行了(废话),在具体实现中,两个进程我们通常要区别对待,一个进程专门等待另一个进程给自己发消息,收到消息后进行处理,在把处理结果发送回去。我们把专门处理消息、提供服务的进程称为服务器端,把发送消息、请求处理的进程称为客户端。总体过程就是客户端发送一个消息给服务器端,服务器端进程收到消息进行处理,把处理结果发送给客户端。恩,就是这样。
还有一个问题,如果我现在有一个进程要跟另一台计算机上的某个进程进行socket通信,那在我这个进程中如何指定另一个进程呢?这里还需要说一下另一个概念——端口,如果把操作系统比作一座房子的话,那端口就是房子的窗口,是系统外界同系统内部进行通信的通道。在socket实现中,我们不进行另一个进程的指定,而是指定发送消息或接收消息的端口号。比如说现在进程A要给进程B发消息,我们会把消息发送到进程B所运行的计算机的端口N上,而进程B此时正在监视端口N,这样进程B就能收到进程A发送来的数据,同样进程B也把消息发送到该端口上,进程A也能从该端口收到进程B发送来的数据,当然,这需要客户端和服务器端关于端口号进行一个约定,即共同操作同一个端口。如果客户端把消息发送到端口N1上,而服务器端监视的是端口N2,那通信一定不能成功。端口号最大为65535,不能比这个再大了,但在我们自己的程序中尽量不要用小于1024的端口号,小于1024的端口好很多都被系统使用了,比如23被telnet所使用。
so......
转vc中socket编程步骤(2008-08-23 17:33:00)
摘要:vc中socket编程步骤
2008-06-08 11:19
[转]vc中socket编程步骤 sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。在这个程序中,将两个工程添加到一个工作区。要链接一个ws2_32.lib的库文件。
服务器端编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
2:绑定套接字到一个IP地址和一个端口上(bind());
3:将套接字设置为监听模式等待连接请求(listen());
4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
5:用返回的套接字和客户端进行通信(send()/recv());
6:返回,等待另一连接请求;
7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
服务器端代码如下:
#include <stdio.h>
#include <Winsock2.h>
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSAC......
转 定义函数数组[C/C++](2008-08-23 16:46:00)
摘要:// 函数定义
void fun1() { printf("function 1 "); }
void fun2() { printf("function 2 "); }
void fun3() { printf("function 3 "); }
void fun4() { printf("function 4 "); }
// 方法1
// 函数数组定义并赋初值
void (*p[])() = { fun1, fun2, fun3, fun4 };
// 调用数组中的函数
for(int i=0; i < 4; i++)
{
p[i]();
}
// 方法2
typedef void (*PFUN)(); // 定义函数指针
PFUNC funArray[] = { fun1, fun2, fun3, fun4 };
// 调用数组中的函数
for(int i=0; i < 4; i++)
{
funArray[i]();
}
http://blog.csdn.net/mynamelj/archive/2007/10/06/1813043.aspx......