﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-More than C++-随笔分类-网络</title><link>http://www.cppblog.com/Lee/category/8744.html</link><description>Beyond  C++</description><language>zh-cn</language><lastBuildDate>Fri, 06 Feb 2009 17:58:40 GMT</lastBuildDate><pubDate>Fri, 06 Feb 2009 17:58:40 GMT</pubDate><ttl>60</ttl><item><title>线程同步与异步套接字编程</title><link>http://www.cppblog.com/Lee/archive/2008/11/24/67767.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Mon, 24 Nov 2008 14:49:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2008/11/24/67767.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/67767.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2008/11/24/67767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/67767.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/67767.html</trackback:ping><description><![CDATA[
		<font color="#ff1493">
				<strong>事件对象：</strong>
				<br />
		</font>      事件对象也属于内核对象，包含一个计数器，一个用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值，另一个用于指明该事件是处于已通知还是未通知状态的布尔值。<br /><br />两种事件对象：<br />1.人工重置的事件。   当一个人工重置的事件得到通知时，等待该事件的所有线程均为可调度线程。<br />2.自动重置的事件。   当一个自动重置的事件得到通知时，等待该事件的线程中只有一个线程变为可调动线程。<br /><br /><font color="#ff1493"><strong>关键代码段：</strong></font><br />关键代码段（临界区）工作在用户方式下。<br /><br />关键代码段（临界区）是指一小代码段，在代码能够执行前，它必须独占对某些资源的访问权。<br /><br /><font color="#000000"><font color="#ff1493"><strong>线程死锁：</strong></font><br />线程1拥有了临界区对象A，等待临界区对象B的拥有权，线程2拥有了临界区对象B，等待临界区对象A的拥有权，就造成了死锁。<br /><br /><br /><strong><font color="#ff1493">互斥对象、事件对象和关键代码段的比较</font></strong><br />互斥对象和事件对象都属于内核对象，利用内核对象进行线程同步，速度较慢，但利用互斥对象和事件对象这样的内核对象，可以在多个进程中的各个线程间进行同步。<br /><br />关键代码段是工作在用户方式下，同步速度较快，但在使用关键代码段时，很容易进入死锁状态，因为在等待进入关键代码段时无法设定超时值。<br /><br />推荐书目:《Windows核心编程》机械工业出版社<br /><br /><font color="#ff1493"><strong>基于消息的异步套接字</strong></font><br />Windows套接字在2种模式下执行I/O操作，阻塞和非阻塞。<br />在<font color="#0000ff">阻塞模式</font>下，在I/O操作完成前，执行操作的Winsock函数会一直等待下去，不会立即返回程序（将控制权交还给程序）。<br />在<font color="#0000ff">非阻塞模式</font>下，Winsock函数无论如何都会立即返回。<br /><br /> Windows  Sockets为了支持Windows消息驱动机制，使应用程序开发者能方便的处理网络通信，它对网络事件采取了基于消息的异步存取策略。<br /><br />Windows Sockets的异步选择函数WSAAsyncSelect()提供了消息机制的网络事件选择，当使用它登记的网络事件发生时，Windows应用程序相应窗口函数将收到一个消息，消息中指示了发生的网络事件，以及与事件相关的一些信息。<br /><br /><strong><font color="#ffa500">相关函数说明</font></strong><br /><strong>int  WSAEnumProtocols(LPINT   lpiProtocols, LPWSAPROTOCOL_INFO  lpProtocolBuffer,  ILPDWORD  lpdwBufferLength);<br /></strong><br />Win32平台支持多种不同的网络协议，采用Winsock2,  就可直接使用任何一种协议的网络应用程序了。通过WSAEnumrotocols函数可以获得系统中安装的网络协议的信息。<br /><br />lpPrototocols：一个以NULL结尾的协议标示号数组，这个参数是可选的，如果lpProtocol为NULL，则返回所有可用协议的信息，否则，只返回数组中协议的信息。<br /><br />lpProtocolBuffer  [out],一个用WSAPROTOCOL_INFO结构体填充的缓冲区。WSAPROTOCOL_INFO用来存放或者得到一个指定协议的完整信息。<br /><br />lpdwBufferLength [in , out],在输入时，指定传递给WSAEnumProtocols()函数的lpProtocolBuffer缓冲区的长度；<br />在输出时，存有获取所有请求信息需传递给WSAEnumrotocols()函数的最小缓冲区长度。<br />这个函数不能重复调用，传入的缓冲区必须足够大以便能存放所有的元素。<br />这个规定降低了该函数的复杂度，并且由于一个机器上装载的协议数目往往是很少的，所以不会产生问题。<br /><br /><strong>SOCKET   WSASocket(int   af,   int   type,  int   protocol   ,LPWSAPROTOCOL_INFO   lpProtpcolInfo,   GROUP    g,  DWORD    dwFliags);</strong><br /><br />前3个参数和socket()函数的前3个参数含义一样。<br /><br />lpProtocolInfo,一个指向WSAPROTOCOL_INFO结构体的指针，该结构定义了所创建的套接字的特性。如果lpProtocolInfo为NULL,则套接字绑定到与指定的结构WSAPROTOCOL_INFO相关的提供者。<br /><br /> g   ,保留的。<br /><br />dwFlags, 套接字属性的描述。<br /><br /><strong>int    WSARecvFrom(SOCKET   s, LPWSABUF    lpBuffer,  DWORD  dwBufferCount  , LPDWORD   lpNumberOfBytesRecvd,   LPDWORD   lpFlags,  struct  sockaddr *  lpFrom,  LPINT  lpFromLen,   LPWSAOVERLAPPED   lpOverLapped,  LPWSAOVERLAPPED_COMPLETION_ROUTINE    lpCompletionRountine)<br /></strong><br />s,标示套接字的描述符。<br /><br />lpBuffer[in, out]  ,一个指向WSABUF结构体的指针。每一个WSABUF结构体包含一个缓冲区的指针和缓冲区的长度。<br /><br />dwBufferCount，  lpBuffer数组中WSABUF结构体的数目。<br /><br />lpNumberOfBytesRecvd    [out],  如果接收操作立即完成，则为一个指向本次调用所接收的字节数的指针。<br /><br />lpFlags[in ,out] ,一个指向标示位的指针。<br /><br />lpFrom[out], 可选指针，指向重叠操作完成后存放源地址的缓冲区。<br /><br />lpFrpmLen[in,  out],指向缓冲区大小的指针，仅当指定了lpFrom才需要。<br /><br />lpOverlapped,一个指向WSAOVERLAPPED结构体的指针（对于非重叠套接字则忽略）。<br /><br />lpCompletionRoutine,  一个指向接收操作完成时调用的完成例程的指针（对于非重叠套接字则忽略）。<br /><br /><strong>int  WSASendTo(SOCKET  s,  LPWSABUF  lpBuffer,  DWORD  dwufferCount, LPDWORD   lpNumberOfBytesSent,  DWORD  dwFlags, const struct sockaddr FAR *   lpTo, int   iToLen,  LPWSAOVERLAPPED   lpOverLapped,  LPOVERLAPPED_COMPLETION_ROUTINE  lpCompletionRoutine)</strong><br /><br />s, 标示一个套接字（可能已连接）的描述符。<br /><br />lpBuffer,  一个指向WSABUF结构体的指针。每一个WSABUF的结构体包含一个缓冲区的指针和缓冲区的长度。<br /><br />dwBufferCount,  lpBuffer数组中WSABUF的数目。<br /><br />lpNumberOfBytesSent  [out],  如果发送操作立即完成，则为一个本次调用的所发送的字节数的指针。<br /><br />dwFlags,  指示影响操作行为的标示位。<br /><br />lpTo,  可选指针，指向目标套接字的地址。<br /><br />iToLen,  lpTo的地址长度。<br /><br />lpOverLapped,  一个指向WSAOVERLAPPED结构的指针（对于非重叠套接字则忽略）。<br /><br />lpComletionRoutine, 一个指向操作完成时调用的完成例程的指针（对于非重叠套接字则忽略）。<br /><br /><br /><br /><br /><br /></font><img src ="http://www.cppblog.com/Lee/aggbug/67767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2008-11-24 22:49 <a href="http://www.cppblog.com/Lee/archive/2008/11/24/67767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>网络编程</title><link>http://www.cppblog.com/Lee/archive/2008/11/20/67372.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Thu, 20 Nov 2008 04:03:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2008/11/20/67372.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/67372.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2008/11/20/67372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/67372.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/67372.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/Lee/archive/2008/11/20/67372.html'>阅读全文</a><img src ="http://www.cppblog.com/Lee/aggbug/67372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2008-11-20 12:03 <a href="http://www.cppblog.com/Lee/archive/2008/11/20/67372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是IGMP协议</title><link>http://www.cppblog.com/Lee/archive/2008/10/25/64998.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Sat, 25 Oct 2008 04:41:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2008/10/25/64998.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/64998.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2008/10/25/64998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/64998.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/64998.html</trackback:ping><description><![CDATA[
		<p>英文原义：InternetGroupMulticastProtocol</p>
		<p>中文释义：（RFC-1112）Internet组管理协议</p>
		<p>注解：该协议运行于主机和与主机直接相连的组播路由器之间，是IP主机用来报告多址广播组成员身份的协议。通过IGMP协议，一方面可以通过IGMP协议主机通知本地路由器希望加入并接收某个特定组播组的信息；另一方面，路由器通过IGMP协议周期性地查询局域网内某个已知组的成员是否处于活动状态。</p>
		<p>应用：IGMP协议的主要作用是解决网络上广播时占用带宽的问题。在网络中，当给所有客户端发出广播信息时，支持IGMP的交换机会将广播信息不经过滤地发给所有客户端。但是这些信息只需要通过组播的方式传输给某一个部分的客户端</p>
