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 ...
随机推荐
- Linux防火墙开启关闭查询
1.centos7防火墙 命令含义: –zone #作用域 –add-port=80/tcp #添加端口,格式为:端口/通讯协议 –permanent #永久生效,没有此参数重启后失效 服务与端口的启 ...
- 剑指offer7~10题
斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 思路:此题用递归会超内存,故直接循环. 代码: class Solution { pub ...
- [Java Web学习]Spring MVC使用普通类对象,声明的对象为null
由于对Spring还不熟悉,目前还处于学习阶段,因此经常会遇到一些小白问题,这个问题需要在Spring文件中将普通对象注入bean,然后在MVC中添加set方法,填充普通对象.
- 学习笔记CB007:分词、命名实体识别、词性标注、句法分析树
中文分词把文本切分成词语,还可以反过来,把该拼一起的词再拼到一起,找到命名实体. 概率图模型条件随机场适用观测值条件下决定随机变量有有限个取值情况.给定观察序列X,某个特定标记序列Y概率,指数函数 e ...
- 谷歌chrome浏览器vue调试工具vue-devtools的安装
先导 vue-devtools是一款基于chrome浏览器的插件,用于vue应用的调试,这款vue调试神器可以极大地提高我们的调试效率.帮助我们快速的调试开发vue应用. 第一步: 我们可以先从git ...
- Movist for Mac(高清媒体播放器)v2.0.7中文特别版
Movist for Mac中文破解版是目前Mac平台上最好用的视频播放器,功能强大简单好用.movist mac版拥有美观简洁的用户界面,提供多种功能,支持视频解码加速高品质的字幕,全屏幕浏览,是与 ...
- c# 纯代码调用 webservice
public static class RequestHelper { public class RequestResult { public RequestResult(bool requestRe ...
- Git 概念
Git 概念 一.Git 工作流程 ~ Workspace:工作区 ~ Index/ Stage:暂存区 ~ Repository:仓库区(或本地仓库) ~ Remote:远程仓库 工作区 进行开发改 ...
- redux源码解读(一)
redux 的源码虽然代码量并不多(除去注释大概300行吧).但是,因为函数式编程的思想在里面体现得淋漓尽致,理解起来并不太容易,所以准备使用三篇文章来分析. 第一篇,主要研究 redux 的核心思想 ...
- 提示-bash: telnet: command not found的解决方法
Linux centos 运行telnet命令,出现下面的错误提示: [root@localhost ~]# telnet 127.0.0.1 9501 -bash: telnet: command ...