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. Python全站之路----常用模块----configparser模块

    config:配置    parser:解析 此模块用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser,在 python 2.x 里名字为 Co ...

  2. 1px和backgroudImage

    https://blog.csdn.net/leadn/article/details/78560786 .setTopLine(@c: #C7C7C7) { & { position: re ...

  3. 常见模块(七) re模块

    首先明白正则表达式和re模块的关系:正则:是一种规则,这种规则在任何一种语言中都严格按照此规则进行匹配.正则匹配的就是字符串,从字符串的左边往右边匹配re: re是python语言中的利用正则规则的一 ...

  4. 在Django中使用ForeignKey()报错问题的解决

    在Django2的models中建立一对多的关系使用ForeignKey(): student = models.ForeignKey("Classes") 报错: TypeErr ...

  5. JavaScript对象(第四天)

    面向对象编程中,JavaScript并不完全具备封装.继承.多态:在JavaScript中,对象是一个无序的键值对集合 封装JavaScript是具备的,将属性和方法定义到对象内部: 继承,在java ...

  6. Linux第九节课学习笔记

    fdisk可添加.删除.转换分区. 创建主分区:n-p-w:扩展分区:n-e:逻辑分区:n-l. SWAP分区专用格式化命令mkswap,专用挂载命令swapon. 磁盘容量配额中,硬限制必须,软限制 ...

  7. python的mysql小代码

    我因为懒,就想写个批量insert数据的小代码 这里是代码 # _*_ encoding:utf-8 _*_ import os import MySQLdb import numpy as np d ...

  8. 批量写入redis

    批量写入redis key := GetSeriesKey(series.Id) idNames = append(idNames, key, series.Name) == { err = Mset ...

  9. Python(三)——文件操作

    在我们用语言的过程中,比如要往文件内进行读写,那么势必要进行文件操作,那么咋操作呢?用眼睛直接看么?今天就定个小目标,把文件读写那些事扯一扯 文件操作 把大象放进冰箱分几步? 第一步:打开冰箱 第二步 ...

  10. Django学习笔记之数据库-模型的操作

    模型的操作 在ORM框架中,所有模型相关的操作,比如添加/删除等.其实都是映射到数据库中一条数据的操作.因此模型操作也就是数据库表中数据的操作. 添加模型 添加模型到数据库中.首先需要创建一个模型.创 ...