这个不是多线程很慢.....

结果先:

  1. 000-failed 192.168.1.113 :: 20  
  2. 111-success 192.168.1.113 :: 21  
  3. 000-failed 192.168.1.113 :: 22  
  4. 000-failed 192.168.1.113 :: 23  
  5. 000-failed 192.168.1.113 :: 24  
  6. 000-failed 192.168.1.113 :: 25  
  7. 000-failed 192.168.1.113 :: 26  
  8. 000-failed 192.168.1.113 :: 27  
  9. 000-failed 192.168.1.113 :: 28  
  10. 000-failed 192.168.1.113 :: 29  
  11. 请按任意键继续. . . 

程序:

  1. #include <WinSock2.h>  
  2. #include <stdio.h>  
  3. #include <time.h>  
  4. #include <iostream>  
  5. #pragma comment(lib, "ws2_32.lib")  
  6.  
  7. clock_t start, end;  
  8. float   costtime;  
  9.  
  10. void usage(void)  
  11. {  
  12.     std::cout<<"\tusage: Tcpscan RemoteIP StartPort - EndPort\n";  
  13.     std::cout<<"\tExample: TcpScan 192.168.1.1 80-100 \n";  
  14. }  
  15.  
  16. int main(int argc, char **argv)  
  17. {  
  18.     char  *host;  
  19.     int   nStartPort, nEndPort;  
  20.     char  *pPortIntervals;  
  21.     if(argc != 3)  
  22.     {  
  23.         usage();  
  24.         return 0;  
  25.     }  
  26.     // 处理端口参数  
  27.     pPortIntervals = argv[2]; // store  
  28.     if (strstr(argv[2], "-"))  
  29.     {  
  30.         nStartPort = atoi(argv[2]);  
  31.         for(; *pPortIntervals; )  
  32.         {  
  33.             if(*(pPortIntervals++) == '-')  
  34.                 break;  
  35.         }  
  36.         nEndPort = atoi(pPortIntervals);  
  37.         //   
  38.         if(nStartPort<1 || nEndPort>65535)  
  39.         {  
  40.             std::cout<<"Port Error!"<<std::endl;  
  41.             return 0;  
  42.         }  
  43.     }  
  44.     // Target - IP  
  45.     host = argv[1];  
  46.     // socket;  
  47.     WSADATA     ws;   
  48.     SOCKET      socketUse;  
  49.     struct      sockaddr_in  addr;  
  50.     int         result;  
  51.     long        lResult;  
  52.     char        tempBuf[256];  
  53.     // address ip MAKEWORE(1,1)和MAKEWORD(2,2)的区别在于,前者只能一次接收一次,不能马上发送,而后者能  
  54.     lResult     = WSAStartup(MAKEWORD(2, 2), &ws);  
  55.     addr.sin_family = AF_INET;  
  56.     addr.sin_addr.s_addr = inet_addr(host);  
  57.     // 每个端口,开一个socket  
  58.     start = clock();   
  59.     for(int nPort = nStartPort; nPort < nEndPort; nPort++)  
  60.     {  
  61.         socketUse = socket(AF_INET, SOCK_STREAM, 0);  
  62.         addr.sin_port = htons(nPort);  
  63.         if(socketUse == INVALID_SOCKET)  
  64.             break;  
  65.         // connect  
  66.         result = connect(socketUse, (struct sockaddr*)&addr, sizeof(addr));  
  67.         if(result == 0)  
  68.         {  
  69.             // 根据返回值判断端口是否开放  
  70.             sprintf_s(tempBuf, "111-success %s :: %d \n", host, nPort);  
  71.             std::cout<<tempBuf;  
  72.             closesocket(socketUse);  
  73.         }else 
  74.         {  
  75.             sprintf_s(tempBuf, "000-failed %s :: %d \n", host, nPort);  
  76.             std::cout<<tempBuf;  
  77.         }  
  78.     }//end for  
  79.     end = clock();  
  80.     costtime = (float)(end - start);  
  81.     sprintf_s(tempBuf, " Cost time: %f second", costtime);  
  82.     WSACleanup();  
  83.     system("pause");  
  84.     return 1;