Visual C++编程疑难问题解(一)[2]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 mynote 的 blog

   从系统性能上看,用非阻塞的socket效率和性能更高,但是编程更复杂,特别是当你使用事件或者消息的时候,但是,你可以通过4个工作线程管理100多个socket连接,效率非常高,不需要每个工作线程只管理一个socket连接。 用阻塞的方式比较简单,但当较多客户端时消耗系统资源太多。

   所谓用4个线程管理100多socket,不过是这样一种构思:建立一个线程池,当有socket的事件需要处理时,从线程池中取一个线程来执行,执行完,将线程归还到线程池中。 这样的做法在如下的条件下会工作的更好:

   (1)、每个socket连接的时间较长,不断的与服务器交互。

   (2)、每个连接的socket并不是每时每刻都在收发数据 具体的实现方式:(我是在windows环境下实现的,linux上现在正在研究) 可以使用overlaped io,或者完成端口(compeleteio)

  问题八: 怎样设置栈的大小?

  钥匙在这里:

   方法一:stacksize 定义.def文件

   语法:stacksize reserve[,commit]

      reserve:栈的大小;commit:可选项,与操作系统有关,在nt上只一次分配物理内存的大小

   方法二:设定/stack


   打开工程,依次操作菜单如下:project->setting->link,在category 中选中output,然后在reserve中设定堆栈的最大值和commit。

   注意:reserve默认值为1mb,最小值为4byte;commit是保留在虚拟内存的页文件里面,它设置的较
大会使栈开辟较大的值,可能增加内存的开销和启动时间

问题九:如何获取本机上正在使用的udp端口?

   钥匙在这里:

    可以通过端口扫描技术实现。

    端口扫描技术(port scanning)
  
  端口扫描就是通过连接到目标系统的tcp或udp端口,来确定什么服务正在运行。一般来说端口扫描有三个用途:

   * 识别目标系统上正在运行的tcp和udp服务。
   * 识别目标系统的操作系统类型(windows 9x, windows nt,或unix,等)。
   * 识别某个应用程序或某个特定服务的版本号。
  
    端口扫描技术:

   1. tcp connect scan:这种方法最简单,直接连到目标端口并完成一个完整的三次握手过程(syn, syn/ack, 和ack)。缺点是容易被目标系统检测到。

   2. tcp syn scan:这种技术也叫“半开式扫描”(half-open scanning),因为它没有完成一个完整的tcp连接。这种方法向目标端口发送一个syn分组(packet),如果目标端口返回syn/ack,那么可以肯定该端口处于检听状态;否则,返回的是rst/ack。这种方法比第一种更具隐蔽性,可能不会在目标系统中留下扫描痕迹。

   3. tcp fin scan:这种方法向目标端口发送一个fin分组。按rfc793的规定(http://www.ietf.org/rfc/rfc0793.txt),对于所有关闭的端口,目标系统应该返回rst标志。这种方法通常用在基于unix的tcp/ip堆栈。

   4. tcp xmas tree scan:这种方法向目标端口发送一个含有fin, urg,和push标志的分组。根据rfc793,对于所有关闭的端口,目标系统应该返回rst标志。

   5. tcp null scan:这种方法向目标端口发送一个不包含任何标志的分组。根据rfc793,对于所有关闭的端口,目标系统应该返回rst标志。

   6. udp scan:这种方法向目标端口发送一个udp分组。如果目标端口以“icmp port unreachable”消息响应,那么说明该端口是关闭的;反之,如果没有收到“icmp port unreachable”响应消息,则可以肯定该端口是打开的。由于udp协议是面向无连接的协议,这种扫描技术的精确性高度依赖于网络性能和系统资源。另外,如果目标系统采用了大量分组过滤技术,那么udp扫描过程会变得非常慢。如果你想对internet进行udp扫描,那么你不能指望得到可靠的结果。
  
  另外,有某种系统的ip协议是这样实现的,对于所有扫描的端口,不管他们处于关闭或者监听状态,都返回rst标志(我们知道,这不符合rfc793的规定)。因此,扫描这种系统时,用不同的扫描技术可能得到不同的扫描结果。
  
   端口扫描工具:
  
   * strobe

   strobe是一个很古老的端口扫描工具,最快且最可靠的tcp扫描工具之一。缺点在于没有udp扫描功能。
   url: ftp.win.or.jp/pub/network/misc/strobe-1.05.tar.gz
  
   * udp_scan

   udp_scan最初来自satan(security administrator tool for analyzing networks, 安全管理员的网络分析工具,satan的新版本改称saint,由http://wwdsilx.wwdsi.com发布)。udp_scan是最可靠的udp扫描工具之一,但隐蔽性不好,容易被目标系统检测到。

   url: ftp://ftp.technotronic.com/unix/network-sanners/udpscan.c
  
   * netcat

   netcat是最有用的网络工具之一,功能很多,有网络安全工具包中的瑞士军刀之称。netcat提供基本的tcp、udp扫描功能。

   url: http://www.l0pht.com/netcat
  
   * portpro and portscan

  是windows nt上最快的端口扫描工具之一。portscan可以指定一个扫描范围,portpro只能递增扫描,他们都不能一次扫描多个ip地址。

   url: portpro: http://www.securityfocus.com
  
   * network mapper(nmap)

   nmap是一个高级端口扫描工具,提供了多种扫描方法。nmap有一些有趣的功能,如用分解(fragment)tcp头(就是把一个tcp头分解到多个分组中发送)的方法绕过一些具有简单分组过滤功能的防火墙。nmap的另一个有趣功能是可以发送欺骗地址扫描。具体的实现方法是:以伪造的ip地址向目标系统发送大量syn分组,并在其中混以真实地址的syn分组,这会导致目标系统花大量时间去响应那些伪造分组,从而造成拒绝服务(denial of service),这就是所谓的syn flood攻击。

   url: http://www.insecure.org/nmap

  问题十:如何利用directoryentry组件来查看网络  

  钥匙在这里:

   directoryentry组件提供了path属性,根据文档,此属性指定了目录服务中用来访问对象的对象名,其格式如下:

   protocol://servername:port number/distinguished name

   此语句的第一部分定义了访问将使用的协议,如

   ldap: (lightweight directory access protocol)

   iis: (提供iis元数据来读及配置internet infomation server)

   winnt: (提供在非常有限的性能下对windows nt域的访问)

   nds: (提供对novell directory service的访问)

   等等(详细信息清参考msdn)。

   据此,我们构造了一个directoryentry实例,将它的path设为"winnt:",以通过对它的所有子项的枚举来发现网络上的所有域(以及工作组)。这样,再对所发现的域(以及工作组)的子项进行枚举,就可以发现网络上的所有计算机。下面的一个控制台小程序演示了这一点。

using system;
using system.directoryservices;

class tempclass
{
 static void main()
 {
  enumcomputers();
 }

 static void enumcomputers()
 {
  using(directoryentry root = new directoryentry("winnt:"))
  {
   foreach(directoryentry domain in root.children)
   {
    console.writeline("domain | workgroup:\t"+domain.name);
    foreach(directoryentry computer in domain.children)
    {
     console.writeline("computer:\t"+computer.name);
    }
   }
  }
 }
}


  上面代码中两个嵌套的foreach循环看起来并不是太好,并且控制台的显示效果也并不那么美观。下面,我将对代码进行一些改动,并将它移植到winform上。

  新建一个windows application[c#],在form上添加一个treeview,命名为treeview1。

本文关键:Visual C++编程疑难问题解(一)
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top