以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  一个多线程的简单端口扫描程序  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=40737)


--  作者:NoProblem
--  发布时间:12/1/2006 2:32:00 PM

--  一个多线程的简单端口扫描程序
大家帮忙看一下,代码可以通过调试,但是没有结果。看看是什么原因 ,帮忙调试一下。谢谢。#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include<windows.h>
#pragma comment (lib,"ws2_32.lib")
DWORD WINAPI pScan(LPVOID lp);
int nowport;
int startPort;
int endPort;
typedef struct
{
 char ip[20];
 int port;
}infor;
void  main (int argc, char *argv[])
{

   WSADATA wsa;
   HANDLE hThread1;
   HANDLE hThread2;
   HANDLE hThread3;
   infor m_infor={0};
   startPort=atoi(argv[2]);
   endPort=atoi(argv[3]);
   
   //infor *lpinfor=(infor *)lp;
   strcpy(m_infor.ip,argv[1]);
   if (WSAStartup(MAKEWORD(2,2),&wsa)!=0)
   {
    printf("start up failed \n");
       exit(-1);
   }
   hThread1=CreateThread(NULL,0,pScan,&m_infor,0,NULL);
   hThread2=CreateThread(NULL,0,pScan,&m_infor,0,NULL);
   hThread3=CreateThread(NULL,0,pScan,&m_infor,0,NULL);
   Sleep(1000);
   //
   printf("asd  ");
}
DWORD WINAPI pScan(LPVOID lp)
{
 SOCKET sock;
 struct sockaddr_in sin;
    nowport=endPort;
 while(nowport<endPort)
    {   
        infor *lpinfor=(infor *)lp;
  sock=socket(AF_INET,SOCK_STREAM,0);
        sin.sin_family=AF_INET;
  sin.sin_addr.s_addr=inet_addr(lpinfor->ip);
        sin.sin_port=htons(nowport);
        if(connect(sock,(struct sockaddr *)&sin,sizeof(sin))!=SOCKET_ERROR)
  {
   printf("\n%d port open\n",ntohs(sin.sin_port));
           // nowport++;
   Sleep(10);
  }
        closesocket(sock);
        nowport++;
 }
 printf("asdt   ");
 return 1;
}

有什么建议的话 请与我联系一下  qq 490535635


--  作者:longshentailang
--  发布时间:12/11/2006 10:15:00 PM

--  
你这个程序只是创建了3个线程,每个线程对指定IP的主机的指定端口范围进行全部扫描,所以应该会有3份相同的结果,即一个结果重复出现了3次。同时,你的Pscan函数中的nowport=endPort;应该改为nowport=startport;

--  作者:longshentailang
--  发布时间:12/11/2006 10:18:00 PM

--  
以下是我改的代码,你可以看看不同之处:

#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib,"ws2_32.lib")

void  WaitThreadEnd(void);
DWORD WINAPI pScan(LPVOID lp);

int nowport;
int startPort;
int endPort;
int maxth = 0;

typedef struct
{
 char ip[20];
 int  port;
}infor;

void main(int argc,char *argv[])
{
   HANDLE hThread;
   infor m_infor={0};
   
   startPort=atoi(argv[2]);
   endPort=atoi(argv[3]);

   //计算线程总数
   maxth = endPort - startPort+1;
   strcpy(m_infor.ip,argv[1]);

   printf("\n");

   for (startPort;startPort<=endPort;startPort++)
   {
    m_infor.port = startPort;
    hThread = CreateThread(NULL,0,pScan,(LPVOID)&m_infor,0,NULL);
    //延时
    Sleep(10);
   }
   // 等待所有的线程结束
   WaitThreadEnd();
}

DWORD WINAPI pScan(LPVOID lp)
{
 SOCKET  sock;
 WSADATA     wsa; 
 sockaddr_in sin;
 
 if (WSAStartup(MAKEWORD(2,2),&wsa)!=0)
 {
  printf("start up failed \n");
  exit(-1);
 }

 infor *lpinfor=(infor *)lp;
    nowport=lpinfor->port;
  
 sock=socket(AF_INET,SOCK_STREAM,0);
 if (sock == INVALID_SOCKET)
 {
  printf("\r\nSock Error:%s", WSAGetLastError());
  return -1;
 }

    sin.sin_family=AF_INET;
 sin.sin_addr.s_addr=inet_addr(lpinfor->ip); 
    sin.sin_port=htons(lpinfor->port);
        
 if(connect(sock,(struct sockaddr *)&sin,sizeof(sin)) == 0)
 {
  printf("%d port is open\n",ntohs(sin.sin_port));
        Sleep(10);
 }
 
 closesocket(sock);

 maxth--;
 return 1;
}

//等待线程结束函数
void WaitThreadEnd()
{
 //延时
 Sleep(6000);

 //显示等待提示
 printf("\r     \r\n");
 printf(" Wait ( %d )Thread end...\r\n", maxth);

 for(;;)
 {
   //判断所有线程是否已经结束
   if(maxth > 0)
   {
     //延时等待线程序结束
     Sleep(100);
     continue;
   }
   else break;
 }
 printf("\r\n");
 return;
}


--  作者:longshentailang
--  发布时间:12/11/2006 10:21:00 PM

--  
测试用例:PortScanner.exe" 192.168.1.1 20 1030

输出结果如下(改了一下格式):
25 port is open
80 port is open
135 port is open
139 port is open
443 port is open
1025 port is open

Wait ( 0 )Thread end...


--  作者:sytyong
--  发布时间:11/21/2008 7:28:00 PM

--  
C++做的 顶
W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms