WEB开发网
开发学院软件开发VC 一个简单的端口扫描程序题 阅读

一个简单的端口扫描程序题

 2010-05-12 20:35:42 来源:WEB开发网   
核心提示:3、DoScanPort 线程:这个线程负责具体扫描指定的端口,并将结果SendMessage给主对话框,一个简单的端口扫描程序题(2),下面是其代码:DWORD WINAPI DoScanPort(LPVOID lpParam){DWORD dwRet;short nPort = *(short*)lpParam;d

3、DoScanPort 线程:

这个线程负责具体扫描指定的端口,并将结果SendMessage给主对话框。下面是其代码:

DWORD WINAPI DoScanPort(LPVOID lpParam)
{
  DWORD dwRet;
  short nPort = *(short*)  lpParam;
  delete lpParam;

  SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
  if(sock == INVALID_SOCKET)
  {
    AfxMessageBox("创建套接字失败!");
    dwRet = ERROR_CREATE_SOCKET;
  }
  else
  {
    unsigned long flag = 1;
    if ((ioctlsocket(sock, FIONBIO, &flag) != 0))
    {
      AfxMessageBox("未能改为非阻塞模式!");
      dwRet = ERROR_MODIFY_FIONBIO;
    }
    else
    {
      sockaddr_in severAddr;
      severAddr.sin_family = AF_INET;
      severAddr.sin_port = htons(nPort);
      severAddr.sin_addr.S_un.S_addr = g_ulAddr;
      connect(sock, (sockaddr*)&severAddr, sizeof(severAddr));

      struct fd_set mask;
      FD_ZERO(&mask);
      FD_SET(sock, &mask);

      struct timeval timeout;
      timeout.tv_sec = g_dwTimeOut / 1000;
      timeout.tv_usec = g_dwTimeOut % 1000;

      switch(select(0, NULL, &mask, NULL, &timeout))
      {
      case -1:
        dwRet = ERROR_SELECT;
        break;

      case 0:
        dwRet = ERROR_SELECT_TIMEOUT;
        break;

      default:
        dwRet = ERROR_SUCCESS;
      };
    }
    closesocket(sock);
  }
  g_nThreadCount --;
  if (dwRet == ERROR_SUCCESS)
  {
    ::SendMessage(g_hWnd, SCAN_THREAD, DOSCAN_FIND_PORT, nPort);
  }
  else
  {
    ::SendMessage(g_hWnd, SCAN_THREAD, DOSCAN_END_PORT, nPort);
  }
  return dwRet;
}

三、运行结果

本程序在VC6+WinXp下编写调试运行正确,在Win98下运行正确。

在我的计算机扫描本机1-5000号端口,超时设置1000ms,200个最大线程数,约需要45秒。当超时设置再短一些时速度可达每秒150个端口的速度。

四、结束语

事实上,速度要想再提高,可能需要其它方法了。如果线程数开得过多,则由于线程的调度开销过大,速度反而会降低。如果超时设置过短,可能引起扫描的结果不正确(这须视网络情况决定),并且由于是多线程,超时等待的时间也可能小于因线程调度而等待的时间,则也不能提高速度。

另外我还发现了一个问题,就是扫描本机时,如果以IP地址127.0.0.1时,则139#端口没有开放;如果设置为本机的实际IP时则139#端口是开放的,这不知是何原因,还望高手指点。

本程序还有一个需要改进的地方,就是不象大多数端口扫描器可扫描指定的IP段,而只设计成扫描指定的某一台主机。

本文配套源码

上一页  1 2 

Tags:一个 简单 端口

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接