当前位置: 首页 > article >正文

Linux网络操作命令与函数全面总结

c8a09c625b002bfc04605dc407775605.jpeg

1. 引言

Linux作为服务器和开发平台,网络操作是其核心功能之一。本文旨在全面总结Linux系统中的网络操作方法,包括命令行工具和编程接口,帮助读者深入理解Linux网络管理的机制。

2. 命令行工具

2.1 ping 命令

ping 命令用于测试网络连接和延迟。

  • 基本使用ping [选项] 目标IP或域名
  • 常用选项
    • -c:指定发送报文的次数

2.2 ifconfig 或 ip 命令

ifconfig(较老版本)和 ip 命令用于配置和显示网络接口参数。

  • ip 基本使用
    • 显示接口:ip link show
    • 启用接口:ip link set dev 接口名 up
    • 配置IP:ip addr add IP地址/子网掩码 dev 接口名

2.3 netstat 或 ss 命令

netstat(较老版本)和 ss 命令用于显示网络连接、路由表、接口统计等网络信息。

  • ss 基本使用
    • 显示所有连接:ss -a
    • 显示监听端口:ss -l

2.4 traceroute 或 tracepath 命令

traceroute(较老版本)和 tracepath 命令用于跟踪数据包到达目的地的路径。

  • traceroute 基本使用traceroute [选项] 目标IP或域名
  • tracepath 基本使用tracepath 目标IP或域名

2.5 arp 命令

arp 命令用于操作系统的ARP缓存,显示或修改地址解析协议缓存。

  • 基本使用arp [选项]
  • 常用选项
    • -a:显示ARP缓存表

3. 编程接口

3.1 套接字编程

3.1.1 socket() 函数

socket() 函数用于创建套接字。

  • 函数原型int socket(int domain, int type, int protocol);
  • 示例代码
    #include <sys/socket.h>
    
    int main() {
        int sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd < 0) {
            perror("Error creating socket");
            return 1;
        }
        close(sockfd);
        return 0;
    }
    

3.1.2 bind() 函数

