微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题学用C++进行Winsock编程(三)──Client端
栏目软件世界
作者朱小华
发布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(WSAStartup(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端的编程。