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协议规定,网络数据流应采用大端字节序,即低地址高字节。接收主机如果是小端字节序的,要做字节序的转换。

  1. #include <arpa/inet.h>
  2. uint32_t htonl(uint32_t hostlong);
  3. uint16_t htons(uint16_t hostshort);
⑵字符串转换成整型数。
  1. #include <stdlib.h>
  2. int atoi(const char *nptr);
⑶点分十进制的IP转换成长整数型数
  1. #include <arpa/inet.h>
  2. in_addr_t inet_addr(const char *cp);
⑷获取端口服务
  1. struct servent
  2. {
  3. char *s_name;//这个服务的名称
  4. char **s_aliases;//这个服务可能的别名
  5. int s_port;//这个服务可能的端口
  6. char *s_proto;//这个服务可能使用的协议
  7. };
  8. struct servent *getservbyport(int port,char *proto);
⑸获取时间
  1. struct timeval
  2. {
  3. time_t tv_sec; //秒
  4. long tv_usec;//微秒
  5. };
  6. int gettimeofday(struct timeval *tv, struct timezone *tz)
⑹初始化函数
  1. void *memset(void *s, int ch, size_t n);

作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。

代码实现

  1. #include <stdio.h>
  2. #include <netdb.h>
  3. #include <signal.h>
  4. #include <unistd.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <arpa/inet.h>
  8. #include <netinet/in.h>
  9. #include <sys/time.h>
  10. #include <sys/socket.h>
  11. void u_alarm_handler() {
  12. }
  13. int main(int argc, char *argv[]) {
  14. /*
  15. struct sockaddr_in {
  16. sa_family_t sin_family; //address family: AF_INET
  17. in_port_t sin_port; //port in network byte order
  18. struct in_addr sin_addr; //internet address
  19. char sin_zero[8]; //不使用,一般用0填充
  20. };
  21. //Internet address.
  22. struct in_addr {
  23. uint32_t s_addr; //address in network byte order
  24. };
  25. */
  26. struct sockaddr_in locaaddr, servaddr;
  27. //获取服务
  28. struct servent *serv;
  29. //计时
  30. struct timeval start;
  31. struct timeval end;
  32. float diff = 0;
  33. int sfd, count = 0, ret = 0;
  34. int currentport, startport, endport;
  35. /*
  36. memset(&locaaddr, 0, sizeof(struct sockaddr_in)); //每个字节都用0填充
  37. locaaddr.sin_family = AF_INET; //使用IPv4地址
  38. locaaddr.sin_addr.s_addr = htonl(INADDR_ANY); //inet_addr("127.0.0.1")
  39. locaaddr.sin_port = htons(56666);
  40. */
  41. //int atoi(const char *nptr);
  42. //功能是把字符串转换成整型数
  43. startport = atoi(argv[2]);
  44. endport = atoi(argv[3]);
  45. if(startport<1 || endport>65535 || endport<startport) {
  46. printf("端口范围出错\n");
  47. return 0;
  48. }
  49. gettimeofday(&start, NULL);
  50. printf(" PORT STATE SERVICE\n");
  51. for(currentport = startport; currentport <= endport; currentport++) {
  52. if( (sfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ) {
  53. printf("Socket Create Failed!\n");
  54. }
  55. memset(&servaddr, 0, sizeof(struct sockaddr_in));
  56. servaddr.sin_family = AF_INET;
  57. //in_addr_t inet_addr(const char* strptr);
  58. //功能是将一个点分十进制的IP转换成一个长整数型数
  59. servaddr.sin_addr.s_addr = inet_addr(argv[1]);
  60. //uint16_t htons(uint16_t hostshort);
  61. //功能是将一个无符号短整型数值转换为网络字节序
  62. servaddr.sin_port = htons(currentport);
  63. serv = getservbyport(servaddr.sin_port, "tcp");
  64. sigset (SIGALRM, u_alarm_handler);
  65. alarm(1);
  66. ret = connect(sfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
  67. alarm(0);
  68. sigrelse(SIGALRM);
  69. if(ret == 0) {
  70. if (serv != NULL)
  71. printf("%5d Opened\t %s\n", currentport, serv->s_name);
  72. else
  73. printf("%5d Opened\t Unknown\n", currentport);
  74. }
  75. else
  76. count++;
  77. close(sfd);
  78. }
  79. printf("Not shown: %d closed ports\n", count);
  80. gettimeofday(&end, NULL);
  81. diff = 1000000 * (end.tv_sec - start.tv_sec) + (end.tv_usec - start.tv_usec);
  82. printf("Total time: %.2f seconds\n", diff/1000000);
  83. return 0;
  84. }

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. s21day13 python笔记

    s21day13 python笔记 一.装饰器 目的:在不改变原函数内部代码的基础上,在函数执行之前和之后自动执行某个功能 应用场景:想要为函数扩展功能时,可以选择用装饰器 装饰器基本格式: def ...

  2. Hadoop_CDH安装

    ——本文非个人原创,为大牛同事整理,发布于此以备忘 1     CDH5.8安装(2018年4月19日) 1.1   物理服务器注意事项 (1)把raid都去掉了,每个物理盘都用raid0创建一个虚拟 ...

  3. 在LINUX(Ubuntu 18.04.x、CentOS)下配置MySQL8.0.x

    安装教程:Installing MySQL on Unix/Linux Using Generic Binaries MySQL下载链接:https://dev.mysql.com/downloads ...

  4. js数组遍历方法总结

    数组遍历方法 1.for循环 使用临时变量,将长度缓存起来,避免重复获取数组长度,当数组较大时优化效果才会比较明显. 1 2 3 for(j = 0,len=arr.length; j < le ...

  5. web过滤器

    Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 ht ...

  6. JavaScript基础之对象属性的检测和枚举

    属性检测 对象作为属性的集合,属性又包括自有属性和继承属性: 检测方法: \__   in运算符: \__ var obj = { x:1 } console.log( 'toString' in o ...

  7. SQL Sever 2012版本数据库的完全安装流程

    首先安装SQL Sever 2012数据库,我们要下载好安装包.将安装包存储在磁盘中. 安装前将杀毒软件和相关安全的软件等退出,以免造成安装中的错误. 安装环境:Win7 64位操作系统 注:SQL ...

  8. Linux内核笔记:内存管理

    逻辑地址由16位segment selector和offset组成 根据segment selector到GDT或LDT中去查找segment descriptor 32位base,20位limit, ...

  9. Java小代码

    1. public class test1 {public static void main(String[] args) { Person P = new Person("gdsgds&q ...

  10. http://blog.csdn.net/u012905422/article/details/53340260

    轉自:http://blog.csdn.net/u012905422/article/details/53340260 对于python2.7版本,很多教程(如http://stackoverflow ...