<img src ="http://www.cppblog.com/Lee/aggbug/64998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2008-10-25 12:41 <a href="http://www.cppblog.com/Lee/archive/2008/10/25/64998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是ICMP协议</title><link>http://www.cppblog.com/Lee/archive/2008/10/25/64997.html</link><dc:creator>David Lee</dc:creator><author>David Lee</author><pubDate>Sat, 25 Oct 2008 04:06:00 GMT</pubDate><guid>http://www.cppblog.com/Lee/archive/2008/10/25/64997.html</guid><wfw:comment>http://www.cppblog.com/Lee/comments/64997.html</wfw:comment><comments>http://www.cppblog.com/Lee/archive/2008/10/25/64997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/Lee/comments/commentRss/64997.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/Lee/services/trackbacks/64997.html</trackback:ping><description><![CDATA[ICMP是“Internet Control Message Protocol”（Internet控制消息<a href="http://www.chinaitpower.com/Net/xieyi/index.html" target="_blank">协议</a>）的缩写。它是TCP/IP<a href="http://www.chinaitpower.com/Net/xieyi/index.html" target="_blank">协议</a>族的一个子<a href="http://www.chinaitpower.com/Net/xieyi/index.html" target="_blank">协议</a>，用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据，但是对于用户数据的传递起着重要的作用。<br /><br />　　我们在网络中经常会使用到ICMP<a href="http://www.chinaitpower.com/Net/xieyi/index.html" target="_blank">协议</a>，只不过我们觉察不到而已。比如我们经常使用的用于检查网络通不通的Ping命令，这个“Ping”的过程实际上就是ICMP<a href="http://www.chinaitpower.com/Net/xieyi/index.html" target="_blank">协议</a>工作的过程。还有其他的网络命令如跟踪路由的Tracert命令也是基于ICMP<a href="http://www.chinaitpower.com/Net/xieyi/index.html" target="_blank">协议</a>的。<br /><br />　　<b>ICMP的重要性</b><br /><br /><br />　　ICMP<a href="http://www.chinaitpower.com/Net/xieyi/index.html" target="_blank"><font color="#002c99">协议</font></a>对于网络安全具有极其重要的意义。ICMP<a href="http://www.chinaitpower.com/Net/xieyi/index.html" target="_blank"><font color="#002c99">协议</font></a>本身的特点决定了它非常容易被用于攻击网络上的路由器和主机。例如，在1999年8月海信集团“悬赏”50万元人民币测试防火墙的过程中，其防火墙遭受到的ICMP攻击达334050次之多，占整个攻击总数的90%以上！可见，ICMP的重要性绝不可以忽视！<br /><br />　　比如，可以利用操作系统规定的ICMP数据包最大尺寸不超过64KB这一规定，向主机发起“Ping of Death”（死亡之Ping）攻击。“Ping of Death” 攻击的原理是：如果ICMP数据包的尺寸超过64KB上限时，主机就会出现内存分配错误，导致TCP/IP堆栈崩溃，致使主机死机。<br /><br />　　此外，向目标主机长时间、连续、大量地发送ICMP数据包，也会最终使系统瘫痪。大量的ICMP数据包会形成“ICMP风暴”，使得目标主机耗费大量的CPU资源处理，疲于奔命。<br /><br /><br />　　<b>应对ICMP攻击</b><br /><br /><br />　　虽然ICMP<a href="http://www.chinaitpower.com/Net/xieyi/index.html" target="_blank"><font color="#002c99">协议</font></a>给黑客以可乘之机，但是ICMP攻击也并非无药可医。只要在日常网络管理中未雨绸缪，提前做好准备，就可以有效地避免ICMP攻击造成的损失。<br />对于“Ping of Death”攻击，可以采取两种方法进行防范：第一种方法是在路由器上对ICMP数据包进行带宽限制，将ICMP占用的带宽控制在一定的范围内，这样即使有ICMP攻击，它所占用的带宽也是非常有限的，对整个网络的影响非常少；第二种方法就是在主机上设置ICMP数据包的处理规则，最好是设定拒绝所有的ICMP数据包。<br /><br />　　设置ICMP数据包处理规则的方法也有两种，一种是在操作系统上设置包过滤，另一种是在主机上安装防火墙。具体设置如下：<br /><br />　　1．在Windows 2000 Server中设置ICMP过滤<br /><br />　　Windows 2000 Server提供了“路由与远程访问”服务，但是默认情况下是没有启动的，因此首先要启动它：点击“管理工具”中的“路由与远程访问”，启动设置向导。在其中选择“手动配置服务器”项，点击[下一步]按钮。稍等片刻后，系统会提示“路由和远程访问服务现在已被安装。要开始服务吗？”，点击[是]按钮启动服务。<br /><br />　　服务启动后，在计算机名称的分支下会出现一个“IP路由选择”，点击它展开分支，再点击“常规”，会在右边出现服务器中的网络连接（即网卡）。用鼠标右键点击你要配置的网络连接，在弹出的菜单中点击“属性”，会弹出一个网络连接属性的窗口，如图1所示。<br /><br /><p align="center"><img height="238" alt="" src="http://www.chinaitpower.com/A-A-B/Image/2005/08/02/20030612zw_01.jpg" width="300" /></p><br />　　图1<br /><br />　　图1中有两个按钮，一个是“输入筛选器”（指对此服务器接受的数据包进行筛选），另一个是“输出筛选器”（指对此服务器发送的数据包进行筛选），这里应该点击[输入筛选器] 按钮，会弹出一个“添加筛选器”窗口，再点击[添加]按钮，表示要增加一个筛选条件。<br /><br />　　在“<a href="http://www.chinaitpower.com/Net/xieyi/index.html" target="_blank"><font color="#002c99">协议</font></a>”右边的下拉列表中选择“ICMP”，在随后出现的“ICMP类型”和“ICMP编码”中均输入“255”，代表所有的ICMP类型及其编码。ICMP有许多不同的类型（Ping就是一种类型），每种类型也有许多不同的状态，用不同的“编码”来表示。因为其类型和编码很复杂，这里不再叙述。<br /><br />　　点击[确定]按钮返回“输入筛选器”窗口，此时会发现“筛选器”列表中多了一项内容（如图2所示）。点击[确定]按钮返回“本地连接”窗口，再点击[确定]按钮，此时筛选器就生效了，从其他计算机上Ping这台主机就不会成功了。<br /><br /><p align="center"><img height="161" alt="" src="http://www.chinaitpower.com/A-A-B/Image/2005/08/02/20030612zw_02.jpg" width="320" /></p><br />　　图2<br /><br />　　2． 用防火墙设置ICMP过滤<br /><br />　　现在许多防火墙在默认情况下都启用了ICMP过滤的功能。如果没有启用，只要选中“防御ICMP攻击”、“防止别人用ping命令探测”就可以了，如图3所示。<br /><br /><p align="center"><img height="215" alt="" src="http://www.chinaitpower.com/A-A-B/Image/2005/08/02/20030612zw_03.jpg" width="300" /></p><br />　　图3<br /><br />　　通过以上讲解，你现在知道ICMP的重要性了吧？赶紧给你的服务器设置ICMP过滤吧。<img src ="http://www.cppblog.com/Lee/aggbug/64997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/Lee/" target="_blank">David Lee</a> 2008-10-25 12:06 <a href="http://www.cppblog.com/Lee/archive/2008/10/25/64997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>