基于tcp connect的端口掃描程序

原理:connect()函數用于對于每一個感興趣的目標計算機的端口進行連接,如果該端口處于偵聽狀態,那么connect()就會成功,即沒有提供服務。如果對于每一個目標端口以串行的方式使用單獨的connect()調用,需要較長的時間,我們可以通過使用非阻塞I/O設置一個較低的時間周期或者同時觀察多個套接字來提高掃描速度。
這個程序實現的是掃描局域網中其他主機的IP并輸出主機名和對應主機開啟的端口,我獲取局域網中其他主機的地址的方法是通過讀取ARP緩存表,這樣好像有點偷懶的嫌疑,哈哈。

環境:kali linux+gcc 6.xx

#include<stdio.h>
#include<sys/socket.h>
#include<errno.h>
#include<ctype.h>
#include<netinet/in.h>
#include<netdb.h>
#include<string.h>
#include<arpa/inet.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<fcntl.h>#define MAX 65535
#define THREAD_NUM 50typedef struct IP_Message{int MinPort;int MaxPort;struct in_addr ip;
}IP_Message;void *scan(void *arg){IP_Message *IP_M;char ipaddress[36];int i;int net;int err;struct hostent *host;struct sockaddr_in sa;int ret;fd_set wset;fd_set rset;int sel;//se:lectint flags;int get;//getsockoptint error=0;socklen_t len=sizeof(error);struct timeval tval;tval.tv_sec=1;tval.tv_usec=0;IP_M=arg;memset(&sa,0,sizeof(struct sockaddr_in));sa.sin_family=AF_INET;sa.sin_addr.s_addr=IP_M->ip.s_addr;for(i=1;i<1025;i++){sa.sin_port=htons(i);if((net=socket(AF_INET,SOCK_STREAM,0))<0){perror("\nsocket");exit(2);}flags=fcntl(net,F_GETFL,0);//鑾峰彇鏂囦歡鐨刦lags鍊?fcntl(net,F_SETFL,flags|O_NONBLOCK);//璁劇疆鎴愰潪闃誨妯″紡ret=connect(net,(struct sockaddr*)&sa,sizeof(sa));if(ret==0){printf("%s   %-5d\n",inet_ntoa(sa.sin_addr),i);close(net);}else{if(errno==EINPROGRESS){FD_ZERO(&wset);FD_ZERO(&rset);FD_SET(net,&wset);FD_SET(net,&rset);sel=select(net+1,&rset,&wset,NULL,&tval);if(sel<=0||sel==2){close(net);}else if(sel==1&&FD_ISSET(net,&wset)){printf("%s   %-5d Opened!\n",inet_ntoa(sa.sin_addr),i);close(net);}else{close(net);}}}}
}void mul_scan(char *arg){int i;struct hostent *he;printf("%s :",arg);pthread_t worker_tid;IP_Message IP;IP.ip.s_addr=inet_addr(arg);he=gethostbyaddr((char *)&IP.ip.s_addr,sizeof(struct in_addr),AF_INET);if(he!=NULL)printf("%s\n",he->h_name);	elseprintf("\n");if(pthread_create(&worker_tid,NULL,scan,(void *)&IP)!=0){perror("create:");exit(1);}pthread_join(worker_tid,NULL);
}int main(){char ip[16];char buffer[100];FILE *fp;fp=fopen("/proc/net/arp","r");if(!fp){perror("fp");exit(2);}fgets(buffer,100,fp);while(!feof(fp)){fgets(ip,16,fp);if(feof(fp))break;mul_scan(ip);fgets(buffer,100,fp);}fclose(fp);return 0;
}

較為可惜的是因為時間原因沒有實現多線程同時觀察多個套接字。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375982.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375982.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375982.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UIScrollView

一、UIScrollView 1.常見屬性 property(nonatomic) CGPoint contentOffset; // 記錄UIScrollView滾動的位置 property(nonatomic) CGSize contentSize; // 內容尺寸&#xff08;能滾動的范圍&#xff09; property(nonatomic) UIEdgeInsets contentInset; // 額外增加的滾動區域…

