各位大神,請教一下,我寫了一個埠掃描程式,不過是只能掃描到一個開放的埠,同學告訴我寫的是單執行緒的,那怎么實作多執行緒的?能不能在我的代碼上改一改?
#include <stdio.h>
#include <winsock.h>
#include <windows.h>//加這個頭檔案
#include<commctrl.h>
#include<stdlib.h>
//#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"ws2_32.lib")
#define NETWORK_ERROR -1
#define NETWORK_OK 0
#define PORT_MIN 1
#define PORT_MAX 65535
HANDLE hThread;
DWORD hID;
char hostname[30];
int starting_port = 0;
int ending_port = 0;
int nopen = 0;
DWORD portscan();
int main()
{
int ret;
WSADATA dat;
//WSADATA結構被用來儲存呼叫AfxSocketInit全域函式回傳的Windows Sockets初始化資訊。
DWORD version;
version = MAKEWORD(2,2);
//MAKEWORD(2,2)表示使用WINSOCK2版本.wsaData用來存盤系統傳回的關于WINSOCK的資料.
ret = WSAStartup(version,&dat);
//此函式在應用程式中初始化winsockDLL,格式:int PASCAL FAR WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData );
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);
hThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)portscan,0,0,&hID);
//Thread1 = CreateThread( 0, 默認安全級別 0, 堆疊大小默認(2M) ThreadProc,執行緒入口函式 0,引數沒有 0,創建時的狀態,&Thread1ID獲得執行緒ID);
if(hThread == 0)
{
printf("Failed to create thread.\n");
WSACleanup();
return NETWORK_ERROR;
}
Sleep(-1);
}
WSACleanup();
//WSAStartup應該與WSACleanup成對使用,WSAStartup的功能是初始化Winsock DLL,
//WSACleanup是來解除與Socket庫的系結并且釋放Socket庫所占用的系統資源。
return NETWORK_OK;
}
DWORD portscan()
{
int i,nret;
SOCKET thesocket;
LPHOSTENT hostent;
thesocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//第一個變數為協議簇,第二個變數為套接字型別,第三個變數為使用的通信協議
hostent = gethostbyname((hostname)); //gethostbyname()回傳對應于給定主機名的包含主機名字和地址資訊的hostent結構指標。
for(i = starting_port;i < ending_port+1;++i)
{
SOCKADDR_IN hostinfo;
hostinfo.sin_family = AF_INET;
hostinfo.sin_addr=*((LPIN_ADDR)*hostent->h_addr_list); //sin.addr儲存IP地址
hostinfo.sin_port = htons(i); //sin_port儲存埠號
//htons 是將整型變數從主機位元組順序轉變成網路位元組順序, 就是整數在地址空間存盤方式變為:高位位元組存放在記憶體的低地址處。
nret = connect(thesocket,(LPSOCKADDR)&hostinfo,sizeof(hostinfo));
//引數一:套接字描述符
//引數二:指向資料機構sockaddr的指標,其中包括目的埠和IP地址
//引數三:引數二sockaddr的長度,可以通過sizeof(struct sockaddr)獲得
//回傳值為0代表成功
if(nret == 0)
{
printf("\n\t%d\n",i);
++nopen;
}
}
printf("\nScan complete.\n\n");
printf("Number of ports opened = %d\n",nopen);
closesocket(thesocket);
return 0;
}
有些注釋寫得比較長,為了讓同學們看懂。。還請大神們指教啊。謝謝了!
uj5u.com熱心網友回復:
太棒了((^^))轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/130039.html
上一篇:OpenGL語言怎么控制小車后退
