多线程编程实例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; }