学用C++进行Winsock编程(三)──Client端
closesocket(sk);?牔?
return 1;??
}??
/*这是一个既可以将IP地址转换成网际地址,又可以将用域名表示的地址转换成网际地址的函数──ServerIp*/
unsigned long ServerIp(charserverip)??
{??
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端的编程。