博文

转帖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......

阅读全文(2612) | 评论:0

【转】S0/0 S0/1口的作用(2009-01-21 09:06:00)

摘要:S0/0 S0/1口是用来接64K-2M专线的,它的接口是60针的,需要加一台协议转换器来接到运营商的光端机上;

F0/0是外网以太网口 F0/1是内网以太网口;

AUX口是用来从远程modem登录管理的,它需要接一个外置的modem,并且还要有一个电话线(能被打进电话)。......

阅读全文(1844) | 评论:0

[原]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......

阅读全文(8044) | 评论:0

vc 程序打包(2008-12-24 09:19:00)

摘要:installshield
wise isntall
setupfactory
nsis
都可以满足你......

阅读全文(3039) | 评论:0

转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......

阅读全文(5245) | 评论:4

[转载]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。

串口的硬件知识

在数据传输的时候,每个字节的数据通过单个的电缆线传输。包包括开始位,数据,结束为。一旦

......

阅读全文(27685) | 评论:9

转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 连接完成
......

阅读全文(3357) | 评论:0

转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......

阅读全文(2225) | 评论:0

转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......

阅读全文(4040) | 评论:0

转 定义函数数组[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......

阅读全文(3446) | 评论:0