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 的端口扫描程序的更多相关文章

  1. python 端口扫描程序

    #! /usr/bin/env python3 #-*- coding:utf-8 -*- import socket import threading OPEN_COUNT = 0 lock = t ...

  2. kali linux之端口扫描

    端口对应网络服务及应用端程序,服务端程序的漏洞通过端口攻入 发现开放的端口,有更具体的攻击面 nmap hping3 scapy都可以 nmap隐蔽扫描 扫描抓包 nmap僵尸扫描 先发现僵尸机,僵尸 ...

  3. linux——nmap端口扫描命令

    先安装 nmap :apt-get install nmap 端口扫描命令nmap -sS 172.16.55.100nmap -Pn 172.16.55.100第一组渗透测试指令,用于情报收集. 要 ...

  4. 基于python的端口扫描

    前言 端口扫描是指某些别有用心的人发送一组端口扫描消息,试图以此侵入某台计算机,并了解其提供的计算机网络服务类型(这些网络服务均与端口号相关).端口扫描是计算机解密高手喜欢的一种方式.攻击者可以通过它 ...

  5. 基于FPGA的按键扫描程序

    最近在学习FPGA,就试着写了个按键扫描的程序.虽说有过基于单片机的按键扫描处理经验,对于按键的处理还是有一些概念.但是单片机程序的编写通常都采用C写,也有用汇编,而FPGA却是采用VHDL或者Ver ...

  6. 端口扫描程序nmap使用手册

        其实还是建议看英文的man,对以后学习其他东西很有帮助的:) 摘要 nmap是一个网络探测和安全扫描程序,系统管理者和个人可以使用这个软件扫描大型的网络,获取那台主机正在运行以及提供什么服务等 ...

  7. c++ 端口扫描程序

    第一.原理 端口扫描的原理很简单,就是建立socket通信,切换不通端口,通过connect函数,如果成功则代表端口开发者,否则端口关闭. 所有需要多socket程序熟悉,本内容是在window环境下 ...

  8. 基于Linux C的socketEthereal程序和Package分析 (一个)

     执行测试平台:CentOS 6.5发行版,内核版本号3.11 1. Linux抓包源程序 在OSI七层模型中.网卡工作在物理层和数据链路层的MAC子层. 进行网络通信时.源主机通过socket( ...

  9. mac、linux 查看端口占用程序

    lsof -i:80 列出占用 80 端口的程序 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 672 ruby 42u IPv4 ...

随机推荐

  1. ArcMap复制粘贴问题

    ArcMap 10.2能进行复制,但是不能进行粘贴的问题: 前几天用朋友的ArcMap10.2时,偶然发现在编辑数据的时候,需要在不同的shp层之间操作,往往有时候可以复制,但是粘贴那一项是灰色的,经 ...

  2. Django_ORM相关操作

    一般的操作 1.all():查询所有的结果 2.filter():包含与所有筛选条件匹配的对象 3.get():返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果对象没有或者超过一个会报错 4 ...

  3. javascript的加减乘除结果会有误差,在两个浮点数相加的时候会比较明显。以下函数返回较为精确的计算结果

    加法函数(返回值:arg1加arg2的精确结果  ) function accAdd (arg1, arg2) { var r1, r2, m, c try { r1 = arg1.toString( ...

  4. TableLaout

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  5. MySQL Workbench 创建数据库,添加新表,添加字段

    建立数据库 第一步: 第二步: 第三步: 如图弹出弹框,继续点击Apply按钮,最后点击Finish按钮完成数据库的建立 创建表与添加字段 双击!!!  一下刚刚建立好的数据库,然后再创建表,不然会出 ...

  6. kafka消息机制

    https://www.infoq.cn/article/kafka-analysis-part-1 https://www.infoq.cn/article/kafka-analysis-part- ...

  7. POJ1037 A decorative fence

    题意 Language:Default A decorative fence Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 84 ...

  8. Intel汇编指令格式解析

    环境: win7_x64旗舰版.VS2015企业版 一.Intel保护模式.实地址模式和虚拟8086模式指令格式(x86) 图在Intel手册2.1章节 1.1)Instruction Prefixe ...

  9. day05-数据类型与操作

  10. Java高级特性 第8节 网络编程技术

    一.网络概述 1.网络的概念和分类 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设 ...