admireO:
只开一个线程没任何问题。
把
for(int i=0;i<(line/10);i++)
{
for(int j=0;j<10;j++)
{
//创建线程
}
}改成for(int i=0;i<10;i++)//改的这里
{
for(int j=0;j<10;j++)
{
//创建线程
}
}
也没有任何问题。
但上面那样就阻塞
只开一个线程没任何问题。
把
for(int i=0;i<(line/10);i++)
{
for(int j=0;j<10;j++)
{
//创建线程
}
}改成for(int i=0;i<10;i++)//改的这里
{
for(int j=0;j<10;j++)
{
//创建线程
}
}
也没有任何问题。
但上面那样就阻塞
{
//get data without a blocking recv so we dont hang if we crash the server
char *buffer;
char data[2001];
unsigned long on=1;
unsigned long off=0;
char waste[2001];
int p, i=1;
int t;
memset(data,0,2001);
p=ioctlsocket(SockFD,FIONBIO,&on);
memset(waste,0,2001);
for(t=1;t<10;t++){
i=recv(SockFD, waste, 2000, 0);
if(i>0)
break;
Sleep(500);
}
waste[i]='\0';
strncat(data,waste,2000);
buffer = ( char * )malloc( 2000 * sizeof( char ) );
strncpy( buffer, data, 2000 );
return buffer;
}
//发送CGI请求的线程
UINT getcgi(LPVOID pParam)
{
char* rbuff;
struct cgi* tcgi=(struct cgi *)pParam;
CString hole=tcgi->url;
CString url="GET ";
url+=hole;
url+=" HTTP/1.0\r\n";
int num=tcgi->n;
char *rmt_host=tcgi->rmt_host;
CScanDlg* dlg=tcgi->mydlg;
SOCKET sockfd;
SOCKADDR_IN addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
{
exit(0);
}
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.s_addr = inet_addr(rmt_host);
int r = connect(sockfd,(struct sockaddr *) &addr, sizeof(addr));
send(sockfd,url,url.GetLength(),0);
rbuff = GetData(sockfd);
CString display="\t发现";
display+=hole;
display+="漏洞\r\n";
if (strstr(rbuff,"200 OK")!=NULL)
{
printf(display);
}
closesocket(sockfd);
return 0;
}搞定了,加上GetData函数把getcgi函数改成上面就可以了。