您的位置:首页 > 其它

通过socket对系统端口进行扫描

2017-04-28 11:34 471 查看
设计图



实现

// PortScan.cpp : 定义控制台应用程序的入口点。
//
//#include <stdafx.h>
#include <stdio.h>
#include <Winsock2.h>
#pragma comment(lib,"Ws2_32.lib")

//目标地址
#define IP "172.16.180.38"
//线程个数
#define THREADCOUNT 60
DWORD WINAPI ThreadProc(  LPVOID lpParameter);
//端口号
int PortNum=0;
//临界区变量
CRITICAL_SECTION cs;
//线程函数
DWORD WINAPI ThreadProc(  LPVOID lpParameter)
{

//创建套接字
SOCKET TryConnect;
while (1)
{
if (PortNum>65535)
{
break;
}
//进入临界区
EnterCriticalSection(&cs);
//领取任务
int tmpport=PortNum;
PortNum++;
//离开临界区
LeaveCriticalSection(&cs);

TryConnect=socket(AF_INET,SOCK_STREAM,0);
if (INVALID_SOCKET==TryConnect)
{
printf("socket");
}
//尝试连接
sockaddr_in addrMe={0};
addrMe.sin_family=AF_INET;
DWORD threadID=GetCurrentThreadId();
//printf("线程%d正在检测端口%d\n",threadID,PortNum);
addrMe.sin_port=htons(tmpport);
addrMe.sin_addr.S_un.S_addr=inet_addr(IP);
int retCon=connect(TryConnect,(sockaddr*)&addrMe,sizeof(sockaddr_in));
if (SOCKET_ERROR!=retCon)
{
printf("----------------检测到目标主机开放%d端口\n",tmpport);
}
}
return 0;
}
int main(int argc, char* argv[])
{
//初始化套接字
WSADATA ws;
::WSAStartup(MAKEWORD(2,0),&ws);

//初始化临界区
InitializeCriticalSection(&cs);

//多线程扫描
HANDLE hThread[THREADCOUNT];
for (int i=0;i<THREADCOUNT;i++)
{
hThread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc,(LPVOID)0,0,NULL);
}
WaitForMultipleObjects(THREADCOUNT,hThread,true,INFINITE);

//删除临界区
DeleteCriticalSection(&cs);

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  socket 线程