首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

請大家來幫幫小弟我…C程序轉BCB

2012-02-12 
請大家來幫幫我……C程序轉BCB小弟最近在做畢業設計,題目是做一個端口探測工具。現在小弟在網上找了一篇用C寫

請大家來幫幫我……C程序轉BCB
小弟最近在做畢業設計,題目是做一個端口探測工具。
現在小弟在網上找了一篇用C寫的源代碼,經過修改,添加了計時器,使用了多線程,代碼效率已經大為提高,然而現在導師希望我將其界面化,可是我不怎麼會用一些高級工具,唯一瞭解並且手頭上只有BCB,希望各位大大可以幫我轉一下。

需求如下,將源代碼寫入一個Button控件的onclick事件中,在Edit控件上輸入IP、端口。並將其輸出結果顯示在Memo控件中就可以。


源代碼如下(有代碼註釋,可以在BCB中運行):

#include <stdio.h>
#include <winsock2.h>//socket要用的头文件
#include <windows.h>//mutex(互斥量)要用的头文件
#include <time.h>//计时器 头文件
#include <process.h>//多线程要用的头文件

#define NETWORK_ERROR -1//基本的一些宏定义
#define NETWORK_OK 0
#define PORT_MIN 1
#define PORT_MAX 65535

/*
 *gcc -g a.c -lwsock32//注释 没用
 * */
//HANDLE hThread;
DWORD hID;
time_t time0;
HANDLE mutex0;

char hostname[30];

int starting_port = 0;
int ending_port = 0;
int nopen = 0;

void portscan();//扫描函数
void showtime();//计时器
int getmutex();//访问互斥变量

int main(){
int ret,j;//ret是用来存储返回值,进行错误处理.j用在下边的for循环,创建线程

WSADATA dat;
DWORD version;
mutex0 = CreateMutex(0,0,0);//创建互斥变量

version = MAKEWORD(2,2);
ret = WSAStartup(version,&dat);//应用程序或DLL只能在一次成功的WSAStartup()调用之后才能调用进一步的Windows Sockets API函数.

if(ret != 0){ 
printf("Error initializing Winsock.\n");
WSACleanup();
return NETWORK_ERROR;
}

if(ret == 0){

printf("Enter hostname:");//输入目标地址
scanf("%s",hostname);

printf("Enter starting port:");
scanf("%d",&starting_port);

if(starting_port < PORT_MIN){
printf("Invalid port number.\n");
WSACleanup();
return NETWORK_ERROR;
}

printf("Enter ending port:");
scanf("%d",&ending_port);

if(ending_port > PORT_MAX){
printf("Invalid port number.\n");
WSACleanup();
return NETWORK_ERROR;
}


printf("\nScanning [%s]...\n",hostname);

time0 = time(0);//取得系统时间,作为初始时间

for(j=0;j<20;j++)//创建线程 我建了20个
_beginthread(portscan,0,0);
while(starting_port <= ending_port)//看扫描有没有结束,如里没结束就等3秒再次判断
Sleep(3000);
printf("Scaning completed.\n");
showtime();//输出本次扫描使用的时间
Sleep(-1);
}
CloseHandle(mutex0);//清除互斥锁
WSACleanup();//扫尾
return NETWORK_OK;
}

void portscan(){//主要函数,用来扫描各个端口
int i,nret;
  SOCKET thesocket;
  SOCKADDR_IN hostinfo;



while((i=getmutex()) <= ending_port ){//i=getmutex() 取得一个未扫描的端口,进行扫描.
LPHOSTENT hostent;
hostent = gethostbyname((hostname));//取得IP地址,存入hostent变量

//SOCKET thesocket;
thesocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//创建socket

//SOCKADDR_IN hostinfo;//hostinfo用来存放服务器IP,本次扫描的端口等

hostinfo.sin_family = AF_INET;
hostinfo.sin_addr=*((LPIN_ADDR)*hostent->h_addr_list);
hostinfo.sin_port = htons(i);

nret = connect(thesocket,(LPSOCKADDR)&hostinfo,sizeof(hostinfo));//进行连接,看端口有没有开放

if(nret == 0){//如果端口开放,输出端口号
printf("\t%d\tis opened\n",i); 
++nopen;
closesocket(thesocket);//关闭连接
}

}

}

void showtime(){

int a;
printf("time used: %d secends\n",a=time(0)-time0);//取得当前时间,减去初始时间,即已使用的时间
}

int getmutex(){
int a;

WaitForSingleObject(mutex0,INFINITE);//等待互斥锁的使用权
a = starting_port;
starting_port++;
ReleaseMutex(mutex0);//释放互斥锁

return a;
}

[解决办法]