bind() 函数用于绑定套接字到地址和端口。

  • 函数原型int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • 示例代码
    #include <sys/socket.h>
    #include <netinet/in.h>
    
    int main() {
        int sockfd = socket(AF_INET, SOCK_STREAM, 0);
        struct sockaddr_in serv_addr;
        serv_addr.sin_family = AF_INET;
        serv_addr.sin_addr.s_addr = INADDR_ANY;
        serv_addr.sin_port = htons(8080);
    
        if (bind(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {
            perror("Error binding");
            return 1;
        }
        close(sockfd);
        return 0;
    }
    

3.1.3 listen() 和 accept() 函数

listen() 函数用于监听套接字上的连接,而 accept() 函数用于接受连接。

  • 函数原型
    • int listen(int sockfd, int backlog);
    • int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • 示例代码
    #include <sys/socket.h>
    #include <netinet/in.h>
    
    int main() {
        int sockfd = socket(AF_INET, SOCK_STREAM, 0);
        // 绑定套接字...
        listen(sockfd, 5);
        int newsockfd = accept(sockfd, NULL, NULL);
        if (newsockfd < 0) {
            perror("Error accepting");
            return 1;
        }
        close(newsockfd);
        close(sockfd);
        return 0;
    }
    

3.2 网络信息API

3.2.1 getaddrinfo() 函数

getaddrinfo() 函数用于获取与主机名或IP地址相关的网络信息。

  • 函数原型
    int getaddrinfo(const char *node, const char *service,
                    const struct addrinfo *hints,
                    struct addrinfo **res);
    
  • 示例代码
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <stdio.h>
    
    int main() {
        struct addrinfo hints, *res;
        memset(&hints, 0, sizeof hints);
        hints.ai_family = AF_UNSPEC; // AF_INET or AF_INET6
        hints.ai_socktype = SOCK_STREAM;
    
        int status = getaddrinfo("www.example.com", "80", &hints, &res);
        if (status != 0) {
            fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(status));
            return 1;
        }
    
        // 使用获取到的地址信息...
        freeaddrinfo(res);
        return 0;
    }
    

3.2.2 getnameinfo() 函数

getnameinfo() 函数用于从网络地址结构中获取主机名和服务名。

  • 函数原型
    int getnameinfo(const struct sockaddr *sa, socklen_t salen,
                    char *host, size_t hostlen,
                    char *serv, size_t servlen, int flags);
    
  • 示例代码
    #include <sys/socket.h>
    #include <netdb.h>
    #include <stdio.h>
    
    int main() {
        struct sockaddr_in sa;
        char host[NI_MAXHOST], serv[NI_MAXSERV];
    
        // 假设sa已被填充正确的地址信息
        int status = getnameinfo((struct sockaddr *)&sa, sizeof(sa),
                                 host, sizeof(host),
                                 serv, sizeof(serv),
                                 NI_NUMERICHOST | NI_NUMERICSERV);
        if (status != 0) {
            fprintf(stderr, "getnameinfo: %s\n", gai_strerror(status));
            return 1;
        }
    
        printf("Host: %s\n", host);
        printf("Service: %s\n", serv);
        return 0;
    }
    

4. 网络监控和调试工具

4.1 tcpdump 命令

tcpdump 是一个强大的命令行工具,用于捕获和分析网络流量。

  • 基本使用tcpdump [选项]
  • 常用选项
    • -i:指定网络接口
    • -nn:不解析域名和服务名
    • port:指定端口

4.2 netcat 或 nc 命令

netcat(通常简称为 nc)是一个用于读写网络连接的实用工具。

  • 基本使用nc [选项] 目标IP或域名 目标端口
  • 常用选项
    • -l:监听模式
    • -p:指定源端口

5. 总结

Linux提供了丰富的网络操作工具和编程接口,使得网络管理变得灵活而强大。从基本的网络配置和监控到复杂的套接字编程和网络信息获取,Linux都能轻松应对。了解和掌握这些工具和接口,对于Linux系统管理和开发都是非常有价值的。在实际应用中,应根据具体需求选择合适的方法。

 


http://www.kler.cn/a/329147.html

相关文章:

  • JVM垃圾回收详解(重点)
  • vue 常用特性 ( 计算属性 | 侦听器 | 过滤器 )
  • 【python】机器学习调参与自动化:使用Hyperopt优化你的模型
  • 【2】猫眼娱乐后端开发面试题整理
  • Flutter在MaterialApp中的builder初始化多个包
  • 自动化运维-检测Linux服务器CPU、内存、负载、IO读写、机房带宽和服务器类型等信息脚本
  • 机器视觉工程师一直做调试,维护岗位,想转岗软件方面C#从零开始,快则三年不到,慢则一辈子不会
  • YOLO11改进 | 检测头 | 小目标遮挡物性能提升的检测头Detect_MultiSEAM【完整代码】
  • 好玩的水表电表
  • we3.0里的钱包是什么?
  • Linux——pod的控制器
  • AR 眼镜之-蓝牙电话-来电铃声与系统音效
  • PO2GO、PO2Vec论文阅读与模型复现报告
  • 【STM32开发笔记】移植AI框架TensorFlow到STM32单片机【下篇】
  • 【环保背景高管1009】2022顶刊论文数据,环保背景高管对投资的影响探究
  • 初识算法 · 双指针(1)
  • LeetCode 面试经典150题 69.x的平方根
  • html嵌入百度地图
  • 酒店智能门锁SDK接口pro[V10] 门锁校验C#-SAAS本地化-未来之窗行业应用跨平台架构
  • 如何解决 Photoshop 中的“暂存盘已满”错误
  • 用于高频交易预测的最优输出LSTM
  • 【Nacos 架构 原理】服务发现模块之Nacos注册中心服务数据模型
  • Python 并发新境界:探索 `multiprocessing` 模块的无限可能
  • 828华为云征文|部署敏捷项目管理系统工具 ZenTao
  • Spring Boot 基础入门指南
  • c++11~c++20 内联命名空间