#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define maxthread 100 //最大线程数
#define scanspeed 20 //主线程等待时间
DWORD WINAPI scan(LPVOID lp);
void usage(){
printf("/n/n----------------------------------------");
printf("/n code by jsufcz -- jsufcz@21xcn.net");
printf("/n usage:scan ip port1 port2");
printf("/n----------------------------------------/n/n");
}
void checkerror(int code,char *msg){
if(code==-1){
printf("/n%s error:%d",msg,GetLastError());
exit(-1);
}
}
typedef struct{
char ip[20];
int port;
}infor;
int threadcount;
int findcount;
void main(int argc,char *argv[]){
WSADATA wsa;
infor infor1={0};
int ret;
int nowport;
int min,max;
HANDLE h;
if(argc!=4){
usage();
exit(-1);
}
ret=WSAStartup(0x0202,&wsa);
checkerror(ret,"wsastartup()");
min=atoi(argv[2]);
max=atoi(argv[3]);
strcpy(infor1.ip,argv[1]);
threadcount=0;
findcount=0;
for(nowport=min;nowport<=max;nowport++){
infor1.port=nowport;
if(threadcount>=maxthread) Sleep(1000);
h=CreateThread(NULL,NULL,scan,&infor1,NULL,NULL);
if(h==NULL){
printf("/ncreatethread error!");
WaitForSingleObject(h,INFINITE);
}
Sleep(scanspeed);
}
printf("/n/nscan end! find portcount:%d",findcount);
WSACleanup();
}
DWORD WINAPI scan(LPVOID lp){
struct sockaddr_in sin;
SOCKET sock;
infor *lpinfor=(infor*)lp;
int ntime;
int ret;
threadcount++;
sock=socket(AF_INET,SOCK_STREAM,0);
checkerror(sock,"socket()");
ntime=1000;
ret=setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char*)&ntime,sizeof(ntime));
checkerror(ret,"so_sndtimeo");
memset(&sin,0,sizeof(sin));
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=inet_addr(lpinfor->ip);
sin.sin_port=htons(lpinfor->port);
ret=connect(sock,(struct sockaddr*)&sin,sizeof(sin));
if(!ret){
findcount++;
printf("/nhost %s -> %d",(char*)inet_ntoa(sin.sin_addr),ntohs(sin.sin_port));
}
closesocket(sock);
threadcount--;
return 0;
}
在VC6。0下编译通过。