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++)
  {
    //创建线程  
  }
}
也没有任何问题。
但上面那样就阻塞

解决方案 »

  1.   

    不会吧,按照你所说的,无论line为多少(只要line>= 10)程序第一次执行里面的循环都是一样的了,那debug的时候line是为多少呢?
      

  2.   

    只要line>= 10,按照你所说的,程序第一次执行for( int j = 0;j < 10,j++ )都是一样的,不论外面的循环是for(int i = 0;i < (line/10);i++ )还是for( int i = 0;i < 10;i++ )那你的line是不是>= 10呢?不过如果不大于10那又不可能执行到线程里
      

  3.   

    不要用同步的Socket,用异步方式就没问题了!
      

  4.   

    Chice_wxg:       请问,异步的socket怎么用啊?恳请指教啊!!!!!!!
      

  5.   

    char *GetData(int SockFD)
    {
        //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函数改成上面就可以了。