基于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.mzph.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)前面的…