linux如何運行多個硬盤,一個硬盤如何裝兩個Linux

1個硬盤已安裝Fedora 8 Linux系統&#xff0c;并安裝grub引導管理程序&#xff0c;現要在這個硬盤的空閑分區中安裝Fedora 9&#xff0c;操作如下&#xff1a;1.將Fedora-9-i386-DVD.iso文件放到一個Windows Fat32分區((hd0,4))的根目錄&#xff0c;將這個iso文件中的isolinux目…

APIO2015 醬油記

Day 0 昨天CTSC才比完&#xff0c;當然是要浪啦&#xff01; 于是浪了一天。。。午飯都沒吃。。。 晚飯。。。貌似也沒吃。。。 晚上的時候覺得這樣子浪不太好&#xff0c;還是要認真一下&#xff0c;打開bzoj&#xff0c;棄療了。。。還是浪吧。。。 Day 1 今天要講課&#xf…

宏定義 #define 和常量 const 的區別

學習筆記&#xff01;參考鏈接 一、類型和安全檢查不同宏定義是字符替換&#xff0c;沒有數據類型的區別&#xff0c;同時這種替換沒有類型安全檢查&#xff0c;可能產生邊際效應等錯誤&#xff1b;const常量是常量的聲明&#xff0c;有類型區別&#xff0c;需要在編譯階段進行…

【ibus】設置ibus輸入法(pinyin sunpinyin)

設置ibus-pinyin 在終端中運行 /usr/lib/ibus-pinyin/ibus-setup-pinyin命令可以調出ibus的完整設置對話框 設置ibus-sunpinyin 可以執行ibus-sunpinyin自帶的python設置腳本ibus-setup-sunpinyin來全面設置它 : $ /usr/lib/ibus-sunpinyin/ibus-setup-sunpinyin 如果執行此腳…

linux 進程 釋放內存,Linux 釋放內存方法和原理

今天驚愕地發現&#xff0c;主節點上8G內存被不知道什么進程吃掉了整整6G有余&#xff0c;正常的計算快要維持不下去了&#xff0c;遂處理之。先看看內存使用狀況[rootnode1 ~]# free -mtotal used free shared buffers cachedMem: 8004 6557 1446 0 163 5630-/ buffers/cache:…

玩轉Win32開發(2):完整的開發流程

上一篇中我給各位說了一般人認為C中較為難的東西——指針。其實對于C&#xff0c;難點當然不局限在指針這玩意兒上&#xff0c;還有一些有趣的概念&#xff0c;如模板類、虛基類、純虛函數等&#xff0c;這些都是概念性的東西&#xff0c;幾乎每一本C書上都會介紹&#xff0c;而…

c++函數傳參:值傳遞、指針傳遞、引用傳遞

1、將變量名作為實參和形參&#xff1a; 這時傳給形參的是變量的值&#xff0c;傳遞是單向的。如果在執行函數期間形參的值發生變化&#xff0c;并不傳回實參。應為在調用函數時&#xff0c;形參和實參不是同一個存儲單元。 2、傳遞變量的指針&#xff1a; 形參是指針變量&a…

贊!帶進度條的 jQuery 文件拖放上傳插件

jQuery File Uploader 是一個 jQuery 文件拖放上傳插件&#xff0c;包括 Ajax 上傳和進度條效果。作者編寫這個插件的想法是要保持它非常簡單&#xff0c;不像其他的插件&#xff0c;很多的標記&#xff0c;并提供一些 Hack 的方式使之兼容那些古老的瀏覽器。jQuery File Uploa…

linux系統有幾個系統盤,linux操作系統的分區有哪些種類?各分區主要作用是什么?...

