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

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    {

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    {

GetExitCodeThread(hThread[j],&dwThreadCode);

/*这是检测线程是否已经结束的代码*/
   /*用GetExitCodeThread函数来检测线程是否已经结束*/
   if(dwThreadCode==STILL_ACTIVE)iLiveThread++;
   }

if(iLiveThread==0)break;/*如果iLiveThread为0则表示已经没有活动的线程,则终止while循环*/
   Sleep(3000);

}

for(int a=0;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端的编程。