📄 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 + -