原理: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的端口扫描程序相关推荐

  1. TCP/IP网络程序编程——端口扫描程序(TCP)

    端口扫描介绍 端口扫描可以收集目的主机的提供服务端口的信息,可以对于目的主机的信息进行收集. 端口扫描的程序每次会向目的主机特定端口发送一条请求,如果请求得到回应则可以判断是否本端口在对外开放,通过这 ...

  2. python中用socket检测端口_python基于socket函数实现端口扫描

    本文实例为大家分享了python基于socket实现端口扫描的具体代码,供大家参考,具体内容如下 自学Python一段时间,写个端口扫描器练练手.有什么不足之处,请见谅 这是基于socket函数对端口 ...

  3. python 端口扫描 东京_GitHub - w2n1ck/portscan: 一个基于Python+Go的端口扫描及服务探测脚本...

    portscan 一个基于Python+Go的端口扫描及服务探测脚本 0x00 前言 近期由于公司环境整改/迭代以及历史弱口令等撞库,运维同事将内网测试环境的一些SSH等敏感端口对外,导致被挖矿团伙利 ...

  4. linux编写一个简单的端口扫描程序,小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2)...

    当前位置:我的异常网» Linux/Unix » 小弟我在linux下写了个简单的多线程端口扫描程序, 小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2) www. ...

  5. 基于TCP网络通信的自动升级程序源码分析-客户端接收文件

    升级程序客户端接收文件 /// <summary>/// 文件数据缓存 索引是 ConnectionInfo对象 数据包的顺序号 值是数据/// </summary>Dicti ...

  6. QT学习:基于TCP的网络聊天室程序

    TCP与UDP的差别如图: 一.TCP工作原理 如下图所示,TCP能够为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错 地送达网络上的其他计算机.因此,对可靠性要求高的数据通信系统往往使用 ...

  7. Kali Linux渗透测试之端口扫描(一)——UDP、TCP、隐蔽端口扫描、全连接端口扫描

    端口扫描 二.三.四层发现的目的就是发现存活的IP,在存活的IP上面,展开进一步的扫描,及端口扫描,发现存活主机上存在着哪些开放的端口,端口后面就对应着各种各样的应用程序,应用程序的漏洞都是通过端口体 ...

  8. NS3网络仿真(14): TCP连接与端口扫描

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 本节学习一下使用NS3构造一个TCP包,再利用构造好的TCP包进行最简单的TCP端口扫描. 1.  ...

  9. 端口扫描程序nmap使用详解

    1 概述 Nmap是一款网络扫描和主机检测的非常有用的工具,适用于winodws,linux,等操作系统,支持很多扫描技术,例如:UDP.TCP connect().TCP SYN(半开扫描).ftp ...

最新文章

  1. hdu 3635(并查集+路径压缩变形)
  2. Flink+Hologres亿级用户实时UV精确去重最佳实践
  3. sqlserver中select造成死锁
  4. Chrome的vimium插件的使用笔记
  5. [蓝桥杯2018初赛]递增三元组-双指针,枚举,排序,前缀和
  6. 贪心算法 -- 最小延迟调度
  7. DevExpress.XtraGrid 导出文本的bug
  8. 为什么罗氏线圈不能测直流电流?
  9. mysql gone away的几种原因
  10. oracle数据库设计思维导图,Oracle
  11. 同步下的资源互斥:停运保护(Run-Down Protection)机制
  12. 再议访问者模式 - Visitor vs Acyclic Visitor
  13. 云数据库CynosDB有哪些常见问题?
  14. 40、100 个网络基础知识普及
  15. 基于SSM微信小程序健身系统的设计与实现
  16. 武汉长江大桥(游走武汉)
  17. 前端学习框架 - 数据库
  18. DB2的数据库备份与恢复
  19. 调试器扩展SOSEX
  20. 有意义与无意义现象和怎么做。

热门文章

  1. java bundle_java.util.ResourceBundle国际化用法详解
  2. 1688学python学不会_还在害怕学不会Python嘛?这篇文章让你瞬间读懂Python入门!...
  3. 有var d = new Date(‘20xx-m-09‘),可以设置为m+1月份的操作是?
  4. matlab 无向拓扑图,无向图绘画树状拓扑图算法
  5. php 点击文本框弹出时间,点击Input框弹出日期选项
  6. https://blog.csdn.net/weixin_40412037/article/details/112235003
  7. 腾讯手游助手android版本,腾讯游戏助手下载-腾讯游戏助手 安卓版v3.3.4.22-PC6安卓网...
  8. android中可以有两个焦点吗,android – 如何通过焦点在屏幕上调整两个片段的大小?...
  9. React antd Descriptions span属性无效问题
  10. 前端基础-HTML标记语言