我写了一个类似端口扫描的程序这是头文件tmportscan.h里面的面容#pragma once#include <windows.h>
#include <iostream.h>
#include <winsock.h>
#include <io.h>#pragma comment(lib,"wsock32.lib")class tmportscan
{
public:int sockfd; //用于扫描的套接字
sockaddr_in myaddr;//本地地址信息
sockaddr_in thaddr;//扫描目标地址信息
unsigned int startport;//开始扫描的端口
unsigned int endport;//结束扫描的端口
char *thIP;//扫描目标的IP
tmportscan();
int tmInitSocket(char*thip,unsigned int startport,unsigned int endport);//初始化.
int tmGetSocket(void);//获取套接字
int tmSetObjIP(char*ip);//设置目标IP
int tmSetPort(unsigned int startport,unsigned int endport);//设置扫描端口int tmScan(void);//扫描程序
~tmportscan(){WSACleanup();}; //析构函数释放资源
};
tmportscan::tmportscan()
{
//if(this->tmInitSocket()!=0)
// MessageBox(NULL,"初始化错误",0,MB_OK);
}
int tmportscan::tmGetSocket(void)
{
return this->sockfd = socket(AF_INET, SOCK_STREAM, 0);
}
int tmportscan::tmInitSocket(char*thip,unsigned int startport,unsigned int endport)
{
WORD wVersionRequested = MAKEWORD( 2, 1 );
WSADATA wsadata;
int err=WSAStartup(wVersionRequested,&wsadata);
if(err!=0)
return -1;
this->sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(this->sockfd==-1)
return -1;
//
this->thIP=thip;
this->startport=startport;
this->endport=endport;
//
//初始化本地
memset(&this->myaddr,0,sizeof(sockaddr_in));
this->myaddr.sin_family=AF_INET;
this->myaddr.sin_port=htons(0);
this->myaddr.sin_addr.s_addr=INADDR_ANY;//本地IP
//初始化目标
memset(&this->thaddr,0,sizeof(sockaddr_in));
this->thaddr.sin_family=AF_INET;
this->thaddr.sin_port=htons(0);
this->thaddr.sin_addr.s_addr=inet_addr(this->thIP);//目标IP
return 0;
}
int tmportscan::tmSetObjIP(char*ip)
{
if(ip==NULL)
return -1;
this->thIP=ip;
return 0;
}
int tmportscan::tmSetPort(unsigned int startport,unsigned int endport)
{
this->startport=startport;
this->endport=endport;
return 0;
}int tmportscan::tmScan(void)
{
unsigned int port;
port=this->startport;
cout<<"目标:"<<this->thIP<<endl;
int err;
while(1)
{
this->thaddr.sin_port=htons(port);
//unsigned long no=1;
//err=ioctlsocket(this->sockfd,FIONBIO,&no);
err=connect(this->sockfd,(sockaddr*)&this->thaddr,sizeof(sockaddr));
/*
//select()的应用.
fd_set reads;
fd_set writes;
fd_set excpts;
FD_ZERO(&reads);
FD_ZERO(&writes);
FD_ZERO(&excpts);
timeval out;
out.tv_sec=0;
out.tv_usec=1000*5;//5毫秒
select(this->sockfd+1,&reads,&writes,&excpts,&out);
if(FD_ISSET(this->sockfd,&reads))
{
//正在读
}
if(FD_ISSET(this->sockfd,&writes))
{
//正在写
}
if(FD_ISSET(this->sockfd,&excpts))
{
//出现意外
}
*/
if(err==-1)
{
cout<<"端口"<<port<<" close"<<endl;
}
else
{
cout<<"端口"<<port<<"  open"<<endl;
close(this->sockfd);
if(this->tmGetSocket()==-1)
break;
}
port++;
if(port>this->endport)
break;
}
return 0;
}
下面是main.cpp里面的内容#include"tmportscan.h"void main(void)
{char objip[15];
unsigned int start;
unsigned int end;
while(1)
{
cout<<"请输入扫描目标IP:";
cin>>objip;cout<<"请输入开始扫描端口:";
cin>>start;
cout<<"请输入扫描结束端口:";
cin>>end;
tmportscan pt;
pt.tmInitSocket(objip,start,end);
pt.tmScan();
}
}该程序在扫描的时候速度非常的慢~
扫描本机都很慢
更不要说扫描网外的机器了?
各位大侠知道如何提搞它的扫描速度?
在这里用select好像没什么意义.

解决方案 »

  1.   

    raw socket是什么东西啊?
    资料上有讲seledt()但我有点不会使用?好像是关于速度的吧
    多线程我现在还不会
      

  2.   

    raw socket是原始套接字
    在程序中用了SOCK_RAW,但速度还是没变啊~
    谁会多线程啊?给个例子
      

  3.   

    C没写过!用java写一个也不快!多线程好像对于时间片的轮换提高也不多!多核的除外!
      

  4.   

    你的connect函数是阻塞的,当你连接一个被屏蔽的端口时,需要花很长时间的
      

  5.   

    你需要把socket设置为非阻塞的,select才会有效