日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于tcp connect的端口扫描程序

發布時間:2023/12/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于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; }
較為可惜的是因為時間原因沒有實現多線程同時觀察多個套接字。

總結

以上是生活随笔為你收集整理的基于tcp connect的端口扫描程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。