上面的有些问题,这个是可运行的

C/C++ code
//---------------------------------------#include <vcl.h>#pragma hdrstop#include "nettest.h"//#include <stdio.h>#include <winsock2.h> //socket要用的头文件#include <windows.h> //mutex(互斥量)要用的头文件#include <time.h> //计时器 头文件#include <process.h> //多线程要用的头文件//---------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"#define NETWORK_ERROR -1 //基本的一些宏定义#define NETWORK_OK 0#define PORT_MIN 1#define PORT_MAX 65535DWORD hID;time_t time0;HANDLE mutex0;char hostname[30];int starting_port = 0;int ending_port = 0;int nopen = 0;void portscan(); //扫描函数void showtime(); //计时器int getmutex(); //访问互斥变量TForm1 *Form1;//---------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)        : TForm(Owner){}//---------------------------------------void portscan(void *){ //主要函数,用来扫描各个端口int i,nret;  SOCKET thesocket;  SOCKADDR_IN hostinfo; String mess;while((i=getmutex()) <= ending_port ){ //i=getmutex() 取得一个未扫描的端口,进行扫描.LPHOSTENT hostent;hostent = gethostbyname((hostname)); //取得IP地址,存入hostent变量//SOCKET thesocket;thesocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //创建socket//SOCKADDR_IN hostinfo; //hostinfo用来存放服务器IP,本次扫描的端口等hostinfo.sin_family = AF_INET;hostinfo.sin_addr=*((LPIN_ADDR)*hostent->h_addr_list);hostinfo.sin_port = htons(i);nret = connect(thesocket,(LPSOCKADDR)&hostinfo,sizeof(hostinfo)); //进行连接,看端口有没有开放if(nret == 0){ //如果端口开放,输出端口号{   //printf("\t%d\tis opened\n",i);   mess.printf("\t%d\tis opened",i);   Form1->Memo1->Lines->Add(mess);}++nopen;closesocket(thesocket); //关闭连接}}}void showtime(){String mess;int a;//  printf("time used: %d secends\n",a=time(0)-time0); //取得当前时间,减去初始时间,即已使用的时间mess.printf("time used: %d secends",a=time(0)-time0); //取得当前时间,减去初始时间,即已使用的时间Form1->Memo1->Lines->Add(mess);}int getmutex(){int a;WaitForSingleObject(mutex0,INFINITE); //等待互斥锁的使用权a = starting_port;starting_port++;ReleaseMutex(mutex0); //释放互斥锁return a;}void __fastcall TForm1::Button1Click(TObject *Sender){int ret,j; //ret是用来存储返回值,进行错误处理.j用在下边的for循环,创建线程String mess;WSADATA dat;DWORD version;mutex0 = CreateMutex(0,0,0); //创建互斥变量version = MAKEWORD(2,2);ret = WSAStartup(version,&dat); //应用程序或DLL只能在一次成功的WSAStartup()调用之后才能调用进一步的Windows Sockets API函数.if(ret != 0){  //printf("Error initializing Winsock.\n");Memo1->Lines->Add("Error initializing Winsock");WSACleanup();return;// NETWORK_ERROR;}if(ret == 0){//printf("Enter hostname:"); //输入目标地址//scanf("%s",hostname);strcpy(hostname,Edit1->Text.c_str());  //Edit1   目标地址//printf("Enter starting port:");//scanf("%d",&starting_port);starting_port=StrToIntDef(Edit2->Text,PORT_MIN); // Edit2 起始端口if(starting_port < PORT_MIN){//printf("Invalid port number.\n");Memo1->Lines->Add("Invalid port number");WSACleanup();return;// NETWORK_ERROR;}//printf("Enter ending port:");//scanf("%d",&ending_port);ending_port=StrToIntDef(Edit3->Text,PORT_MAX); // Edit3 终止端口if(ending_port > PORT_MAX){//printf("Invalid port number.\n");Memo1->Lines->Add("Invalid port number");WSACleanup();return;// NETWORK_ERROR;}//printf("\nScanning [%s]...\n",hostname));mess.printf("Scanning [%s]...",hostname);Memo1->Lines->Add(mess);time0 = time(0); //取得系统时间,作为初始时间for(j=0;j<20;j++) //创建线程 我建了20个_beginthread(portscan,0,0);while(starting_port <= ending_port) //看扫描有没有结束,如里没结束就等3秒再次判断Sleep(3000);//printf("Scaning completed.\n");Memo1->Lines->Add("Scaning completed");showtime(); //输出本次扫描使用的时间//Sleep(-1);}CloseHandle(mutex0); //清除互斥锁WSACleanup(); //扫尾return ;//NETWORK_OK;}//--------------------------------------- 

热点排行