学用C++进行Winsock编程(三)──Client端

Author: 朱小华 Date: 2001年 3期

    CloseHandle(hMutex);?牔?
      closesocket(sk);?牔?
      return 1;??
      }??
      /*这是一个既可以将IP地址转换成网际地址,又可以将用域名表示的地址转换成网际地址的函数──ServerIp*/
      unsigned long ServerIp(charserverip)??
      {??
      hostent*host;??
      unsigned long ulTemp=inet_addr(serverip);
      if(ulTemp==INADDR_NONE)/*如果不能用inet_addr转换成网际地址,则表示这是一个用域名表示的地址*/
      {??
      host=gethostbyname(serverip);?牔?
      if(host==NULL)return INADDR_NONE;//无效的地址
      ulTemp=*((unsigned long*)host→h_addr_list[0]);?牐牔?
      }??
      return ulTemp;
      }??
      /*调用方法为:*/
      unsigned long Ip=ServerIp(“202.205.210.2”);
      也可以是:??
      unsigned long Ip=ServerIp(“www.cfan.cn.net”);?牔?
      /*总之,只要是一个有效的地址,这个函数就会返回网际地址,如果所给地址无效,则返回INADDR_NONE;*/
      //以下是窗体的构造函数
      _fastcall TForLover::TForLover(TComponent* Owner)??
        :TForm(Owner)??
      {??
      WSADATA wsaData;??
      if?煟╓SAStartup(0x101,&wsaData))MessageBox(NULL,“WINSOCK版本不行”,“错误”,MB_OK);?牔?
      }??
      /*单击按钮,开始扫描*/
      void _fastcall TForLover::Button1Click(TObject*Sender)??
      {??
      HANDLE hMutexHandle=CreateMutex(NULL,false,mutexName);?牔?
      try
      {??
      int Result=0,
      startPort=PortStart→Text.ToInt()-1
      endPort=PortEnd→Text.ToInt();?煟牔?
      char szResult[56];??
      ZeroMemory(gscan,sizeof(g_scan)*threadNum);?牔?
      usPart=(unsigned short)(endPort-startPort)/threadNum;
      Button1→Enabled=false;??
      Application→ProcessMessages();?煟牔?
      for(int i=0;i<threadNum;i++)??
      {??
      strcpy (gscan [i].szFile,edResult→Text.c_str());?煟牐牔?
      strcpy(gscan[i].szMutex,mutexName);?牔?
      gscan[i].sPort=i*usPart+startPort+1;??
      //线程的起始端口
      if(i==threadNum-1)??
       gscan[i].ePort=endPort;??
      else
       gscan[i].ePort=(i+1)*usPart+startPort;
      gscan[i].goalIp=ServerIp(edHost→Text.c_str());?煟牐牔?
      hThread [i]=CreateThread(NULL,0,ScanPort,(LPVOID)&gscan[i],0,&dwThreadId);?牔?
      SetThreadPriority(hThread[i],THREAD_PRIORITY_HIGHEST);?牔?
      }??
      while(1)??
      {??
      iLiveThread=0;??
      for(int j=0;j<threadNum;j++)??
      {??
      GetExitCodeThread(hThread[j],&dwThreadCode);?牔?
      /*这是检测线程是否已经结束的代码*/
      /*用GetExitCodeThread函数来检测线程是否已经结束*/
      if(dwThreadCode==STILL_ACTIVE)iLiveThread++;
      }??
      if(iLiveThread==0)break;/*如果iLiveThread为0则表示已经没有活动的线程,则终止while循环*/
      Sleep(3000);?牔?
      }??
      for(int a=0;a<threadNum;a++)??
      {??
      Result+=gscan[a].Result;//统计结果
      CloseHandle(hThread[a]);//关闭句柄
      }??
      wsprintf(szResult,“已经结束扫描,共发现%d个目标,请查看结果文件!”,Result);?牔?
      MessageBox(Handle,szResult,“提醒”,MB_OK);?牔?
      }??
      catch(...){MessageBox(Handle,“错误”,“警告”,MB_OK);}?牔牓?
      CloseHandle(hMutexHandle);?牔?
      Button1→Enabled =true;??
      }??
      /*在窗体的最后进行清理*/
      void _fastcall TForLover::FormDestroy(TObject *Sender)??
      {??
      WSACleanup();?煟牔?
      编后:至此,关于Client端的编程就介绍完了。下一次,我们将继续为大家介绍关于Server端的编程。