滿意答案Linux下一切都是文件&#xff0c;不存在分區的概念&#xff0c;在Linux下說的分區只是磁盤管理和數據組織的需要。Linux使用標準的目錄結構&#xff0c;在安裝的時候&#xff0c;安裝程序就已經為用戶創建了文件系統和完整而固定的目錄組成形式&#xff0c;并指定了每個…

::范圍解析運算符

學習筆記&#xff1a;參考鏈接 ::是范圍解析運算符&#xff0c;或者稱為域區分符&#xff0c;用來指明一個函數或一個數據屬于哪一個類。 ::也可以不跟類名&#xff0c;表示全局函數或者全局數據 eg: #include<iostream> using namespace std;int month;//全局變量 i…

渴望

有些時候 還是會覺得很孤獨 因為自己總是一個人 一個人吃飯 一個人學習 一個人生活 心情難免會低落 很想有一個人 可以一直陪伴在自己身邊 一起吃飯 一起學習 一起看潮起潮落 以為自己足夠堅強 可以耐得住很多孤獨 卻總還是會 感覺lonely 很多時候很羨慕 那些大學里的小情侶 雖…

linux中可以安裝不同版本的gcc么,在linux下安裝多個版本的GCC

文章鏈接&#xff1a;http://blog.csdn.net/chid/article/details/6251781很是有用&#xff0c;轉載學習1.查看當前linux版本內核版本&#xff1a;cat /proc/version或者&#xff1a;uname -a2.查看gcc的版本gcc -v或者&#xff1a;gcc --version或者&#xff1a;查看當前安裝的…

Python中如何讀取xml的數據

<?xml version"1.0" encoding"utf-8" ?> - <catalog><maxid>4</maxid> - <login username"pytest" passwd"123456"><caption>Python</caption> - <item id"4"><ca…

C++中private成員變量和protect成員變量的區別

保護成員和私有成員很相似&#xff0c;但是就是在子類中&#xff0c;保護成員可以訪問&#xff0c;而私有成員不能被訪問&#xff0c;也就是說子類中的函數&#xff0c;可以訪問父類中的保護成員變量&#xff0c;而不能訪問私有成員變量&#xff0c;要想訪問父類中的私有成員變…

Linux下C語言串口應用編程,Linux下串口C語言編程

Linux下串口C語言編程 (5頁)本資源提供全文預覽&#xff0c;點擊全文預覽即可全文預覽,如果喜歡文檔就下載吧&#xff0c;查找使用更方便哦&#xff01;9.9 積分串口操作代碼#include #include #include #include #include #include #include #include #include #define BUFFER…

順序查找 折半查找

順序查找 算法描述 順序比較即可。 平均查找長度 (n1)/2, 其中n為表長。 時間復雜度 O(n) #include "stdio.h" typedef struct student{int id; /*學生編號*/char name[10]; /*…

linux c實現一個簡單的sniffer

參考陳兵老師的《網絡安全》一書 環境&#xff1a;kali linuxgcc 6.xx 具體的實現原理是&#xff0c;先將自己的網卡設置為混雜模式&#xff0c;然后從特殊的套接字中讀取以太網幀&#xff0c;對讀取的以太幀進行篩選、去報頭。得到我們想要的數據。 #include<stdio.h>…

Java12題:發獎金問題

題目&#xff1a;企業發放的獎金根據利潤提成。利潤(I)低于或等于10萬元時&#xff0c;獎金可提10%&#xff1b;利潤高于10萬元&#xff0c;低于20萬元時&#xff0c;低于10萬元的部分按10%提成&#xff0c;高于10萬元的部分&#xff0c;可可提成7.5%&#xff1b;20萬到40萬之間…

Linux第一條指令地址,arm-linux 啟動代碼分析——stage1 (1)

本文針對arm linux, 從kernel的第一條指令開始分析,一直分析到進入start_kernel()函數.我們當前以linux-2.6.19內核版本作為范例來分析,本文中所有的代碼,前面都會加上行號以便于和源碼進行對照.例:在文件init/main.c中:00478: asmlinkage void __init start_kernel(void)前面的…