C 语言实现基于 Linux 的端口扫描程序
Socket 常用函数:
⑴int socket(int protofamily, int type, int protocol);
- protofamily:即协议域,又称为协议族(family)。常用的协议族有,AF_INET(IPV4)、AF_INET6(IPV6)、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
- type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等
- protocol:指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议
⑵int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- ①sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识一个socket。
- ②addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同。
- ③addrlen:对应的是地址的长度。
⑶int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
⑷int close(int fd);
使用到的函数:
⑴网络字节序和主机字节序的转换。
TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节。接收主机如果是小端字节序的,要做字节序的转换。
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
⑵字符串转换成整型数。
#include <stdlib.h>
int atoi(const char *nptr);
⑶点分十进制的IP转换成长整数型数
#include <arpa/inet.h>
in_addr_t inet_addr(const char *cp);
⑷获取端口服务
struct servent
{
char *s_name;//这个服务的名称
char **s_aliases;//这个服务可能的别名
int s_port;//这个服务可能的端口
char *s_proto;//这个服务可能使用的协议
};
struct servent *getservbyport(int port,char *proto);
⑸获取时间
struct timeval
{
time_t tv_sec; //秒
long tv_usec;//微秒
};
int gettimeofday(struct timeval *tv, struct timezone *tz)
⑹初始化函数
void *memset(void *s, int ch, size_t n);
作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
代码实现
#include <stdio.h>
#include <netdb.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <sys/socket.h>
void u_alarm_handler() {
}
int main(int argc, char *argv[]) {
/*
struct sockaddr_in {
sa_family_t sin_family; //address family: AF_INET
in_port_t sin_port; //port in network byte order
struct in_addr sin_addr; //internet address
char sin_zero[8]; //不使用,一般用0填充
};
//Internet address.
struct in_addr {
uint32_t s_addr; //address in network byte order
};
*/
struct sockaddr_in locaaddr, servaddr;
//获取服务
struct servent *serv;
//计时
struct timeval start;
struct timeval end;
float diff = 0;
int sfd, count = 0, ret = 0;
int currentport, startport, endport;
/*
memset(&locaaddr, 0, sizeof(struct sockaddr_in)); //每个字节都用0填充
locaaddr.sin_family = AF_INET; //使用IPv4地址
locaaddr.sin_addr.s_addr = htonl(INADDR_ANY); //inet_addr("127.0.0.1")
locaaddr.sin_port = htons(56666);
*/
//int atoi(const char *nptr);
//功能是把字符串转换成整型数
startport = atoi(argv[2]);
endport = atoi(argv[3]);
if(startport<1 || endport>65535 || endport<startport) {
printf("端口范围出错\n");
return 0;
}
gettimeofday(&start, NULL);
printf(" PORT STATE SERVICE\n");
for(currentport = startport; currentport <= endport; currentport++) {
if( (sfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ) {
printf("Socket Create Failed!\n");
}
memset(&servaddr, 0, sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
//in_addr_t inet_addr(const char* strptr);
//功能是将一个点分十进制的IP转换成一个长整数型数
servaddr.sin_addr.s_addr = inet_addr(argv[1]);
//uint16_t htons(uint16_t hostshort);
//功能是将一个无符号短整型数值转换为网络字节序
servaddr.sin_port = htons(currentport);
serv = getservbyport(servaddr.sin_port, "tcp");
sigset (SIGALRM, u_alarm_handler);
alarm(1);
ret = connect(sfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
alarm(0);
sigrelse(SIGALRM);
if(ret == 0) {
if (serv != NULL)
printf("%5d Opened\t %s\n", currentport, serv->s_name);
else
printf("%5d Opened\t Unknown\n", currentport);
}
else
count++;
close(sfd);
}
printf("Not shown: %d closed ports\n", count);
gettimeofday(&end, NULL);
diff = 1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
printf("Total time: %.2f seconds\n", diff/1000000);
return 0;
}
C 语言实现基于 Linux 的端口扫描程序的更多相关文章
- python 端口扫描程序
#! /usr/bin/env python3 #-*- coding:utf-8 -*- import socket import threading OPEN_COUNT = 0 lock = t ...
- kali linux之端口扫描
端口对应网络服务及应用端程序,服务端程序的漏洞通过端口攻入 发现开放的端口,有更具体的攻击面 nmap hping3 scapy都可以 nmap隐蔽扫描 扫描抓包 nmap僵尸扫描 先发现僵尸机,僵尸 ...
- linux——nmap端口扫描命令
先安装 nmap :apt-get install nmap 端口扫描命令nmap -sS 172.16.55.100nmap -Pn 172.16.55.100第一组渗透测试指令,用于情报收集. 要 ...
- 基于python的端口扫描
前言 端口扫描是指某些别有用心的人发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关).端口扫描是计算机解密高手喜欢的一种方式.攻击者可以通过它 ...
- 基于FPGA的按键扫描程序
最近在学习FPGA,就试着写了个按键扫描的程序.虽说有过基于单片机的按键扫描处理经验,对于按键的处理还是有一些概念.但是单片机程序的编写通常都采用C写,也有用汇编,而FPGA却是采用VHDL或者Ver ...
- 端口扫描程序nmap使用手册
其实还是建议看英文的man,对以后学习其他东西很有帮助的:) 摘要 nmap是一个网络探测和安全扫描程序,系统管理者和个人可以使用这个软件扫描大型的网络,获取那台主机正在运行以及提供什么服务等 ...
- c++ 端口扫描程序
第一.原理 端口扫描的原理很简单,就是建立socket通信,切换不通端口,通过connect函数,如果成功则代表端口开发者,否则端口关闭. 所有需要多socket程序熟悉,本内容是在window环境下 ...
- 基于Linux C的socketEthereal程序和Package分析 (一个)
执行测试平台:CentOS 6.5发行版,内核版本号3.11 1. Linux抓包源程序 在OSI七层模型中.网卡工作在物理层和数据链路层的MAC子层. 进行网络通信时.源主机通过socket( ...
- mac、linux 查看端口占用程序
lsof -i:80 列出占用 80 端口的程序 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 672 ruby 42u IPv4 ...
随机推荐
- switch_case注意事项
1.switch 语句有至少一个 case 代码块和一个可选的 default 代码块. 这里的 switch 从第一个 case 分支比较 a 的值,值为 3 匹配失败.然后比较 4.匹配,所以从 ...
- sku
以淘宝为例,sku是具体到某一个商家具体规格商品,比如某商家红色64g的iPhone6,sku对应有对应的价格和库存.而SPU就是我们在输入框里输入的iPhone6,它是多个商家的集合.淘宝的“宝贝” ...
- 2018.5.11 B树总结
小结 B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于 走右结点: B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键 字范围的子结点: 所有关键字在整颗 ...
- Cisco Packet Tracer7.1 rip协议实验
设备: 路由器:三个1941:router0,router1,router2; 终端用户:二个PC-PT:PC0,PC1; 网络配置: 网络 设备 接口 IP 设备 接口 IP 192.168.0.0 ...
- js实现复制内容到粘贴板
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- ARM Cortex M0 程序映像和启动流程
- Oracle—通过操作系统进程查看数据库sql语句
工作中遇到一个问题,某报表运行时间特别长,通过操作系统可以看到一个oracle进程消耗资源比较大,如何能够通过该操作系统进程找到具体SQL呢.记录如下: 1.查看Linux系统进程号 可以通过top动 ...
- 计算机图形学----基于3D图形开发技术 (韩正贤 著)
第1章 游戏模型 第2章 顶点处理机制 第3章 光栅化操作 第4章 片元处理和输出合并 第5章 光照和着色 第6章 参数曲线和表面 第7章 着色器模型 第8章 图像纹理 第9章 凹凸贴图 第10章 高 ...
- neo4j通过LOAD CSV导入结点和关系
1.neo4j默认的导入入口是:安装路径/import,所以要将csv文件放在import目录下,像下面这样: 2.导入后中文乱码: 因为neo4j是utf-8的,而CSV默认保存是ANSI的,需要用 ...
- js中使用showModelDialog中下载文件的时候,闪一下后无法下载
在js中使用showModelDialog中下载文件的时候,会因为showModelDialog自动设置target为_self导致下载文件“只会闪一下”就消失掉 在吧target设置为_blank后 ...