<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
<channel>
<title><![CDATA[学无止境]]></title>
<link>http://blog.pfan.cn/sun2009</link>
<description>编程爱好者博客</description>
<language>zh-cn</language>
			<item>
		<title><![CDATA[交换环境下的Sniffer(转)]]></title>
		<link>http://blog.pfan.cn/sun2009/42204.html</link>
		<description><![CDATA[通常在局域网环境中，我们都是通过交换环境的网关上网的，在交换环境中使用NetXray或者NAISniffer一类的嗅探工具除了抓到自己的包以外，是不能看到其他主机的网络通信的。但是我们可以通过利用ARP欺骗可以实现Sniffer的目的。ARP协议是将IP解析为MAC地址的协议，局域网中的通信都是基于MAC的。例如下面这样的情况：在局域网中192.168.0.24和192.168.0.29都是通过网关192.168.0.1上网的，假定攻击者的系统为192.168.0.24，他希望听到192.168.0.29的通信，那么我们就可以利用ARP欺骗实现。1、首先告诉192.168.0.29，网关192.168.0.1的MAC地址是192.168.0.242、告诉192.168.0.1，192.168.0.29的MAC地址是192.168.0.24。这样192.168.0.29和192.168.0.1之间的数据包，就会发给192.168.0.24，也就是攻击者的机器，这样就可以听到会话了。但是这么做的有一个问题，192.168.0.29发现自己不能上网了，因为原来发给192.168.0.1的数据包都被192.168.0.24接收了，而并没有发给网关192.168.0.1。这时候192.168.0.24设置一个包转发的东西就可以解决这个问题了，也就是从192.168.0.29收到的包转发给192.168.0.1，在把从192.168.0.1收到的包发给192.168.0.29。这样192.168.0.29根本就不会意识到自己被监听了。具体实现：1、欺骗192.168.0.29，告诉这台机器网关192.168.0.1的MAC地址是自己(192.168.0.24)。[root@Linuxdsniff-2.3]#./arpspoof-ieth0-t192.168.0.29192.168.0.10:50:56:40:7:710:0:86:61:6b:4e080642:arpreply192.168.0.1is-at0:50:56:40:7:710:50:56:40:7:710:0:86:61:6b:4e080642:arpreply192.168.0.1is-at0:50:56:40:7:710:50:56:40:7:710:0:86:61:6b:4e080642:arpreply19]]></description>
		<author><![CDATA[sun2009]]></author>
		<pubDate>2009-04-17 09:50:00</pubDate>
		</item>
				<item>
		<title><![CDATA[词法分析器生成工具FLEX简介(转)]]></title>
		<link>http://blog.pfan.cn/sun2009/42097.html</link>
		<description><![CDATA[1．FLEX简介 
&nbsp;&nbsp; 单词的描述称为模式(Lexical Pattern)，模式一般用正规表达式进行精确描述。FLEX通过读取一个有规定格式的文本文件，输出一个如下所示的C语言源程序。





&nbsp;&nbsp; FLEX的输入文件称为LEX源文件，它内含正规表达式和对相应模式处理的C语言代码。LEX源文件的扩展名习惯上用.l表示。FLEX通过对源文件的扫描自动生成相应的词法分析函数 int yylex()，并将之输出到名规定为lex.yy.c的文件中。实用时，可将其改名为lexyy.c。该文件即为LEX的输出文件或输出的词法分析器。也可将 int yylex()加入自已的工程文件中使用。 
2． 模式简介
&nbsp;&nbsp; LEX的模式的格式(也称为规则)是机器可读的正规表达式，正规表达工是用连接、并、闭包运算递归生成的。为了方便处理，LEX在此基础上增加了一些运算。下列是按运算优先级由高往低排列的LEX的正规表达式的运算符。
“\[]^-?.*+|()/${}%&lt;&gt;
&nbsp;&nbsp; 关于LEX的模式定义，可参见下页附表1.1
3．LEX源文件格式
&nbsp;&nbsp; LEX对源文件的格式要求非常严格，比如若将要求顶行书写的语句变成非顶行书写就会产生致命错误。而LEX本身的查错能力很弱，所以书写时一定要注意。
&nbsp;&nbsp; LEX的源文件由三个部份组成，每个部分之间用顶行的“%%”分割，其格式如下：
&nbsp;&nbsp; 定义部份
&nbsp;&nbsp; ％％
&nbsp;&nbsp; 规则部份　
&nbsp;&nbsp; ％％
&nbsp;&nbsp; 用户附加C语言部份
3.1定义部份
&nbsp;&nbsp; 定义部份由C语言代码、模式的宏定义、条件模式的开始条件说明三部份组成。
&nbsp;&nbsp; 其中，C代码部份由顶行的%{和}%引入，LEX扫描源文件时将%{和}%之间的部分原封不动的拷贝到输出文件lex.yy.c中.
附表1.1 LEX 的模式定义




模 式

解 释


X

匹配单个字符x。(也可将模式写为”x”)


.

匹配除换行符’\n’之外的任]]></description>
		<author><![CDATA[sun2009]]></author>
		<pubDate>2009-04-11 08:39:00</pubDate>
		</item>
				<item>
		<title><![CDATA[C++标准库简介（转）]]></title>
		<link>http://blog.pfan.cn/sun2009/41927.html</link>
		<description><![CDATA[C++标准库的所有头文件都没有扩展名。C++标准库的内容总共在50个标准头文件中定义，其中18个提供了C库的功能。 &lt;cname&gt;形式的标准头文件【 &lt;complex&gt;例外】其内容与ISO标准C包含的name.h头文件相同，但容纳了C++扩展的功能。在 &lt;cname&gt;形式标准的头文件中，与宏相关的名称在全局作用域中定义，其他名称在std命名空间中声明。在C++中还可以使用name.h形式的标准C库头文件名。C++标准库的内容分为10类：C1.语言支持 C2.输入/输出 C3.诊断 C4.一般工具 C5.字符串C6.容器 C7.迭代器支持 C8.算法 C9.数值操作 C10.本地化C1 标准库中与语言支持功能相关的头文件 头文件&nbsp; 描述&nbsp;&lt;cstddef&gt; 定义宏NULL和offsetof，以及其他标准类型size_t和ptrdiff_t。与对应的标准C头文件的区别是，NULL是C++空指针常量的补充定义，宏offsetof接受结构或者联合类型参数，只要他们没有成员指针类型的非静态成员即可。&lt;limits&gt; 提供与基本数据类型相关的定义。例如，对于每个数值数据类型，它定义了可以表示出来的最大值和最小值以及二进制数字的位数。&lt;climits&gt; 提供与基本整数数据类型相关的C样式定义。这些信息的C++样式定义在 &lt;limits&gt;中&lt;cfloat&gt; 提供与基本浮点型数据类型相关的C样式定义。这些信息的C++样式定义在 &lt;limits&gt;中&lt;cstdlib&gt; 提供支持程序启动和终止的宏和函数。这个头文件还声明了许多其他杂项函数，例如搜索和排序函数，从字符串转换为数值等函数。它与对应的标准C头文件stdlib.h不同，定义了abort(void)。abort()函数还有额外的功能，它不为静态或自动对象调用析构函数，也不调用传给atexit()函数的函数。它还定义了exit()函数的额外功能，可以释放静态对象，以注册的逆序调用用atexit()注册的函数。清除并关闭所有打开的C流，把控制权返回给主机环境。&lt;new&gt; 支持动态内存分配&lt;typeinfo&gt; 支持变量在运行期间的类型标识&lt;exception&gt; 支持]]></description>
		<author><![CDATA[sun2009]]></author>
		<pubDate>2009-04-02 16:23:00</pubDate>
		</item>
				<item>
		<title><![CDATA[c++中的getline()]]></title>
		<link>http://blog.pfan.cn/sun2009/41839.html</link>
		<description><![CDATA[在C++中，当调用getline()函数时，在vc++6.0下运行时，需转行两次。且在某些情况下，会发生错误。
例如：
//C++
#include &lt;iostream&gt;#include &lt;fstream&gt;#include &lt;string&gt;
using namespace std;
int main(){&nbsp;ofstream outFile;&nbsp;string state = "";&nbsp;string capital = "";
&nbsp;outFile.open("date.txt");
&nbsp;if(!outFile.is_open())&nbsp;{&nbsp;&nbsp;outFile.open("date.txt");&nbsp;}
&nbsp;cout &lt;&lt; "The state: ";&nbsp;getline(cin, state);
&nbsp;while(state != "x" &amp;&amp; state != "X")&nbsp;{&nbsp;&nbsp;cout &lt;&lt; "The capital: ";&nbsp;&nbsp;getline(cin, capital);
&nbsp;&nbsp;outFile &lt;&lt; state &lt;&lt; '#' &lt;&lt; capital &lt;&lt; endl;
&nbsp;&nbsp;cout &lt;&lt; "The state: ";&nbsp;&nbsp;getline(cin, state);&nbsp;}
&nbsp;return 0;}
当键入：Oregon, Salem, New Jersey, Trenton, x
结果为：Oregon#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Salem#New Jersey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Trenton#x
结果]]></description>
		<author><![CDATA[sun2009]]></author>
		<pubDate>2009-03-29 14:37:00</pubDate>
		</item>
		</channel>
</rss>