££includestdio.h££includeWINSOCK2.H#defineMAXBUFF8192#defineICMP_UNREACH_PORT3#defineICMP_UNREACH4enum{CMD_NAME,DST_IP,START_PORT,LAST_PORT};structip{unsignedintip_v:4;//ipversionunsignedintip_hl:4;//lengthofheadunsignedcharip_tos;unsignedshortip_len;//totallengthunsignedshortip_id;unsignedshortip_flags;unsignedshortip_off;unsignedcharip_ttl;//timetoliveunsignedcharip_protocol;//protocalunsignedshortip_sum;structin_addr{union{struct{u_chars_b1,s_b2,s_b3,s_b4;}S_un_b;struct{u_shorts_w1,s_w2;}S_un_w;u_longS_addr;}S_un;#defines_addrS_un.S_addr#defines_hostS_un.S_un.s_b2#defines_netS_un.S_un.s_b1#defines_impS_un.S_un.s_w2#defines_impnoS_un.S_un.s_b4#defines_lhS_un.S_un.s_b3};structin_addrip_src,ip_dst;//sourceanddestaddress#defineIP_RF0x8000//reservedfragmentflag#defineIP_DF0x4000//dontfragmentflag#defineIP_MF0x2000//morefragmentsflag#defineIP_OFFMASK0x1fff//maskforfragmentingbits};structicmp{unsignedshortinticmp_type;unsignedshortinticmp_code;unsignedlonginticmp_cksum;unsignedlonginticmp_id;unsignedlonginticmp_seq;unsignedshortinticmp_data[1];};/*structicmp{u_int8_ticmp_type:8;//typeu_int8_ticmp_code:8;//codeu_int16_ticmp_cksum;union{u_charih_pptr;structin_addrih_gwaddr;structih_idseq{u_int16_ticd_id;u_int16_ticd_seq;}ih_idseq;u_int32_tih_void;//ICMP_UNREACH_NEEDFRAG--PathMTUDiscovery(RFC1191)structih_pmtu{u_int16_tipm_void;u_int16_tipm_nextmtu;}ih_pmtu;structih_rtradv{u_int8_tirt_num_addrs;u_int8_tirt_wpa;u_int16_tirt_lifetime;}ih_rtradv;}icmp_hun;#defineicmp_pptricmp_hun.ih_pptr#defineicmp_gwaddricmp_hun.ih_gwaddr#defineicmp_idicmp_hun.ih_idseq.icd_id#defineicmp_seqicmp_hun.ih_idseq.icd_seq#defineicmp_voidicmp_hun.ih_void#defineicmp_pmvoidicmp_hun.ih_pmtu.ipm_void#defineicmp_nextmtuicmp_hun.ih_pmtu.ipm_nextmtu#defineicmp_num_addrsicmp_hun.ih_rtradv.irt_num_addrs#defineicmp_wpaicmp_hun.ih_rtradv.irt_wpa#defineicmp_lifetimeicmp_hun.ih_rtradv.irt_lifetimeunion{struct{u_int32_tits_otime;u_int32_tits_rtime;u_int32_tits_ttime;}id_ts;struct{structipidi_ip;//optionsandthen64bitsofdata}id_ip;//structicmp_ra_addrid_radv;u_int32_tid_mask;u_int8_tid_data[1];}icmp_dun;#defineicmp_otimeicmp_dun.id_ts.its_otime#defineicmp_rtimeicmp_dun.id_ts.its_rtime#defineicmp_ttimeicmp_dun.id_ts.its_ttime#defineicmp_ipicmp_dun.id_ip.idi_ip#defineicmp_radvicmp_dun.id_radv#defineicmp_maskicmp_dun.id_mask#defineicmp_dataicmp_dun.id_data};*/intmain(intargc,char*argv[]){structtimevaltv;fd_setselect_fd;charbuff[MAXBUFF];intdstport,startport,endport;if(argc!=4){fprintf(stdout,usage:%sdst_ipstart_portlast_port\n,argv[CMD_NAME]);exit(EXIT_FAILURE);}WSADatawsaData;WSAStartup(WINSOCK_VERSION,&wsaData);structsockaddr_insend_sa;//·¢ËͶ˵ØÖ·memset(&send_sa,0,sizeof(send_sa));send_sa.sin_family=AF_INET;send_sa.sin_addr.s_addr=inet_addr(argv[DST_IP]);startport=atoi(argv[START_PORT]);endport=atoi(argv[LAST_PORT]);SOCKETsock_send=socket(AF_INET,SOCK_DGRAM,0);//·¢ËÍÃèÊö·ûif(sock_send0){perror(sock(SOCK_DGRAM));closesocket(sock_send);exit(EXIT_FAILURE);}SOCKETsock_recv=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);//½ÓÊÕÃèÊö·ûif(sock_recv0){perror(socket(SOCK_RAW));closesocket(sock_recv);exit(EXIT_FAILURE);}for(dstport=startport;dstport=endport;dstport++){printf(ScanningPort%d\r,dstport);fflush(stdout);send_sa.sin_port=htons(dstport);intres=sendto(sock_send,NULL,0,0,(structsockaddr*)&send_sa,sizeof(send_sa));tv.tv_sec=1;tv.tv_usec=0;while(1){FD_ZERO(&select_fd);FD_SET(sock_recv,&select_fd);if(select(sock_recv+1,&select_fd,NULL,NULL,&tv)0){structip*ip;structicmp*icmp;inthlen;intport;memset(&ip,0,sizeof(ip));if(recvfrom(sock_recv,buff,MAXBUFF,0,NULL,NULL)!=56)continue;ip=(structip*)buff;hlen=ip-ip_hl2;/*hlen=2;ip-ip_hl=hlen2;printf(ip_v:%c%d,ip-ip_v,ip-ip_v);printf(ip_hl:%c%d,ip-ip_hl,ip-ip_hl);printf(ip_tos:%c%d,ip-ip_tos,ip-ip_tos);printf(ip_len:%c%d,ip-ip_len,ip-ip_len);printf(ip_ttl:%c%d\n,ip-ip_ttl,ip-ip_ttl);*/icmp=(structicmp*)(buff+hlen);port=ntohs(*(u_short*)(buff+20+8+20+2));if((ip-ip_src.s_addr!=send_sa.sin_addr.s_addr)||(icmp-icmp_type!=ICMP_UNREACH)||(icmp-icmp_code!=ICMP_UNREACH_PORT)||(port!=dstport))continue;}else{structservent*se;se=getservbyport(htons(dstport),udp);if(se!=NULL)printf(%5d%-20s\n,dstport,(se==NULL)?unknown:se-s_name);//printf(%5d%-20s\n,dstport,(se==NULL)?:se-s_name);}//endifbreak;}//endwhile}//endforclosesocket(sock_send);closesocket(sock_recv);WSACleanup();return(0);}