多线程编程实例2

//多线程端口扫描
#include <WinSock2.h>
#include <stdio.h>
#include <windows.h>
#include <process.h>

#pragma  comment(lib,"WS2_32")

char ip[20];

DWORD WINAPI scan(LPVOID lpParam)
{
	int prot = *(int*)lpParam;
	sockaddr_in sin;
	sin.sin_family = AF_INET;
	sin.sin_addr.S_un.S_addr = inet_addr(ip);
	SOCKET s = ::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	sin.sin_port = htons(prot);
	if (::connect(s,(sockaddr *)&sin,sizeof(sin)) == SOCKET_ERROR )
	{
		::closesocket(s);
		return 0;
	}
	else 

	{
		printf("%4d 端口打开!\n",prot);
		::closesocket(s);
		return 0;
	}
}
int main()
{
	WSADATA wsaData;
	WORD sockVersion = MAKEWORD(2,0);
	::WSAStartup(sockVersion,&wsaData);

	int i;
	HANDLE h[1000];
	DWORD dwThreadId;
	
	printf("请输入目标IP地址:");
	scanf("%s",ip);
	
	printf("...........扫描1~2000号端口(TCP)...........\n");
	for (i = 1;i<=1000;i++)
	{
		h[i-1] = CreateThread(NULL,0,scan,(LPVOID)new int(i),0,&dwThreadId);
	}
	::WaitForMultipleObjects(1000,h,FALSE,INFINITE);
	for (i = 0;i<1000;i++)
	{
		::CloseHandle(h[i]);
	}
	for (i = 1000;i<=2000;i++)
	{
		h[i-1-1000] = ::CreateThread(NULL,0,scan,(LPVOID)new int(i),0,&dwThreadId);
	}
	::WaitForMultipleObjects(1000,h,FALSE,INFINITE);
	for (i = 0;i<1000;i++)
   {
	   ::CloseHandle(h[i]);

	}
	::WSACleanup();
	printf(".....................扫描结束!............................\n");
	system("pause");
	return 0;
}

  

posted @ 2013-03-08 14:33  haihai187  阅读(132)  评论(0编辑  收藏  举报