?? tcpps.cpp
字號:
#pragma pack (4)
#pragma comment (lib, "Ws2_32.lib")
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdlib.h>
#include <iostream.h>
#define STATUS_FAILED 0xFFFF //錯誤碼
unsigned long serverIP; //掃描的服務器地址
long MaxThread = 200; //最大允許的掃描線程數
long ThreadCount = 0; //當前正在掃描的線程數
long *aa=&ThreadCount;
DWORD WINAPI ScanPort(LPVOID lpParam); //掃描端口的線程
void main (int argc, char *argv[])
{
if(argc!=2)
{
cout<<"usage: tcpportscan ScanUsePort serverip "<<endl;
return;
}
WSADATA WSAData;
if(WSAStartup(MAKEWORD(2,2),&WSAData) != 0) //開始使用Ws2_32.dll
{
cout<<"WSAStartup failed: "<<GetLastError()<<endl;
ExitProcess(STATUS_FAILED);
}
serverIP=inet_addr(argv[1]);
cout<<"使用中的端口號: "<<endl;
for(int i=1;i<1024;i++)
{
while (ThreadCount >= MaxThread) //超過最大允許線程數,等待
{
Sleep(10);
}
DWORD ThreadID;
//創建線程,掃描端口
CreateThread(NULL,0,ScanPort,(LPVOID)new short(i),0,&ThreadID);
}
while (ThreadCount > 0) //還有未完成的線程,等待
{
Sleep(50);
}
WSACleanup(); //調用WSACleanup函數來解除與Socket庫綁定并且釋放Socket庫所站用的系統資源
}
//掃描斷口的線程
DWORD WINAPI ScanPort(LPVOID lpParam)
{
short Port = *(short*) lpParam;
InterlockedIncrement(aa); //線程數目+1
SOCKET sock=socket(AF_INET, SOCK_STREAM, 0); //創建原始套接字
if(sock == INVALID_SOCKET)
{
cout<<"創建套接字失敗!"<<endl;
return 0;
}
else
{
sockaddr_in severAddr; //搜索的服務器IP
severAddr.sin_family = AF_INET;
severAddr.sin_port = htons(Port); //端口地址
severAddr.sin_addr.S_un.S_addr=serverIP; //IP地址
//判斷此端口是否打開
connect(sock, (sockaddr*)&severAddr, sizeof(severAddr));
struct fd_set write; //寫socket集合
FD_ZERO(&write);
FD_SET(sock, &write);
struct timeval timeout; //超時
timeout.tv_sec = 100/1000;
timeout.tv_usec = 0;
//設置超時時間
if(select (0,NULL,&write,NULL,&timeout) > 0)
{
cout<<Port<<endl;
}
closesocket(sock); //關閉socket
}
InterlockedDecrement(aa); //進程數-1
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -