标题学用C++进行Winsock编程(三)──Client端
栏目软件世界
作者朱小华
发布2001年3期
CloseHandle(hMutex);
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(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端的编程。