📄 scanuseport.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<<"输入格式错误: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 serverAddr; /*搜索的服务器IP*/
serverAddr.sin_family = AF_INET;
serverAddr.sin_port=htons(Port); /*端口地址*/
serverAddr.sin_addr.S_un.S_addr=serverIP; /*IP地址*/
/*判断此端口是否打开*/
connect(sock,(sockaddr *)&serverAddr,sizeof(serverAddr));
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 + -